From: Nico Rieck Date: Tue, 14 Jan 2014 11:55:40 +0000 (+0000) Subject: Handle dllexport for global aliases X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=f32b968e7f7945d733793c0ca8ea246e7b7e0b29;p=oota-llvm.git Handle dllexport for global aliases git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199205 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp index ad7d3e0fdca..e6ad2f1d0da 100644 --- a/lib/Target/X86/X86AsmPrinter.cpp +++ b/lib/Target/X86/X86AsmPrinter.cpp @@ -658,6 +658,21 @@ void X86AsmPrinter::EmitEndOfAsmFile(Module &M) { if (I->hasDLLExportStorageClass()) DLLExportedGlobals.push_back(getSymbol(I)); + for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end(); + I != E; ++I) { + const GlobalValue *GV = I; + if (!GV->hasDLLExportStorageClass()) + continue; + + while (const GlobalAlias *A = dyn_cast(GV)) + GV = A->getAliasedGlobal(); + + if (isa(GV)) + DLLExportedFns.push_back(getSymbol(I)); + else if (isa(GV)) + DLLExportedGlobals.push_back(getSymbol(I)); + } + // Output linker support code for dllexported globals on windows. if (!DLLExportedGlobals.empty() || !DLLExportedFns.empty()) { const TargetLoweringObjectFileCOFF &TLOFCOFF = diff --git a/test/CodeGen/X86/dllexport-x86_64.ll b/test/CodeGen/X86/dllexport-x86_64.ll index 6bf73aa5366..1fadfec2543 100644 --- a/test/CodeGen/X86/dllexport-x86_64.ll +++ b/test/CodeGen/X86/dllexport-x86_64.ll @@ -56,6 +56,23 @@ define weak_odr dllexport void @weak1() { @WeakVar2 = weak_odr dllexport unnamed_addr constant i32 1 +; CHECK: .globl alias +; CHECK: alias = notExported +@alias = dllexport alias void()* @notExported + +; CHECK: .globl alias2 +; CHECK: alias2 = f1 +@alias2 = dllexport alias void()* @f1 + +; CHECK: .globl alias3 +; CHECK: alias3 = alias +@alias3 = dllexport alias void()* @alias + +; CHECK: .weak weak_alias +; CHECK: weak_alias = f1 +@weak_alias = dllexport alias weak_odr void()* @f1 + + ; CHECK: .section .drectve ; WIN32: /EXPORT:Var1,DATA ; WIN32: /EXPORT:Var2,DATA @@ -67,6 +84,10 @@ define weak_odr dllexport void @weak1() { ; WIN32: /EXPORT:lnk1 ; WIN32: /EXPORT:lnk2 ; WIN32: /EXPORT:weak1 +; WIN32: /EXPORT:alias +; WIN32: /EXPORT:alias2 +; WIN32: /EXPORT:alias3 +; WIN32: /EXPORT:weak_alias ; MINGW: -export:Var1,data ; MINGW: -export:Var2,data ; MINGW: -export:Var3,data @@ -77,3 +98,7 @@ define weak_odr dllexport void @weak1() { ; MINGW: -export:lnk1 ; MINGW: -export:lnk2 ; MINGW: -export:weak1 +; MINGW: -export:alias +; MINGW: -export:alias2 +; MINGW: -export:alias3 +; MINGW: -export:weak_alias diff --git a/test/CodeGen/X86/dllexport.ll b/test/CodeGen/X86/dllexport.ll index 1d992125976..7f0dadb6a2e 100644 --- a/test/CodeGen/X86/dllexport.ll +++ b/test/CodeGen/X86/dllexport.ll @@ -71,6 +71,23 @@ define weak_odr dllexport void @weak1() { @WeakVar2 = weak_odr dllexport unnamed_addr constant i32 1 +; CHECK: .globl _alias +; CHECK: _alias = _notExported +@alias = dllexport alias void()* @notExported + +; CHECK: .globl _alias2 +; CHECK: _alias2 = _f1 +@alias2 = dllexport alias void()* @f1 + +; CHECK: .globl _alias3 +; CHECK: _alias3 = _alias +@alias3 = dllexport alias void()* @alias + +; CHECK: .weak _weak_alias +; CHECK: _weak_alias = _f1 +@weak_alias = dllexport alias weak_odr void()* @f1 + + ; CHECK: .section .drectve ; WIN32: /EXPORT:_Var1,DATA ; WIN32: /EXPORT:_Var2,DATA @@ -85,6 +102,10 @@ define weak_odr dllexport void @weak1() { ; WIN32: /EXPORT:_lnk1 ; WIN32: /EXPORT:_lnk2 ; WIN32: /EXPORT:_weak1 +; WIN32: /EXPORT:_alias +; WIN32: /EXPORT:_alias2 +; WIN32: /EXPORT:_alias3 +; WIN32: /EXPORT:_weak_alias ; MINGW: -export:_Var1,data ; MINGW: -export:_Var2,data ; MINGW: -export:_Var3,data @@ -98,3 +119,7 @@ define weak_odr dllexport void @weak1() { ; MINGW: -export:_lnk1 ; MINGW: -export:_lnk2 ; MINGW: -export:_weak1 +; MINGW: -export:_alias +; MINGW: -export:_alias2 +; MINGW: -export:_alias3 +; MINGW: -export:_weak_alias