Don't make assumptions about the mangling of static functions in extern "C"

blocks. We still don't have consensus if we should try to change clang or
the standard, but llvm should work with compilers that implement the current
standard and mangle those functions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175267 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2013-02-15 14:08:43 +00:00
parent 74ecd214e2
commit 9fa05f98e0
2 changed files with 17 additions and 27 deletions

View File

@ -115,7 +115,7 @@ asm(
"lwz r2, 208(r1)\n" // stub's frame "lwz r2, 208(r1)\n" // stub's frame
"lwz r4, 8(r2)\n" // stub's lr "lwz r4, 8(r2)\n" // stub's lr
"li r5, 0\n" // 0 == 32 bit "li r5, 0\n" // 0 == 32 bit
"bl _PPCCompilationCallbackC\n" "bl _LLVMPPCCompilationCallback\n"
"mtctr r3\n" "mtctr r3\n"
// Restore all int arg registers // Restore all int arg registers
"lwz r10, 204(r1)\n" "lwz r9, 200(r1)\n" "lwz r10, 204(r1)\n" "lwz r9, 200(r1)\n"
@ -178,7 +178,7 @@ asm(
"lwz 5, 104(1)\n" // stub's frame "lwz 5, 104(1)\n" // stub's frame
"lwz 4, 4(5)\n" // stub's lr "lwz 4, 4(5)\n" // stub's lr
"li 5, 0\n" // 0 == 32 bit "li 5, 0\n" // 0 == 32 bit
"bl PPCCompilationCallbackC\n" "bl LLVMPPCCompilationCallback\n"
"mtctr 3\n" "mtctr 3\n"
// Restore all int arg registers // Restore all int arg registers
"lwz 10, 100(1)\n" "lwz 9, 96(1)\n" "lwz 10, 100(1)\n" "lwz 9, 96(1)\n"
@ -259,10 +259,10 @@ asm(
"ld 4, 16(5)\n" // stub's lr "ld 4, 16(5)\n" // stub's lr
"li 5, 1\n" // 1 == 64 bit "li 5, 1\n" // 1 == 64 bit
#ifdef __ELF__ #ifdef __ELF__
"bl PPCCompilationCallbackC\n" "bl LLVMPPCCompilationCallback\n"
"nop\n" "nop\n"
#else #else
"bl _PPCCompilationCallbackC\n" "bl _LLVMPPCCompilationCallback\n"
#endif #endif
"mtctr 3\n" "mtctr 3\n"
// Restore all int arg registers // Restore all int arg registers
@ -292,9 +292,9 @@ void PPC64CompilationCallback() {
#endif #endif
extern "C" { extern "C" {
static void* LLVM_ATTRIBUTE_USED PPCCompilationCallbackC(unsigned *StubCallAddrPlus4, void* LLVMPPCCompilationCallback(unsigned *StubCallAddrPlus4,
unsigned *OrigCallAddrPlus4, unsigned *OrigCallAddrPlus4,
bool is64Bit) { bool is64Bit) {
// Adjust the pointer to the address of the call instruction in the stub // Adjust the pointer to the address of the call instruction in the stub
// emitted by emitFunctionStub, rather than the instruction after it. // emitted by emitFunctionStub, rather than the instruction after it.
unsigned *StubCallAddr = StubCallAddrPlus4 - 1; unsigned *StubCallAddr = StubCallAddrPlus4 - 1;

View File

@ -79,7 +79,7 @@ static TargetJITInfo::JITCompilerFn JITCompilerFunction;
# define CFI(x) # define CFI(x)
#endif #endif
// Provide a wrapper for X86CompilationCallback2 that saves non-traditional // Provide a wrapper for LLVMX86CompilationCallback2 that saves non-traditional
// callee saved registers, for the fastcc calling convention. // callee saved registers, for the fastcc calling convention.
extern "C" { extern "C" {
#if defined(X86_64_JIT) #if defined(X86_64_JIT)
@ -131,12 +131,12 @@ extern "C" {
"subq $32, %rsp\n" "subq $32, %rsp\n"
"movq %rbp, %rcx\n" // Pass prev frame and return address "movq %rbp, %rcx\n" // Pass prev frame and return address
"movq 8(%rbp), %rdx\n" "movq 8(%rbp), %rdx\n"
"call " ASMPREFIX "X86CompilationCallback2\n" "call " ASMPREFIX "LLVMX86CompilationCallback2\n"
"addq $32, %rsp\n" "addq $32, %rsp\n"
#else #else
"movq %rbp, %rdi\n" // Pass prev frame and return address "movq %rbp, %rdi\n" // Pass prev frame and return address
"movq 8(%rbp), %rsi\n" "movq 8(%rbp), %rsi\n"
"call " ASMPREFIX "X86CompilationCallback2\n" "call " ASMPREFIX "LLVMX86CompilationCallback2\n"
#endif #endif
// Restore all XMM arg registers // Restore all XMM arg registers
"movaps 112(%rsp), %xmm7\n" "movaps 112(%rsp), %xmm7\n"
@ -213,7 +213,7 @@ extern "C" {
"movl 4(%ebp), %eax\n" // Pass prev frame and return address "movl 4(%ebp), %eax\n" // Pass prev frame and return address
"movl %eax, 4(%esp)\n" "movl %eax, 4(%esp)\n"
"movl %ebp, (%esp)\n" "movl %ebp, (%esp)\n"
"call " ASMPREFIX "X86CompilationCallback2\n" "call " ASMPREFIX "LLVMX86CompilationCallback2\n"
"movl %ebp, %esp\n" // Restore ESP "movl %ebp, %esp\n" // Restore ESP
CFI(".cfi_def_cfa_register %esp\n") CFI(".cfi_def_cfa_register %esp\n")
"subl $12, %esp\n" "subl $12, %esp\n"
@ -269,7 +269,7 @@ extern "C" {
"movl 4(%ebp), %eax\n" // Pass prev frame and return address "movl 4(%ebp), %eax\n" // Pass prev frame and return address
"movl %eax, 4(%esp)\n" "movl %eax, 4(%esp)\n"
"movl %ebp, (%esp)\n" "movl %ebp, (%esp)\n"
"call " ASMPREFIX "X86CompilationCallback2\n" "call " ASMPREFIX "LLVMX86CompilationCallback2\n"
"addl $16, %esp\n" "addl $16, %esp\n"
"movaps 48(%esp), %xmm3\n" "movaps 48(%esp), %xmm3\n"
CFI(".cfi_restore %xmm3\n") CFI(".cfi_restore %xmm3\n")
@ -300,10 +300,7 @@ extern "C" {
SIZE(X86CompilationCallback_SSE) SIZE(X86CompilationCallback_SSE)
); );
# else # else
// the following function is called only from this translation unit, void LLVMX86CompilationCallback2(intptr_t *StackPtr, intptr_t RetAddr);
// unless we are under 64bit Windows with MSC, where there is
// no support for inline assembly
static void X86CompilationCallback2(intptr_t *StackPtr, intptr_t RetAddr);
_declspec(naked) void X86CompilationCallback(void) { _declspec(naked) void X86CompilationCallback(void) {
__asm { __asm {
@ -317,7 +314,7 @@ extern "C" {
mov eax, dword ptr [ebp+4] mov eax, dword ptr [ebp+4]
mov dword ptr [esp+4], eax mov dword ptr [esp+4], eax
mov dword ptr [esp], ebp mov dword ptr [esp], ebp
call X86CompilationCallback2 call LLVMX86CompilationCallback2
mov esp, ebp mov esp, ebp
sub esp, 12 sub esp, 12
pop ecx pop ecx
@ -337,19 +334,12 @@ extern "C" {
#endif #endif
} }
/// X86CompilationCallback2 - This is the target-specific function invoked by the /// This is the target-specific function invoked by the
/// function stub when we did not know the real target of a call. This function /// function stub when we did not know the real target of a call. This function
/// must locate the start of the stub or call site and pass it into the JIT /// must locate the start of the stub or call site and pass it into the JIT
/// compiler function. /// compiler function.
extern "C" { extern "C" {
#if !(defined (X86_64_JIT) && defined(_MSC_VER)) void LLVMX86CompilationCallback2(intptr_t *StackPtr, intptr_t RetAddr) {
// the following function is called only from this translation unit,
// unless we are under 64bit Windows with MSC, where there is
// no support for inline assembly
static
#endif
void LLVM_ATTRIBUTE_USED
X86CompilationCallback2(intptr_t *StackPtr, intptr_t RetAddr) {
intptr_t *RetAddrLoc = &StackPtr[1]; intptr_t *RetAddrLoc = &StackPtr[1];
// We are reading raw stack data here. Tell MemorySanitizer that it is // We are reading raw stack data here. Tell MemorySanitizer that it is
// sufficiently initialized. // sufficiently initialized.
@ -520,7 +510,7 @@ void *X86JITInfo::emitFunctionStub(const Function* F, void *Target,
// This used to use 0xCD, but that value is used by JITMemoryManager to // This used to use 0xCD, but that value is used by JITMemoryManager to
// initialize the buffer with garbage, which means it may follow a // initialize the buffer with garbage, which means it may follow a
// noreturn function call, confusing X86CompilationCallback2. PR 4929. // noreturn function call, confusing LLVMX86CompilationCallback2. PR 4929.
JCE.emitByte(0xCE); // Interrupt - Just a marker identifying the stub! JCE.emitByte(0xCE); // Interrupt - Just a marker identifying the stub!
return Result; return Result;
} }