mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Make the new and old front-ends more similar: now neither uses __main.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26629 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
04f9674857
commit
daac729f4d
@ -20,7 +20,7 @@ DONT_BUILD_RELINKED = 1
|
||||
LIBRARYNAME = crtend
|
||||
BYTECODE_DESTINATION = $(CFERuntimeLibDir)
|
||||
|
||||
MainSrc := crtend.c listend.ll
|
||||
MainSrc := crtend.c
|
||||
GenericEHSrc := Exception.cpp
|
||||
SJLJEHSrc := SJLJ-Exception.cpp
|
||||
|
||||
@ -29,7 +29,7 @@ EXTRA_DIST := $(MainSrc) $(GenericEHSrc) $(SJLJEHSrc) \
|
||||
|
||||
include $(LEVEL)/Makefile.common
|
||||
|
||||
MainObj := $(ObjDir)/crtend.bc $(ObjDir)/listend.bc
|
||||
MainObj := $(ObjDir)/crtend.bc
|
||||
GenericEHObj := $(ObjDir)/Exception.bc
|
||||
SJLJEHObj := $(ObjDir)/SJLJ-Exception.bc
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
This directory contains the C and C++ runtime libraries for the LLVM GCC
|
||||
front-ends. It is composed of four distinct pieces:
|
||||
|
||||
1. __main and static ctor/dtor support. This is used by both C and C++ codes.
|
||||
1. __main: now dead, but provided for compatibility.
|
||||
|
||||
2. Generic EH support routines. This is used by C/C++ programs that use
|
||||
setjmp/longjmp, and by C++ programs that make use of exceptions.
|
||||
|
@ -7,65 +7,10 @@
|
||||
*
|
||||
*===----------------------------------------------------------------------===*
|
||||
*
|
||||
* 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.
|
||||
* This file defines the __main function, which we preserve for backwards
|
||||
* compatibility.
|
||||
*
|
||||
\*===----------------------------------------------------------------------===*/
|
||||
|
||||
#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();
|
||||
|
||||
/* Recursively calling main is not legal C, but lots of people do it for
|
||||
* testing stuff. We might as well work for them.
|
||||
*/
|
||||
static _Bool Initialized = 0;
|
||||
if (Initialized) return;
|
||||
Initialized = 1;
|
||||
|
||||
/* Only register the global dtor handler if there is at least one global
|
||||
* dtor!
|
||||
*/
|
||||
if (__llvm_getGlobalDtors()[0].FP)
|
||||
if (atexit(run_destructors))
|
||||
abort(); /* Should be able to install ONE atexit handler! */
|
||||
|
||||
/* FIXME: This should sort the list by priority! */
|
||||
if (R->FP)
|
||||
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();
|
||||
}
|
||||
|
@ -1,23 +0,0 @@
|
||||
; global_ctors/global_dtors terminator: this is used to add a terminating null
|
||||
; value to the initialization list.
|
||||
|
||||
%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)
|
||||
}
|
Loading…
Reference in New Issue
Block a user