[llvm-commits] CVS: llvm/test/Libraries/crtend/Makefile crtend.c listend.ll

Chris Lattner lattner at cs.uiuc.edu
Wed May 14 08:10:01 PDT 2003


Changes in directory llvm/test/Libraries/crtend:

Makefile added (r1.1)
crtend.c added (r1.1)
listend.ll updated: 1.1 -> 1.2

---
Log message:

Initial checkin of crtend.o implementation


---
Diffs of the changes:

Index: llvm/test/Libraries/crtend/Makefile
diff -c /dev/null llvm/test/Libraries/crtend/Makefile:1.1
*** /dev/null	Wed May 14 08:09:51 2003
--- llvm/test/Libraries/crtend/Makefile	Wed May 14 08:09:41 2003
***************
*** 0 ****
--- 1,9 ----
+ LEVEL = ../../..
+ LIBNAME = crtend
+ Source = crtend.c listend.ll
+ 
+ include ../Makefile.libs
+ 
+ install:: $(DESTLIBNAME)
+ 	cp $(DESTLIBNAME) $(INSTALL_DIR)/crtend.o
+ 	rm $(INSTALL_DIR)/libcrtend.bc


Index: llvm/test/Libraries/crtend/crtend.c
diff -c /dev/null llvm/test/Libraries/crtend/crtend.c:1.1
*** /dev/null	Wed May 14 08:09:51 2003
--- llvm/test/Libraries/crtend/crtend.c	Wed May 14 08:09:41 2003
***************
*** 0 ****
--- 1,52 ----
+ /*===- crtend.c - Initialization code for programs ------------------------===*\
+  *
+  * This file defines the __main function, which is used to run static
+  * constructors and destructors in C++ programs, or with C programs that use GCC
+  * extensions to accomplish the same effect.
+  *
+  * The main data structures used to implement this functionality is the
+  * llvm.global_ctors and llvm.global_dtors lists, which are null terminated
+  * lists of TorRec (defined below) structures.
+  *
+ \*===----------------------------------------------------------------------===*/
+ 
+ #include <stdlib.h>
+ 
+ /* TorRec - The record type for each element of the ctor/dtor list */
+ typedef struct TorRec {
+   int Priority;
+   void (*FP)(void);
+ } TorRec;
+ 
+ /* __llvm_getGlobalCtors, __llvm_getGlobalDtors - Interface to the LLVM
+  * listend.ll file to get access to the start of the ctor and dtor lists...
+  */
+ TorRec *__llvm_getGlobalCtors(void);
+ TorRec *__llvm_getGlobalDtors(void);
+ 
+ static void run_destructors(void);
+ 
+ /* __main - A call to this function is automatically inserted into the top of
+  * the "main" function in the program compiled.  This function is responsible
+  * for calling static constructors before the program starts executing.
+  */
+ void __main(void) {
+   /* Loop over all of the constructor records, calling each function pointer. */
+   TorRec *R = __llvm_getGlobalCtors();
+ 
+   if (atexit(run_destructors))
+     abort();  /* Should be able to install ONE atexit handler! */
+ 
+   /* FIXME: This should sort the list by priority! */
+   for (; R->FP; ++R)
+     R->FP();
+ }
+ 
+ static void run_destructors(void) {
+   /* Loop over all of the destructor records, calling each function pointer. */
+   TorRec *R = __llvm_getGlobalDtors();
+ 
+   /* FIXME: This should sort the list by priority! */
+   for (; R->FP; ++R)
+     R->FP();
+ }


Index: llvm/test/Libraries/crtend/listend.ll
diff -u llvm/test/Libraries/crtend/listend.ll:1.1 llvm/test/Libraries/crtend/listend.ll:1.2
--- llvm/test/Libraries/crtend/listend.ll:1.1	Wed May 14 07:40:20 2003
+++ llvm/test/Libraries/crtend/listend.ll	Wed May 14 08:09:41 2003
@@ -1,5 +1,26 @@
 ; global_ctors/global_dtors terminator: this is used to add a terminating null
 ; value to the initialization list.
 
-%llvm.global_ctors = appending global [1 x { int, void ()* }] [ { int, void ()* } { int 2147483647, void ()* null } ]
-%llvm.global_ctors = appending global [1 x { int, void ()* }] [ { int, void ()* } { int 2147483647, void ()* null } ]
+target endian = little
+target pointersize = 32
+
+%struct.TorRec = type { int, void ()* }
+
+%llvm.global_ctors = appending global [1 x %struct.TorRec] [
+    %struct.TorRec { int 2147483647, void ()* null }
+  ]
+
+%llvm.global_dtors = appending global [1 x %struct.TorRec] [
+    %struct.TorRec { int 2147483647, void ()* null }
+  ]
+
+implementation
+
+%struct.TorRec* %__llvm_getGlobalCtors() {
+  ret %struct.TorRec* getelementptr ([1 x %struct.TorRec]* %llvm.global_ctors,
+                                     long 0, long 0)
+}
+%struct.TorRec* %__llvm_getGlobalDtors() {
+  ret %struct.TorRec* getelementptr ([1 x %struct.TorRec]* %llvm.global_dtors,
+                                     long 0, long 0)
+}





More information about the llvm-commits mailing list