summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Object
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Object')
-rw-r--r--llvm/lib/Object/ArchiveWriter.cpp3
-rw-r--r--llvm/lib/Object/COFFImportFile.cpp114
-rw-r--r--llvm/lib/Object/COFFModuleDefinition.cpp22
-rw-r--r--llvm/lib/Object/COFFObjectFile.cpp5
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;
OpenPOWER on IntegriCloud