diff options
Diffstat (limited to 'llvm/lib/Object')
-rw-r--r-- | llvm/lib/Object/ArchiveWriter.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/Object/COFFImportFile.cpp | 114 | ||||
-rw-r--r-- | llvm/lib/Object/COFFModuleDefinition.cpp | 22 | ||||
-rw-r--r-- | llvm/lib/Object/COFFObjectFile.cpp | 5 |
4 files changed, 22 insertions, 122 deletions
diff --git a/llvm/lib/Object/ArchiveWriter.cpp b/llvm/lib/Object/ArchiveWriter.cpp index b052c76d1fe..4034f9039dd 100644 --- a/llvm/lib/Object/ArchiveWriter.cpp +++ b/llvm/lib/Object/ArchiveWriter.cpp @@ -318,8 +318,7 @@ writeSymbolTable(raw_fd_ostream &Out, object::Archive::Kind Kind, continue; if (!(Symflags & object::SymbolRef::SF_Global)) continue; - if (Symflags & object::SymbolRef::SF_Undefined && - !(Symflags & object::SymbolRef::SF_Indirect)) + if (Symflags & object::SymbolRef::SF_Undefined) continue; unsigned NameOffset = NameOS.tell(); diff --git a/llvm/lib/Object/COFFImportFile.cpp b/llvm/lib/Object/COFFImportFile.cpp index 8769ec1691d..740bf94d40e 100644 --- a/llvm/lib/Object/COFFImportFile.cpp +++ b/llvm/lib/Object/COFFImportFile.cpp @@ -162,17 +162,14 @@ public: // Library Format. NewArchiveMember createShortImport(StringRef Sym, uint16_t Ordinal, ImportType Type, ImportNameType NameType); - - // Create a weak external file which is described in PE/COFF Aux Format 3. - NewArchiveMember createWeakExternal(StringRef Sym, StringRef Weak, bool Imp); }; } // namespace NewArchiveMember ObjectFactory::createImportDescriptor(std::vector<uint8_t> &Buffer) { - const uint32_t NumberOfSections = 2; - const uint32_t NumberOfSymbols = 7; - const uint32_t NumberOfRelocations = 3; + static const uint32_t NumberOfSections = 2; + static const uint32_t NumberOfSymbols = 7; + static const uint32_t NumberOfRelocations = 3; // COFF Header coff_file_header Header{ @@ -192,7 +189,7 @@ ObjectFactory::createImportDescriptor(std::vector<uint8_t> &Buffer) { append(Buffer, Header); // Section Header Table - const coff_section SectionTable[NumberOfSections] = { + static const coff_section SectionTable[NumberOfSections] = { {{'.', 'i', 'd', 'a', 't', 'a', '$', '2'}, u32(0), u32(0), @@ -222,12 +219,12 @@ ObjectFactory::createImportDescriptor(std::vector<uint8_t> &Buffer) { append(Buffer, SectionTable); // .idata$2 - const coff_import_directory_table_entry ImportDescriptor{ + static const coff_import_directory_table_entry ImportDescriptor{ u32(0), u32(0), u32(0), u32(0), u32(0), }; append(Buffer, ImportDescriptor); - const coff_relocation RelocationTable[NumberOfRelocations] = { + static const coff_relocation RelocationTable[NumberOfRelocations] = { {u32(offsetof(coff_import_directory_table_entry, NameRVA)), u32(2), u16(getImgRelRelocation(Machine))}, {u32(offsetof(coff_import_directory_table_entry, ImportLookupTableRVA)), @@ -310,8 +307,8 @@ ObjectFactory::createImportDescriptor(std::vector<uint8_t> &Buffer) { NewArchiveMember ObjectFactory::createNullImportDescriptor(std::vector<uint8_t> &Buffer) { - const uint32_t NumberOfSections = 1; - const uint32_t NumberOfSymbols = 1; + static const uint32_t NumberOfSections = 1; + static const uint32_t NumberOfSymbols = 1; // COFF Header coff_file_header Header{ @@ -328,7 +325,7 @@ ObjectFactory::createNullImportDescriptor(std::vector<uint8_t> &Buffer) { append(Buffer, Header); // Section Header Table - const coff_section SectionTable[NumberOfSections] = { + static const coff_section SectionTable[NumberOfSections] = { {{'.', 'i', 'd', 'a', 't', 'a', '$', '3'}, u32(0), u32(0), @@ -345,7 +342,7 @@ ObjectFactory::createNullImportDescriptor(std::vector<uint8_t> &Buffer) { append(Buffer, SectionTable); // .idata$3 - const coff_import_directory_table_entry ImportDescriptor{ + static const coff_import_directory_table_entry ImportDescriptor{ u32(0), u32(0), u32(0), u32(0), u32(0), }; append(Buffer, ImportDescriptor); @@ -370,8 +367,8 @@ ObjectFactory::createNullImportDescriptor(std::vector<uint8_t> &Buffer) { } NewArchiveMember ObjectFactory::createNullThunk(std::vector<uint8_t> &Buffer) { - const uint32_t NumberOfSections = 2; - const uint32_t NumberOfSymbols = 1; + static const uint32_t NumberOfSections = 2; + static const uint32_t NumberOfSymbols = 1; uint32_t VASize = is32bit(Machine) ? 4 : 8; // COFF Header @@ -391,7 +388,7 @@ NewArchiveMember ObjectFactory::createNullThunk(std::vector<uint8_t> &Buffer) { append(Buffer, Header); // Section Header Table - const coff_section SectionTable[NumberOfSections] = { + static const coff_section SectionTable[NumberOfSections] = { {{'.', 'i', 'd', 'a', 't', 'a', '$', '5'}, u32(0), u32(0), @@ -479,85 +476,6 @@ NewArchiveMember ObjectFactory::createShortImport(StringRef Sym, return {MemoryBufferRef(StringRef(Buf, Size), DLLName)}; } -NewArchiveMember ObjectFactory::createWeakExternal(StringRef Sym, - StringRef Weak, bool Imp) { - std::vector<uint8_t> Buffer; - const uint32_t NumberOfSections = 1; - const uint32_t NumberOfSymbols = 5; - - // COFF Header - coff_file_header Header{ - u16(0), - u16(NumberOfSections), - u32(0), - u32(sizeof(Header) + (NumberOfSections * sizeof(coff_section))), - u32(NumberOfSymbols), - u16(0), - u16(0), - }; - append(Buffer, Header); - - // Section Header Table - const coff_section SectionTable[NumberOfSections] = { - {{'.', 'd', 'r', 'e', 'c', 't', 'v', 'e'}, - u32(0), - u32(0), - u32(0), - u32(0), - u32(0), - u32(0), - u16(0), - u16(0), - u32(IMAGE_SCN_LNK_INFO | IMAGE_SCN_LNK_REMOVE)}}; - append(Buffer, SectionTable); - - // Symbol Table - coff_symbol16 SymbolTable[NumberOfSymbols] = { - {{{'@', 'c', 'o', 'm', 'p', '.', 'i', 'd'}}, - u32(0), - u16(0xFFFF), - u16(0), - IMAGE_SYM_CLASS_STATIC, - 0}, - {{{'@', 'f', 'e', 'a', 't', '.', '0', '0'}}, - u32(0), - u16(0xFFFF), - u16(0), - IMAGE_SYM_CLASS_STATIC, - 0}, - {{{0, 0, 0, 0, 0, 0, 0, 0}}, - u32(0), - u16(0), - u16(0), - IMAGE_SYM_CLASS_EXTERNAL, - 0}, - {{{0, 0, 0, 0, 0, 0, 0, 0}}, - u32(0), - u16(0), - u16(0), - IMAGE_SYM_CLASS_WEAK_EXTERNAL, - 1}, - {{{2, 0, 0, 0, 3, 0, 0, 0}}, u32(0), u16(0), u16(0), uint8_t(0), 0}, - }; - SymbolTable[2].Name.Offset.Offset = sizeof(uint32_t); - - //__imp_ String Table - if (Imp) { - SymbolTable[3].Name.Offset.Offset = sizeof(uint32_t) + Sym.size() + 7; - writeStringTable(Buffer, {std::string("__imp_").append(Sym), - std::string("__imp_").append(Weak)}); - } else { - SymbolTable[3].Name.Offset.Offset = sizeof(uint32_t) + Sym.size() + 1; - writeStringTable(Buffer, {Sym, Weak}); - } - append(Buffer, SymbolTable); - - // Copied here so we can still use writeStringTable - char *Buf = Alloc.Allocate<char>(Buffer.size()); - memcpy(Buf, Buffer.data(), Buffer.size()); - return {MemoryBufferRef(StringRef(Buf, Buffer.size()), DLLName)}; -} - std::error_code writeImportLibrary(StringRef DLLName, StringRef Path, ArrayRef<COFFShortExport> Exports, MachineTypes Machine) { @@ -578,12 +496,6 @@ std::error_code writeImportLibrary(StringRef DLLName, StringRef Path, if (E.Private) continue; - if (E.isWeak()) { - Members.push_back(OF.createWeakExternal(E.Name, E.ExtName, false)); - Members.push_back(OF.createWeakExternal(E.Name, E.ExtName, true)); - continue; - } - ImportType ImportType = IMPORT_CODE; if (E.Data) ImportType = IMPORT_DATA; diff --git a/llvm/lib/Object/COFFModuleDefinition.cpp b/llvm/lib/Object/COFFModuleDefinition.cpp index d6729684e20..0d69cb6b709 100644 --- a/llvm/lib/Object/COFFModuleDefinition.cpp +++ b/llvm/lib/Object/COFFModuleDefinition.cpp @@ -55,10 +55,8 @@ struct Token { StringRef Value; }; -static bool isDecorated(StringRef Sym, bool MingwDef) { - // mingw does not prepend "_". - return (!MingwDef && Sym.startswith("_")) || Sym.startswith("@") || - Sym.startswith("?"); +static bool isDecorated(StringRef Sym) { + return Sym.startswith("_") || Sym.startswith("@") || Sym.startswith("?"); } static Error createError(const Twine &Err) { @@ -85,9 +83,6 @@ public: } case '=': Buf = Buf.drop_front(); - // GNU dlltool accepts both = and ==. - if (Buf.startswith("=")) - Buf = Buf.drop_front(); return Token(Equal, "="); case ',': Buf = Buf.drop_front(); @@ -125,8 +120,7 @@ private: class Parser { public: - explicit Parser(StringRef S, MachineTypes M, bool B) - : Lex(S), Machine(M), MingwDef(B) {} + explicit Parser(StringRef S, MachineTypes M) : Lex(S), Machine(M) {} Expected<COFFModuleDefinition> parse() { do { @@ -219,9 +213,9 @@ private: } if (Machine == IMAGE_FILE_MACHINE_I386) { - if (!isDecorated(E.Name, MingwDef)) + if (!isDecorated(E.Name)) E.Name = (std::string("_").append(E.Name)); - if (!E.ExtName.empty() && !isDecorated(E.ExtName, MingwDef)) + if (!E.ExtName.empty() && !isDecorated(E.ExtName)) E.ExtName = (std::string("_").append(E.ExtName)); } @@ -314,13 +308,11 @@ private: std::vector<Token> Stack; MachineTypes Machine; COFFModuleDefinition Info; - bool MingwDef; }; Expected<COFFModuleDefinition> parseCOFFModuleDefinition(MemoryBufferRef MB, - MachineTypes Machine, - bool MingwDef) { - return Parser(MB.getBuffer(), Machine, MingwDef).parse(); + MachineTypes Machine) { + return Parser(MB.getBuffer(), Machine).parse(); } } // namespace object diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp index 0a2053477ca..1e9b0c5b045 100644 --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/lib/Object/COFFObjectFile.cpp @@ -227,11 +227,8 @@ uint32_t COFFObjectFile::getSymbolFlags(DataRefImpl Ref) const { if (Symb.isExternal() || Symb.isWeakExternal()) Result |= SymbolRef::SF_Global; - if (Symb.isWeakExternal()) { + if (Symb.isWeakExternal()) Result |= SymbolRef::SF_Weak; - // We use indirect to allow the archiver to write weak externs - Result |= SymbolRef::SF_Indirect; - } if (Symb.getSectionNumber() == COFF::IMAGE_SYM_ABSOLUTE) Result |= SymbolRef::SF_Absolute; |