[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