diff options
author | Rui Ueyama <ruiu@google.com> | 2015-07-08 20:22:50 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2015-07-08 20:22:50 +0000 |
commit | 1c79ce9a4cc0aad8e95d018db56b380f7920886c (patch) | |
tree | d5e183b759b13ddf2301d6fa1e89b34091cbfbb8 | |
parent | b1f9ce8fc9645ef1b22ac67e4d2851739f5f96a3 (diff) | |
download | bcm5719-llvm-1c79ce9a4cc0aad8e95d018db56b380f7920886c.tar.gz bcm5719-llvm-1c79ce9a4cc0aad8e95d018db56b380f7920886c.zip |
COFF: Implement dllimported symbol name mangling.
Symbols exported by DLLs are listed in import library files.
Exported names may be mangled by "Import Name Type" field as
described in PE/COFF spec 7.3. This patch implements that
mangling scheme.
llvm-svn: 241719
-rw-r--r-- | lld/COFF/InputFiles.cpp | 27 | ||||
-rw-r--r-- | lld/test/COFF/Inputs/imports-mangle.lib | bin | 0 -> 2108 bytes | |||
-rw-r--r-- | lld/test/COFF/imports-mangle.test | 66 |
3 files changed, 84 insertions, 9 deletions
diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp index ac12e1e0e7a..a0211623f62 100644 --- a/lld/COFF/InputFiles.cpp +++ b/lld/COFF/InputFiles.cpp @@ -20,12 +20,9 @@ #include "llvm/Support/raw_ostream.h" #include <mutex> +using namespace llvm::COFF; using namespace llvm::object; using namespace llvm::support::endian; -using llvm::COFF::ImportHeader; -using llvm::COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE; -using llvm::COFF::IMAGE_FILE_MACHINE_AMD64; -using llvm::COFF::IMAGE_FILE_MACHINE_UNKNOWN; using llvm::RoundUpToAlignment; using llvm::sys::fs::identify_magic; using llvm::sys::fs::file_magic; @@ -260,11 +257,23 @@ std::error_code ImportFile::parse() { StringRef Name = StringAlloc.save(StringRef(Buf + sizeof(*Hdr))); StringRef ImpName = StringAlloc.save(Twine("__imp_") + Name); StringRef DLLName(Buf + sizeof(coff_import_header) + Name.size() + 1); - StringRef ExternalName = Name; - if (Hdr->getNameType() == llvm::COFF::IMPORT_ORDINAL) - ExternalName = ""; - auto *ImpSym = new (Alloc) DefinedImportData(DLLName, ImpName, ExternalName, - Hdr); + StringRef ExtName; + switch (Hdr->getNameType()) { + case IMPORT_ORDINAL: + ExtName = ""; + break; + case IMPORT_NAME: + ExtName = Name; + break; + case IMPORT_NAME_NOPREFIX: + ExtName = Name.ltrim("?@_"); + break; + case IMPORT_NAME_UNDECORATE: + ExtName = Name.ltrim("?@_"); + ExtName = ExtName.substr(0, ExtName.find('@')); + break; + } + auto *ImpSym = new (Alloc) DefinedImportData(DLLName, ImpName, ExtName, Hdr); SymbolBodies.push_back(ImpSym); // If type is function, we need to create a thunk which jump to an diff --git a/lld/test/COFF/Inputs/imports-mangle.lib b/lld/test/COFF/Inputs/imports-mangle.lib Binary files differnew file mode 100644 index 00000000000..af6e583a31b --- /dev/null +++ b/lld/test/COFF/Inputs/imports-mangle.lib diff --git a/lld/test/COFF/imports-mangle.test b/lld/test/COFF/imports-mangle.test new file mode 100644 index 00000000000..45e5699d685 --- /dev/null +++ b/lld/test/COFF/imports-mangle.test @@ -0,0 +1,66 @@ +# RUN: yaml2obj < %s > %t.obj +# RUN: lld -flavor link2 /out:%t.exe /opt:noref /entry:main \ +# RUN: %t.obj %p/Inputs/imports-mangle.lib +# RUN: llvm-readobj -coff-imports %t.exe | FileCheck %s + +# CHECK: Import { +# CHECK: Symbol: sym4 (0) +# CHECK: Symbol: sym3 (1) +# CHECK: Symbol: sym1 (2) +# CHECK: Symbol: (2) +# CHECK: } + +--- +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [] +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: 000000000000 +symbols: + - Name: .text + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 6 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 0 + Number: 0 + Selection: IMAGE_COMDAT_SELECT_ANY + - Name: main + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: sym1 + Value: 0 + SectionNumber: 0 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: sym2 + Value: 0 + SectionNumber: 0 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: _sym3 + Value: 0 + SectionNumber: 0 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: '?sym4@@YAHH@Z' + Value: 0 + SectionNumber: 0 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL +... |