diff options
| author | Peter Collingbourne <peter@pcc.me.uk> | 2015-06-18 05:22:15 +0000 |
|---|---|---|
| committer | Peter Collingbourne <peter@pcc.me.uk> | 2015-06-18 05:22:15 +0000 |
| commit | 8b2492f2a0e0b143c4c4f17765901e568af92e68 (patch) | |
| tree | e6dec2ef8f794200c97db3ec75e962295501cf16 | |
| parent | ae7fa78e919010d6b522b1c99882362b291dc668 (diff) | |
| download | bcm5719-llvm-8b2492f2a0e0b143c4c4f17765901e568af92e68.tar.gz bcm5719-llvm-8b2492f2a0e0b143c4c4f17765901e568af92e68.zip | |
COFF: Implement DLL symbol exports for bitcode files.
Differential Revision: http://reviews.llvm.org/D10530
llvm-svn: 239994
| -rw-r--r-- | lld/COFF/InputFiles.cpp | 8 | ||||
| -rw-r--r-- | lld/test/COFF/Inputs/export.ll | 18 | ||||
| -rw-r--r-- | lld/test/COFF/dll.test | 16 |
3 files changed, 42 insertions, 0 deletions
diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp index c012236bb88..b0a13fbd814 100644 --- a/lld/COFF/InputFiles.cpp +++ b/lld/COFF/InputFiles.cpp @@ -269,6 +269,14 @@ std::error_code BitcodeFile::parse() { bool Replaceable = (SymbolDef == LTO_SYMBOL_DEFINITION_TENTATIVE || (Attrs & LTO_SYMBOL_COMDAT)); SymbolBodies.push_back(new (Alloc) DefinedBitcode(SymName, Replaceable)); + + const llvm::GlobalValue *GV = M->getSymbolGV(I); + if (GV && GV->hasDLLExportStorageClass()) { + Directives += " /export:"; + Directives += SymName; + if (!GV->getValueType()->isFunctionTy()) + Directives += ",data"; + } } } diff --git a/lld/test/COFF/Inputs/export.ll b/lld/test/COFF/Inputs/export.ll new file mode 100644 index 00000000000..d254683cdd6 --- /dev/null +++ b/lld/test/COFF/Inputs/export.ll @@ -0,0 +1,18 @@ +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-windows-msvc" + +define void @_DllMainCRTStartup() { + ret void +} + +define void @exportfn1() { + ret void +} + +define void @exportfn2() { + ret void +} + +define dllexport void @exportfn3() { + ret void +} diff --git a/lld/test/COFF/dll.test b/lld/test/COFF/dll.test index 75ecaf5b391..70962a3c2bc 100644 --- a/lld/test/COFF/dll.test +++ b/lld/test/COFF/dll.test @@ -10,10 +10,26 @@ EXPORT: Ordinal RVA Name EXPORT-NEXT: 0 0 EXPORT-NEXT: 1 0x1008 exportfn1 EXPORT-NEXT: 2 0x1010 exportfn2 +EXPORT-NEXT: 3 0x1010 exportfn3 + +# RUN: llvm-as -o %t.lto.obj %p/Inputs/export.ll +# RUN: lld -flavor link2 /out:%t.lto.dll /dll %t.lto.obj /export:exportfn1 /export:exportfn2 +# RUN: llvm-objdump -p %t.lto.dll | FileCheck -check-prefix=EXPORT-LTO %s + +EXPORT-LTO: Export Table: +EXPORT-LTO: DLL name: dll.test.tmp.lto.dll +EXPORT-LTO: Ordinal RVA Name +EXPORT-LTO-NEXT: 0 0 +EXPORT-LTO-NEXT: 1 0x1010 exportfn1 +EXPORT-LTO-NEXT: 2 0x1020 exportfn2 +EXPORT-LTO-NEXT: 3 0x1030 exportfn3 # RUN: yaml2obj < %p/Inputs/import.yaml > %t2.obj # RUN: lld -flavor link2 /out:%t2.exe %t2.obj %t.lib # RUN: llvm-readobj -coff-imports %t2.exe | FileCheck -check-prefix=IMPORT %s +# RUN: lld -flavor link2 /out:%t2.lto.exe %t2.obj %t.lto.lib +# RUN: llvm-readobj -coff-imports %t2.lto.exe | FileCheck -check-prefix=IMPORT %s + IMPORT: Symbol: exportfn1 IMPORT: Symbol: exportfn2 |

