From: Rui Ueyama Date: Tue, 28 Jul 2015 22:56:02 +0000 (+0000) Subject: COFF: _tls_used is __tls_used on x86. X-Git-Tag: studio-1.4~1338 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=506f6d1ae1015667077a56d5a112ae509c2228ed;p=platform%2Fupstream%2Fllvm.git COFF: _tls_used is __tls_used on x86. llvm-svn: 243495 --- diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp index d12c052..b476f69 100644 --- a/lld/COFF/SymbolTable.cpp +++ b/lld/COFF/SymbolTable.cpp @@ -274,6 +274,12 @@ Symbol *SymbolTable::find(StringRef Name) { return It->second; } +Symbol *SymbolTable::findUnderscore(StringRef Name) { + if (Config->Machine == I386) + return find(("_" + Name).str()); + return find(Name); +} + StringRef SymbolTable::findByPrefix(StringRef Prefix) { for (auto Pair : Symtab) { StringRef Name = Pair.first; diff --git a/lld/COFF/SymbolTable.h b/lld/COFF/SymbolTable.h index 479dce6..b465e50 100644 --- a/lld/COFF/SymbolTable.h +++ b/lld/COFF/SymbolTable.h @@ -56,6 +56,7 @@ public: // Returns a symbol for a given name. Returns a nullptr if not found. Symbol *find(StringRef Name); + Symbol *findUnderscore(StringRef Name); // Occasionally we have to resolve an undefined symbol to its // mangled symbol. This function tries to find a mangled name diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp index 377dd2b..aca44ea 100644 --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -520,13 +520,13 @@ template void Writer::writeHeader() { Dir[EXCEPTION_TABLE].RelativeVirtualAddress = Sec->getRVA(); Dir[EXCEPTION_TABLE].Size = Sec->getVirtualSize(); } - if (Symbol *Sym = Symtab->find("_tls_used")) { + if (Symbol *Sym = Symtab->findUnderscore("_tls_used")) { if (Defined *B = dyn_cast(Sym->Body)) { Dir[TLS_TABLE].RelativeVirtualAddress = B->getRVA(); Dir[TLS_TABLE].Size = 40; } } - if (Symbol *Sym = Symtab->find("__load_config_used")) { + if (Symbol *Sym = Symtab->findUnderscore("_load_config_used")) { if (Defined *B = dyn_cast(Sym->Body)) { Dir[LOAD_CONFIG_TABLE].RelativeVirtualAddress = B->getRVA(); Dir[LOAD_CONFIG_TABLE].Size = 64; diff --git a/lld/test/COFF/tls32.test b/lld/test/COFF/tls32.test new file mode 100644 index 0000000..74bb7a8 --- /dev/null +++ b/lld/test/COFF/tls32.test @@ -0,0 +1,43 @@ +# RUN: yaml2obj < %s > %t.obj +# RUN: lld -flavor link2 /out:%t.exe /entry:main %t.obj +# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s + +# CHECK: TLSTableRVA: 0x1000 +# CHECK: TLSTableSize: 0x28 + +--- +header: + Machine: IMAGE_FILE_MACHINE_I386 + Characteristics: [] +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: 00000000 +symbols: + - Name: .text + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 4 + 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: __tls_used + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_FUNCTION + StorageClass: IMAGE_SYM_CLASS_EXTERNAL +...