COFF: Use short identifiers. NFC.

llvm-svn: 243229
This commit is contained in:
Rui Ueyama 2015-07-25 21:54:50 +00:00
parent 5c437cd1e9
commit 5e706b3ee3
12 changed files with 56 additions and 60 deletions

View File

@ -126,14 +126,14 @@ void SectionChunk::writeTo(uint8_t *Buf) {
SymbolBody *Body = File->getSymbolBody(Rel.SymbolTableIndex)->repl(); SymbolBody *Body = File->getSymbolBody(Rel.SymbolTableIndex)->repl();
uint64_t S = cast<Defined>(Body)->getRVA(); uint64_t S = cast<Defined>(Body)->getRVA();
uint64_t P = RVA + Rel.VirtualAddress; uint64_t P = RVA + Rel.VirtualAddress;
switch (Config->MachineType) { switch (Config->Machine) {
case IMAGE_FILE_MACHINE_AMD64: case AMD64:
applyRelX64(Off, Rel.Type, S, P); applyRelX64(Off, Rel.Type, S, P);
break; break;
case IMAGE_FILE_MACHINE_I386: case I386:
applyRelX86(Off, Rel.Type, S, P); applyRelX86(Off, Rel.Type, S, P);
break; break;
case IMAGE_FILE_MACHINE_ARMNT: case ARMNT:
applyRelARM(Off, Rel.Type, S, P); applyRelARM(Off, Rel.Type, S, P);
break; break;
default: default:
@ -150,16 +150,16 @@ void SectionChunk::addAssociative(SectionChunk *Child) {
} }
static uint8_t getBaserelType(const coff_relocation &Rel) { static uint8_t getBaserelType(const coff_relocation &Rel) {
switch (Config->MachineType) { switch (Config->Machine) {
case IMAGE_FILE_MACHINE_AMD64: case AMD64:
if (Rel.Type == IMAGE_REL_AMD64_ADDR64) if (Rel.Type == IMAGE_REL_AMD64_ADDR64)
return IMAGE_REL_BASED_DIR64; return IMAGE_REL_BASED_DIR64;
return IMAGE_REL_BASED_ABSOLUTE; return IMAGE_REL_BASED_ABSOLUTE;
case IMAGE_FILE_MACHINE_I386: case I386:
if (Rel.Type == IMAGE_REL_I386_DIR32) if (Rel.Type == IMAGE_REL_I386_DIR32)
return IMAGE_REL_BASED_HIGHLOW; return IMAGE_REL_BASED_HIGHLOW;
return IMAGE_REL_BASED_ABSOLUTE; return IMAGE_REL_BASED_ABSOLUTE;
case IMAGE_FILE_MACHINE_ARMNT: case ARMNT:
if (Rel.Type == IMAGE_REL_ARM_ADDR32) if (Rel.Type == IMAGE_REL_ARM_ADDR32)
return IMAGE_REL_BASED_HIGHLOW; return IMAGE_REL_BASED_HIGHLOW;
if (Rel.Type == IMAGE_REL_ARM_MOV32T) if (Rel.Type == IMAGE_REL_ARM_MOV32T)
@ -293,8 +293,7 @@ void StringChunk::writeTo(uint8_t *Buf) {
ImportThunkChunkX64::ImportThunkChunkX64(Defined *S) : ImpSymbol(S) { ImportThunkChunkX64::ImportThunkChunkX64(Defined *S) : ImpSymbol(S) {
// Intel Optimization Manual says that all branch targets // Intel Optimization Manual says that all branch targets
// should be 16-byte aligned. MSVC linker does this too. // should be 16-byte aligned. MSVC linker does this too.
if (Config->MachineType == AMD64) Align = 16;
Align = 16;
} }
void ImportThunkChunkX64::writeTo(uint8_t *Buf) { void ImportThunkChunkX64::writeTo(uint8_t *Buf) {
@ -368,10 +367,10 @@ void BaserelChunk::writeTo(uint8_t *Buf) {
} }
uint8_t Baserel::getDefaultType() { uint8_t Baserel::getDefaultType() {
switch (Config->MachineType) { switch (Config->Machine) {
case IMAGE_FILE_MACHINE_AMD64: case AMD64:
return IMAGE_REL_BASED_DIR64; return IMAGE_REL_BASED_DIR64;
case IMAGE_FILE_MACHINE_I386: case I386:
return IMAGE_REL_BASED_HIGHLOW; return IMAGE_REL_BASED_HIGHLOW;
default: default:
llvm_unreachable("unknown machine type"); llvm_unreachable("unknown machine type");

View File

@ -20,8 +20,6 @@
namespace lld { namespace lld {
namespace coff { namespace coff {
using llvm::COFF::IMAGE_FILE_MACHINE_AMD64;
using llvm::COFF::IMAGE_FILE_MACHINE_I386;
using llvm::COFF::IMAGE_FILE_MACHINE_UNKNOWN; using llvm::COFF::IMAGE_FILE_MACHINE_UNKNOWN;
using llvm::COFF::WindowsSubsystem; using llvm::COFF::WindowsSubsystem;
using llvm::StringRef; using llvm::StringRef;
@ -54,9 +52,9 @@ struct Export {
// Global configuration. // Global configuration.
struct Configuration { struct Configuration {
enum ManifestKind { SideBySide, Embed, No }; enum ManifestKind { SideBySide, Embed, No };
bool is64() { return MachineType == IMAGE_FILE_MACHINE_AMD64; } bool is64() { return Machine == AMD64; }
llvm::COFF::MachineTypes MachineType = IMAGE_FILE_MACHINE_UNKNOWN; llvm::COFF::MachineTypes Machine = IMAGE_FILE_MACHINE_UNKNOWN;
bool Verbose = false; bool Verbose = false;
WindowsSubsystem Subsystem = llvm::COFF::IMAGE_SUBSYSTEM_UNKNOWN; WindowsSubsystem Subsystem = llvm::COFF::IMAGE_SUBSYSTEM_UNKNOWN;
Undefined *Entry = nullptr; Undefined *Entry = nullptr;

View File

@ -426,7 +426,7 @@ void DelayLoadContents::create(Defined *H) {
} }
Chunk *DelayLoadContents::newThunkChunk(DefinedImportData *S, Chunk *Dir) { Chunk *DelayLoadContents::newThunkChunk(DefinedImportData *S, Chunk *Dir) {
switch (Config->MachineType) { switch (Config->Machine) {
case AMD64: case AMD64:
return new ThunkChunkX64(S, Dir, Helper); return new ThunkChunkX64(S, Dir, Helper);
case I386: case I386:

View File

@ -108,7 +108,7 @@ LinkerDriver::parseDirectives(StringRef S) {
ErrorOr<Export> E = parseExport(Arg->getValue()); ErrorOr<Export> E = parseExport(Arg->getValue());
if (auto EC = E.getError()) if (auto EC = E.getError())
return EC; return EC;
if (Config->MachineType == I386 && E->ExtName.startswith("_")) if (Config->Machine == I386 && E->ExtName.startswith("_"))
E->ExtName = E->ExtName.substr(1); E->ExtName = E->ExtName.substr(1);
Config->Exports.push_back(E.get()); Config->Exports.push_back(E.get());
break; break;
@ -211,8 +211,8 @@ Undefined *LinkerDriver::addUndefined(StringRef Name) {
// Symbol names are mangled by appending "_" prefix on x86. // Symbol names are mangled by appending "_" prefix on x86.
StringRef LinkerDriver::mangle(StringRef Sym) { StringRef LinkerDriver::mangle(StringRef Sym) {
assert(Config->MachineType != IMAGE_FILE_MACHINE_UNKNOWN); assert(Config->Machine != IMAGE_FILE_MACHINE_UNKNOWN);
if (Config->MachineType == IMAGE_FILE_MACHINE_I386) if (Config->Machine == I386)
return Alloc.save("_" + Sym); return Alloc.save("_" + Sym);
return Sym; return Sym;
} }
@ -335,7 +335,7 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
ErrorOr<MachineTypes> MTOrErr = getMachineType(Arg->getValue()); ErrorOr<MachineTypes> MTOrErr = getMachineType(Arg->getValue());
if (MTOrErr.getError()) if (MTOrErr.getError())
return false; return false;
Config->MachineType = MTOrErr.get(); Config->Machine = MTOrErr.get();
} }
// Handle /nodefaultlib:<filename> // Handle /nodefaultlib:<filename>
@ -529,20 +529,20 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
MachineTypes MT = File->getMachineType(); MachineTypes MT = File->getMachineType();
if (MT == IMAGE_FILE_MACHINE_UNKNOWN) if (MT == IMAGE_FILE_MACHINE_UNKNOWN)
continue; continue;
if (Config->MachineType == IMAGE_FILE_MACHINE_UNKNOWN) { if (Config->Machine == IMAGE_FILE_MACHINE_UNKNOWN) {
Config->MachineType = MT; Config->Machine = MT;
continue; continue;
} }
if (Config->MachineType != MT) { if (Config->Machine != MT) {
llvm::errs() << File->getShortName() << ": machine type " llvm::errs() << File->getShortName() << ": machine type "
<< machineTypeToStr(MT) << " conflicts with " << machineToStr(MT) << " conflicts with "
<< machineTypeToStr(Config->MachineType) << "\n"; << machineToStr(Config->Machine) << "\n";
return false; return false;
} }
} }
if (Config->MachineType == IMAGE_FILE_MACHINE_UNKNOWN) { if (Config->Machine == IMAGE_FILE_MACHINE_UNKNOWN) {
llvm::errs() << "warning: /machine is not specified. x64 is assumed.\n"; llvm::errs() << "warning: /machine is not specified. x64 is assumed.\n";
Config->MachineType = IMAGE_FILE_MACHINE_AMD64; Config->Machine = AMD64;
} }
// Windows specific -- Convert Windows resource files to a COFF file. // Windows specific -- Convert Windows resource files to a COFF file.
@ -559,8 +559,8 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
if (auto *Arg = Args.getLastArg(OPT_entry)) { if (auto *Arg = Args.getLastArg(OPT_entry)) {
Config->Entry = addUndefined(mangle(Arg->getValue())); Config->Entry = addUndefined(mangle(Arg->getValue()));
} else if (Args.hasArg(OPT_dll) && !Config->NoEntry) { } else if (Args.hasArg(OPT_dll) && !Config->NoEntry) {
StringRef S = (Config->MachineType == I386) ? "__DllMainCRTStartup@12" StringRef S = (Config->Machine == I386) ? "__DllMainCRTStartup@12"
: "_DllMainCRTStartup"; : "_DllMainCRTStartup";
Config->Entry = addUndefined(S); Config->Entry = addUndefined(S);
} else if (!Config->NoEntry) { } else if (!Config->NoEntry) {
// Windows specific -- If entry point name is not given, we need to // Windows specific -- If entry point name is not given, we need to
@ -580,7 +580,7 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
ErrorOr<Export> E = parseExport(Arg->getValue()); ErrorOr<Export> E = parseExport(Arg->getValue());
if (E.getError()) if (E.getError())
return false; return false;
if (Config->MachineType == I386 && !E->Name.startswith("_@?")) if (Config->Machine == I386 && !E->Name.startswith("_@?"))
E->Name = mangle(E->Name); E->Name = mangle(E->Name);
Config->Exports.push_back(E.get()); Config->Exports.push_back(E.get());
} }
@ -600,7 +600,7 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
// Handle /delayload // Handle /delayload
for (auto *Arg : Args.filtered(OPT_delayload)) { for (auto *Arg : Args.filtered(OPT_delayload)) {
Config->DelayLoads.insert(StringRef(Arg->getValue()).lower()); Config->DelayLoads.insert(StringRef(Arg->getValue()).lower());
if (Config->MachineType == I386) { if (Config->Machine == I386) {
Config->DelayLoadHelper = addUndefined("___delayLoadHelper2@8"); Config->DelayLoadHelper = addUndefined("___delayLoadHelper2@8");
} else { } else {
Config->DelayLoadHelper = addUndefined("__delayLoadHelper2"); Config->DelayLoadHelper = addUndefined("__delayLoadHelper2");
@ -612,7 +612,7 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
Config->ImageBase = getDefaultImageBase(); Config->ImageBase = getDefaultImageBase();
Symtab.addRelative(mangle("__ImageBase"), 0); Symtab.addRelative(mangle("__ImageBase"), 0);
if (Config->MachineType == IMAGE_FILE_MACHINE_I386) { if (Config->Machine == I386) {
Config->SEHTable = Symtab.addRelative("___safe_se_handler_table", 0); Config->SEHTable = Symtab.addRelative("___safe_se_handler_table", 0);
Config->SEHCount = Symtab.addAbsolute("___safe_se_handler_count", 0); Config->SEHCount = Symtab.addAbsolute("___safe_se_handler_count", 0);
} }
@ -653,7 +653,7 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
} }
// Windows specific -- if __load_config_used can be resolved, resolve it. // Windows specific -- if __load_config_used can be resolved, resolve it.
if (Config->MachineType == IMAGE_FILE_MACHINE_I386) if (Config->Machine == I386)
if (Symbol *Sym = Symtab.find("__load_config_used")) if (Symbol *Sym = Symtab.find("__load_config_used"))
if (isa<Lazy>(Sym->Body)) if (isa<Lazy>(Sym->Body))
Symtab.addUndefined("__load_config_used"); Symtab.addUndefined("__load_config_used");

View File

@ -120,7 +120,7 @@ void printHelp(const char *Argv0);
// For /machine option. // For /machine option.
ErrorOr<MachineTypes> getMachineType(StringRef Arg); ErrorOr<MachineTypes> getMachineType(StringRef Arg);
StringRef machineTypeToStr(MachineTypes MT); StringRef machineToStr(MachineTypes MT);
// Parses a string in the form of "<integer>[,<integer>]". // Parses a string in the form of "<integer>[,<integer>]".
std::error_code parseNumbers(StringRef Arg, uint64_t *Addr, std::error_code parseNumbers(StringRef Arg, uint64_t *Addr,

View File

@ -82,11 +82,11 @@ private:
// Returns /machine's value. // Returns /machine's value.
ErrorOr<MachineTypes> getMachineType(StringRef S) { ErrorOr<MachineTypes> getMachineType(StringRef S) {
MachineTypes MT = StringSwitch<MachineTypes>(S.lower()) MachineTypes MT = StringSwitch<MachineTypes>(S.lower())
.Case("x64", IMAGE_FILE_MACHINE_AMD64) .Case("x64", AMD64)
.Case("amd64", IMAGE_FILE_MACHINE_AMD64) .Case("amd64", AMD64)
.Case("x86", IMAGE_FILE_MACHINE_I386) .Case("x86", I386)
.Case("i386", IMAGE_FILE_MACHINE_I386) .Case("i386", I386)
.Case("arm", IMAGE_FILE_MACHINE_ARMNT) .Case("arm", ARMNT)
.Default(IMAGE_FILE_MACHINE_UNKNOWN); .Default(IMAGE_FILE_MACHINE_UNKNOWN);
if (MT != IMAGE_FILE_MACHINE_UNKNOWN) if (MT != IMAGE_FILE_MACHINE_UNKNOWN)
return MT; return MT;
@ -94,13 +94,13 @@ ErrorOr<MachineTypes> getMachineType(StringRef S) {
return make_error_code(LLDError::InvalidOption); return make_error_code(LLDError::InvalidOption);
} }
StringRef machineTypeToStr(MachineTypes MT) { StringRef machineToStr(MachineTypes MT) {
switch (MT) { switch (MT) {
case IMAGE_FILE_MACHINE_ARMNT: case ARMNT:
return "arm"; return "arm";
case IMAGE_FILE_MACHINE_AMD64: case AMD64:
return "x64"; return "x64";
case IMAGE_FILE_MACHINE_I386: case I386:
return "x86"; return "x86";
default: default:
llvm_unreachable("unknown machine type"); llvm_unreachable("unknown machine type");
@ -428,7 +428,7 @@ std::error_code fixupExports() {
if (!E.ExtName.empty()) if (!E.ExtName.empty())
continue; continue;
StringRef S = E.Sym->repl()->getName(); StringRef S = E.Sym->repl()->getName();
if (Config->MachineType == I386 && S.startswith("_")) if (Config->Machine == I386 && S.startswith("_"))
S = S.substr(1); S = S.substr(1);
E.ExtName = S; E.ExtName = S;
} }
@ -498,7 +498,7 @@ convertResToCOFF(const std::vector<MemoryBufferRef> &MBs) {
// Execute cvtres.exe. // Execute cvtres.exe.
Executor E("cvtres.exe"); Executor E("cvtres.exe");
E.add("/machine:" + machineTypeToStr(Config->MachineType)); E.add("/machine:" + machineToStr(Config->Machine));
E.add("/readonly"); E.add("/readonly");
E.add("/nologo"); E.add("/nologo");
E.add("/out:" + Path); E.add("/out:" + Path);
@ -551,7 +551,7 @@ std::error_code writeImportLibrary() {
Executor E("lib.exe"); Executor E("lib.exe");
E.add("/nologo"); E.add("/nologo");
E.add("/machine:" + machineTypeToStr(Config->MachineType)); E.add("/machine:" + machineToStr(Config->Machine));
E.add(Twine("/def:") + Def); E.add(Twine("/def:") + Def);
if (Config->Implib.empty()) { if (Config->Implib.empty()) {
SmallString<128> Out = StringRef(Config->OutputFile); SmallString<128> Out = StringRef(Config->OutputFile);

View File

@ -367,11 +367,11 @@ MachineTypes BitcodeFile::getMachineType() {
return IMAGE_FILE_MACHINE_UNKNOWN; return IMAGE_FILE_MACHINE_UNKNOWN;
switch (Triple(M->getTargetTriple()).getArch()) { switch (Triple(M->getTargetTriple()).getArch()) {
case Triple::x86_64: case Triple::x86_64:
return IMAGE_FILE_MACHINE_AMD64; return AMD64;
case Triple::x86: case Triple::x86:
return IMAGE_FILE_MACHINE_I386; return I386;
case Triple::arm: case Triple::arm:
return IMAGE_FILE_MACHINE_ARMNT; return ARMNT;
default: default:
return IMAGE_FILE_MACHINE_UNKNOWN; return IMAGE_FILE_MACHINE_UNKNOWN;
} }

View File

@ -209,7 +209,7 @@ private:
unget(); unget();
} }
if (Config->MachineType == I386 && !E.Name.startswith("_@?")) if (Config->Machine == I386 && !E.Name.startswith("_@?"))
E.Name = Alloc->save("_" + E.Name); E.Name = Alloc->save("_" + E.Name);
for (;;) { for (;;) {

View File

@ -287,7 +287,7 @@ StringRef SymbolTable::findMangle(StringRef Name) {
if (Symbol *Sym = find(Name)) if (Symbol *Sym = find(Name))
if (!isa<Undefined>(Sym->Body)) if (!isa<Undefined>(Sym->Body))
return Name; return Name;
if (Config->MachineType != I386) if (Config->Machine != I386)
return findByPrefix(("?" + Name + "@@Y").str()); return findByPrefix(("?" + Name + "@@Y").str());
if (!Name.startswith("_")) if (!Name.startswith("_"))
return ""; return "";

View File

@ -197,9 +197,9 @@ COFFSymbolRef DefinedCOFF::getCOFFSymbol() {
} }
DefinedImportThunk::DefinedImportThunk(StringRef Name, DefinedImportData *S, DefinedImportThunk::DefinedImportThunk(StringRef Name, DefinedImportData *S,
uint16_t MachineType) uint16_t Machine)
: Defined(DefinedImportThunkKind, Name) { : Defined(DefinedImportThunkKind, Name) {
switch (MachineType) { switch (Machine) {
case AMD64: case AMD64:
Data.reset(new ImportThunkChunkX64(S)); Data.reset(new ImportThunkChunkX64(S));
return; return;

View File

@ -327,8 +327,7 @@ private:
// a regular name. A function pointer is given as a DefinedImportData. // a regular name. A function pointer is given as a DefinedImportData.
class DefinedImportThunk : public Defined { class DefinedImportThunk : public Defined {
public: public:
DefinedImportThunk(StringRef Name, DefinedImportData *S, DefinedImportThunk(StringRef Name, DefinedImportData *S, uint16_t Machine);
uint16_t MachineType);
static bool classof(const SymbolBody *S) { static bool classof(const SymbolBody *S) {
return S->kind() == DefinedImportThunkKind; return S->kind() == DefinedImportThunkKind;

View File

@ -220,7 +220,7 @@ void Writer::createMiscChunks() {
} }
// Create SEH table. x86-only. // Create SEH table. x86-only.
if (Config->MachineType != IMAGE_FILE_MACHINE_I386) if (Config->Machine != I386)
return; return;
std::set<Defined *> Handlers; std::set<Defined *> Handlers;
for (ObjectFile *File : Symtab->ObjectFiles) { for (ObjectFile *File : Symtab->ObjectFiles) {
@ -406,7 +406,7 @@ template <typename PEHeaderTy> void Writer::writeHeader() {
// Write COFF header // Write COFF header
auto *COFF = reinterpret_cast<coff_file_header *>(Buf); auto *COFF = reinterpret_cast<coff_file_header *>(Buf);
Buf += sizeof(*COFF); Buf += sizeof(*COFF);
COFF->Machine = Config->MachineType; COFF->Machine = Config->Machine;
COFF->NumberOfSections = OutputSections.size(); COFF->NumberOfSections = OutputSections.size();
COFF->Characteristics = IMAGE_FILE_EXECUTABLE_IMAGE; COFF->Characteristics = IMAGE_FILE_EXECUTABLE_IMAGE;
if (Config->is64()) { if (Config->is64()) {
@ -441,7 +441,7 @@ template <typename PEHeaderTy> void Writer::writeHeader() {
Defined *Entry = cast<Defined>(Config->Entry->repl()); Defined *Entry = cast<Defined>(Config->Entry->repl());
PE->AddressOfEntryPoint = Entry->getRVA(); PE->AddressOfEntryPoint = Entry->getRVA();
// Pointer to thumb code must have the LSB set, so adjust it. // Pointer to thumb code must have the LSB set, so adjust it.
if (Config->MachineType == ARMNT) if (Config->Machine == ARMNT)
PE->AddressOfEntryPoint |= 1; PE->AddressOfEntryPoint |= 1;
} }
PE->SizeOfStackReserve = Config->StackReserve; PE->SizeOfStackReserve = Config->StackReserve;