Handle dllexport for global aliases

llvm-svn: 199219
This commit is contained in:
Nico Rieck 2014-01-14 15:23:25 +00:00
parent 7157bb765e
commit c60647f0db
3 changed files with 65 additions and 0 deletions

View File

@ -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<GlobalAlias>(GV))
GV = A->getAliasedGlobal();
if (isa<Function>(GV))
DLLExportedFns.push_back(getSymbol(I));
else if (isa<GlobalVariable>(GV))
DLLExportedGlobals.push_back(getSymbol(I));
}
// Output linker support code for dllexported globals on windows.
if (!DLLExportedGlobals.empty() || !DLLExportedFns.empty()) {
const TargetLoweringObjectFileCOFF &TLOFCOFF =

View File

@ -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

View File

@ -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