parent
5c437cd1e9
commit
5e706b3ee3
|
@ -126,14 +126,14 @@ void SectionChunk::writeTo(uint8_t *Buf) {
|
|||
SymbolBody *Body = File->getSymbolBody(Rel.SymbolTableIndex)->repl();
|
||||
uint64_t S = cast<Defined>(Body)->getRVA();
|
||||
uint64_t P = RVA + Rel.VirtualAddress;
|
||||
switch (Config->MachineType) {
|
||||
case IMAGE_FILE_MACHINE_AMD64:
|
||||
switch (Config->Machine) {
|
||||
case AMD64:
|
||||
applyRelX64(Off, Rel.Type, S, P);
|
||||
break;
|
||||
case IMAGE_FILE_MACHINE_I386:
|
||||
case I386:
|
||||
applyRelX86(Off, Rel.Type, S, P);
|
||||
break;
|
||||
case IMAGE_FILE_MACHINE_ARMNT:
|
||||
case ARMNT:
|
||||
applyRelARM(Off, Rel.Type, S, P);
|
||||
break;
|
||||
default:
|
||||
|
@ -150,16 +150,16 @@ void SectionChunk::addAssociative(SectionChunk *Child) {
|
|||
}
|
||||
|
||||
static uint8_t getBaserelType(const coff_relocation &Rel) {
|
||||
switch (Config->MachineType) {
|
||||
case IMAGE_FILE_MACHINE_AMD64:
|
||||
switch (Config->Machine) {
|
||||
case AMD64:
|
||||
if (Rel.Type == IMAGE_REL_AMD64_ADDR64)
|
||||
return IMAGE_REL_BASED_DIR64;
|
||||
return IMAGE_REL_BASED_ABSOLUTE;
|
||||
case IMAGE_FILE_MACHINE_I386:
|
||||
case I386:
|
||||
if (Rel.Type == IMAGE_REL_I386_DIR32)
|
||||
return IMAGE_REL_BASED_HIGHLOW;
|
||||
return IMAGE_REL_BASED_ABSOLUTE;
|
||||
case IMAGE_FILE_MACHINE_ARMNT:
|
||||
case ARMNT:
|
||||
if (Rel.Type == IMAGE_REL_ARM_ADDR32)
|
||||
return IMAGE_REL_BASED_HIGHLOW;
|
||||
if (Rel.Type == IMAGE_REL_ARM_MOV32T)
|
||||
|
@ -293,8 +293,7 @@ void StringChunk::writeTo(uint8_t *Buf) {
|
|||
ImportThunkChunkX64::ImportThunkChunkX64(Defined *S) : ImpSymbol(S) {
|
||||
// Intel Optimization Manual says that all branch targets
|
||||
// should be 16-byte aligned. MSVC linker does this too.
|
||||
if (Config->MachineType == AMD64)
|
||||
Align = 16;
|
||||
Align = 16;
|
||||
}
|
||||
|
||||
void ImportThunkChunkX64::writeTo(uint8_t *Buf) {
|
||||
|
@ -368,10 +367,10 @@ void BaserelChunk::writeTo(uint8_t *Buf) {
|
|||
}
|
||||
|
||||
uint8_t Baserel::getDefaultType() {
|
||||
switch (Config->MachineType) {
|
||||
case IMAGE_FILE_MACHINE_AMD64:
|
||||
switch (Config->Machine) {
|
||||
case AMD64:
|
||||
return IMAGE_REL_BASED_DIR64;
|
||||
case IMAGE_FILE_MACHINE_I386:
|
||||
case I386:
|
||||
return IMAGE_REL_BASED_HIGHLOW;
|
||||
default:
|
||||
llvm_unreachable("unknown machine type");
|
||||
|
|
|
@ -20,8 +20,6 @@
|
|||
namespace lld {
|
||||
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::WindowsSubsystem;
|
||||
using llvm::StringRef;
|
||||
|
@ -54,9 +52,9 @@ struct Export {
|
|||
// Global configuration.
|
||||
struct Configuration {
|
||||
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;
|
||||
WindowsSubsystem Subsystem = llvm::COFF::IMAGE_SUBSYSTEM_UNKNOWN;
|
||||
Undefined *Entry = nullptr;
|
||||
|
|
|
@ -426,7 +426,7 @@ void DelayLoadContents::create(Defined *H) {
|
|||
}
|
||||
|
||||
Chunk *DelayLoadContents::newThunkChunk(DefinedImportData *S, Chunk *Dir) {
|
||||
switch (Config->MachineType) {
|
||||
switch (Config->Machine) {
|
||||
case AMD64:
|
||||
return new ThunkChunkX64(S, Dir, Helper);
|
||||
case I386:
|
||||
|
|
|
@ -108,7 +108,7 @@ LinkerDriver::parseDirectives(StringRef S) {
|
|||
ErrorOr<Export> E = parseExport(Arg->getValue());
|
||||
if (auto EC = E.getError())
|
||||
return EC;
|
||||
if (Config->MachineType == I386 && E->ExtName.startswith("_"))
|
||||
if (Config->Machine == I386 && E->ExtName.startswith("_"))
|
||||
E->ExtName = E->ExtName.substr(1);
|
||||
Config->Exports.push_back(E.get());
|
||||
break;
|
||||
|
@ -211,8 +211,8 @@ Undefined *LinkerDriver::addUndefined(StringRef Name) {
|
|||
|
||||
// Symbol names are mangled by appending "_" prefix on x86.
|
||||
StringRef LinkerDriver::mangle(StringRef Sym) {
|
||||
assert(Config->MachineType != IMAGE_FILE_MACHINE_UNKNOWN);
|
||||
if (Config->MachineType == IMAGE_FILE_MACHINE_I386)
|
||||
assert(Config->Machine != IMAGE_FILE_MACHINE_UNKNOWN);
|
||||
if (Config->Machine == I386)
|
||||
return Alloc.save("_" + Sym);
|
||||
return Sym;
|
||||
}
|
||||
|
@ -335,7 +335,7 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
|
|||
ErrorOr<MachineTypes> MTOrErr = getMachineType(Arg->getValue());
|
||||
if (MTOrErr.getError())
|
||||
return false;
|
||||
Config->MachineType = MTOrErr.get();
|
||||
Config->Machine = MTOrErr.get();
|
||||
}
|
||||
|
||||
// Handle /nodefaultlib:<filename>
|
||||
|
@ -529,20 +529,20 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
|
|||
MachineTypes MT = File->getMachineType();
|
||||
if (MT == IMAGE_FILE_MACHINE_UNKNOWN)
|
||||
continue;
|
||||
if (Config->MachineType == IMAGE_FILE_MACHINE_UNKNOWN) {
|
||||
Config->MachineType = MT;
|
||||
if (Config->Machine == IMAGE_FILE_MACHINE_UNKNOWN) {
|
||||
Config->Machine = MT;
|
||||
continue;
|
||||
}
|
||||
if (Config->MachineType != MT) {
|
||||
if (Config->Machine != MT) {
|
||||
llvm::errs() << File->getShortName() << ": machine type "
|
||||
<< machineTypeToStr(MT) << " conflicts with "
|
||||
<< machineTypeToStr(Config->MachineType) << "\n";
|
||||
<< machineToStr(MT) << " conflicts with "
|
||||
<< machineToStr(Config->Machine) << "\n";
|
||||
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";
|
||||
Config->MachineType = IMAGE_FILE_MACHINE_AMD64;
|
||||
Config->Machine = AMD64;
|
||||
}
|
||||
|
||||
// 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)) {
|
||||
Config->Entry = addUndefined(mangle(Arg->getValue()));
|
||||
} else if (Args.hasArg(OPT_dll) && !Config->NoEntry) {
|
||||
StringRef S = (Config->MachineType == I386) ? "__DllMainCRTStartup@12"
|
||||
: "_DllMainCRTStartup";
|
||||
StringRef S = (Config->Machine == I386) ? "__DllMainCRTStartup@12"
|
||||
: "_DllMainCRTStartup";
|
||||
Config->Entry = addUndefined(S);
|
||||
} else if (!Config->NoEntry) {
|
||||
// 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());
|
||||
if (E.getError())
|
||||
return false;
|
||||
if (Config->MachineType == I386 && !E->Name.startswith("_@?"))
|
||||
if (Config->Machine == I386 && !E->Name.startswith("_@?"))
|
||||
E->Name = mangle(E->Name);
|
||||
Config->Exports.push_back(E.get());
|
||||
}
|
||||
|
@ -600,7 +600,7 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
|
|||
// Handle /delayload
|
||||
for (auto *Arg : Args.filtered(OPT_delayload)) {
|
||||
Config->DelayLoads.insert(StringRef(Arg->getValue()).lower());
|
||||
if (Config->MachineType == I386) {
|
||||
if (Config->Machine == I386) {
|
||||
Config->DelayLoadHelper = addUndefined("___delayLoadHelper2@8");
|
||||
} else {
|
||||
Config->DelayLoadHelper = addUndefined("__delayLoadHelper2");
|
||||
|
@ -612,7 +612,7 @@ bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
|
|||
Config->ImageBase = getDefaultImageBase();
|
||||
|
||||
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->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.
|
||||
if (Config->MachineType == IMAGE_FILE_MACHINE_I386)
|
||||
if (Config->Machine == I386)
|
||||
if (Symbol *Sym = Symtab.find("__load_config_used"))
|
||||
if (isa<Lazy>(Sym->Body))
|
||||
Symtab.addUndefined("__load_config_used");
|
||||
|
|
|
@ -120,7 +120,7 @@ void printHelp(const char *Argv0);
|
|||
|
||||
// For /machine option.
|
||||
ErrorOr<MachineTypes> getMachineType(StringRef Arg);
|
||||
StringRef machineTypeToStr(MachineTypes MT);
|
||||
StringRef machineToStr(MachineTypes MT);
|
||||
|
||||
// Parses a string in the form of "<integer>[,<integer>]".
|
||||
std::error_code parseNumbers(StringRef Arg, uint64_t *Addr,
|
||||
|
|
|
@ -82,11 +82,11 @@ private:
|
|||
// Returns /machine's value.
|
||||
ErrorOr<MachineTypes> getMachineType(StringRef S) {
|
||||
MachineTypes MT = StringSwitch<MachineTypes>(S.lower())
|
||||
.Case("x64", IMAGE_FILE_MACHINE_AMD64)
|
||||
.Case("amd64", IMAGE_FILE_MACHINE_AMD64)
|
||||
.Case("x86", IMAGE_FILE_MACHINE_I386)
|
||||
.Case("i386", IMAGE_FILE_MACHINE_I386)
|
||||
.Case("arm", IMAGE_FILE_MACHINE_ARMNT)
|
||||
.Case("x64", AMD64)
|
||||
.Case("amd64", AMD64)
|
||||
.Case("x86", I386)
|
||||
.Case("i386", I386)
|
||||
.Case("arm", ARMNT)
|
||||
.Default(IMAGE_FILE_MACHINE_UNKNOWN);
|
||||
if (MT != IMAGE_FILE_MACHINE_UNKNOWN)
|
||||
return MT;
|
||||
|
@ -94,13 +94,13 @@ ErrorOr<MachineTypes> getMachineType(StringRef S) {
|
|||
return make_error_code(LLDError::InvalidOption);
|
||||
}
|
||||
|
||||
StringRef machineTypeToStr(MachineTypes MT) {
|
||||
StringRef machineToStr(MachineTypes MT) {
|
||||
switch (MT) {
|
||||
case IMAGE_FILE_MACHINE_ARMNT:
|
||||
case ARMNT:
|
||||
return "arm";
|
||||
case IMAGE_FILE_MACHINE_AMD64:
|
||||
case AMD64:
|
||||
return "x64";
|
||||
case IMAGE_FILE_MACHINE_I386:
|
||||
case I386:
|
||||
return "x86";
|
||||
default:
|
||||
llvm_unreachable("unknown machine type");
|
||||
|
@ -428,7 +428,7 @@ std::error_code fixupExports() {
|
|||
if (!E.ExtName.empty())
|
||||
continue;
|
||||
StringRef S = E.Sym->repl()->getName();
|
||||
if (Config->MachineType == I386 && S.startswith("_"))
|
||||
if (Config->Machine == I386 && S.startswith("_"))
|
||||
S = S.substr(1);
|
||||
E.ExtName = S;
|
||||
}
|
||||
|
@ -498,7 +498,7 @@ convertResToCOFF(const std::vector<MemoryBufferRef> &MBs) {
|
|||
|
||||
// Execute cvtres.exe.
|
||||
Executor E("cvtres.exe");
|
||||
E.add("/machine:" + machineTypeToStr(Config->MachineType));
|
||||
E.add("/machine:" + machineToStr(Config->Machine));
|
||||
E.add("/readonly");
|
||||
E.add("/nologo");
|
||||
E.add("/out:" + Path);
|
||||
|
@ -551,7 +551,7 @@ std::error_code writeImportLibrary() {
|
|||
|
||||
Executor E("lib.exe");
|
||||
E.add("/nologo");
|
||||
E.add("/machine:" + machineTypeToStr(Config->MachineType));
|
||||
E.add("/machine:" + machineToStr(Config->Machine));
|
||||
E.add(Twine("/def:") + Def);
|
||||
if (Config->Implib.empty()) {
|
||||
SmallString<128> Out = StringRef(Config->OutputFile);
|
||||
|
|
|
@ -367,11 +367,11 @@ MachineTypes BitcodeFile::getMachineType() {
|
|||
return IMAGE_FILE_MACHINE_UNKNOWN;
|
||||
switch (Triple(M->getTargetTriple()).getArch()) {
|
||||
case Triple::x86_64:
|
||||
return IMAGE_FILE_MACHINE_AMD64;
|
||||
return AMD64;
|
||||
case Triple::x86:
|
||||
return IMAGE_FILE_MACHINE_I386;
|
||||
return I386;
|
||||
case Triple::arm:
|
||||
return IMAGE_FILE_MACHINE_ARMNT;
|
||||
return ARMNT;
|
||||
default:
|
||||
return IMAGE_FILE_MACHINE_UNKNOWN;
|
||||
}
|
||||
|
|
|
@ -209,7 +209,7 @@ private:
|
|||
unget();
|
||||
}
|
||||
|
||||
if (Config->MachineType == I386 && !E.Name.startswith("_@?"))
|
||||
if (Config->Machine == I386 && !E.Name.startswith("_@?"))
|
||||
E.Name = Alloc->save("_" + E.Name);
|
||||
|
||||
for (;;) {
|
||||
|
|
|
@ -287,7 +287,7 @@ StringRef SymbolTable::findMangle(StringRef Name) {
|
|||
if (Symbol *Sym = find(Name))
|
||||
if (!isa<Undefined>(Sym->Body))
|
||||
return Name;
|
||||
if (Config->MachineType != I386)
|
||||
if (Config->Machine != I386)
|
||||
return findByPrefix(("?" + Name + "@@Y").str());
|
||||
if (!Name.startswith("_"))
|
||||
return "";
|
||||
|
|
|
@ -197,9 +197,9 @@ COFFSymbolRef DefinedCOFF::getCOFFSymbol() {
|
|||
}
|
||||
|
||||
DefinedImportThunk::DefinedImportThunk(StringRef Name, DefinedImportData *S,
|
||||
uint16_t MachineType)
|
||||
uint16_t Machine)
|
||||
: Defined(DefinedImportThunkKind, Name) {
|
||||
switch (MachineType) {
|
||||
switch (Machine) {
|
||||
case AMD64:
|
||||
Data.reset(new ImportThunkChunkX64(S));
|
||||
return;
|
||||
|
|
|
@ -327,8 +327,7 @@ private:
|
|||
// a regular name. A function pointer is given as a DefinedImportData.
|
||||
class DefinedImportThunk : public Defined {
|
||||
public:
|
||||
DefinedImportThunk(StringRef Name, DefinedImportData *S,
|
||||
uint16_t MachineType);
|
||||
DefinedImportThunk(StringRef Name, DefinedImportData *S, uint16_t Machine);
|
||||
|
||||
static bool classof(const SymbolBody *S) {
|
||||
return S->kind() == DefinedImportThunkKind;
|
||||
|
|
|
@ -220,7 +220,7 @@ void Writer::createMiscChunks() {
|
|||
}
|
||||
|
||||
// Create SEH table. x86-only.
|
||||
if (Config->MachineType != IMAGE_FILE_MACHINE_I386)
|
||||
if (Config->Machine != I386)
|
||||
return;
|
||||
std::set<Defined *> Handlers;
|
||||
for (ObjectFile *File : Symtab->ObjectFiles) {
|
||||
|
@ -406,7 +406,7 @@ template <typename PEHeaderTy> void Writer::writeHeader() {
|
|||
// Write COFF header
|
||||
auto *COFF = reinterpret_cast<coff_file_header *>(Buf);
|
||||
Buf += sizeof(*COFF);
|
||||
COFF->Machine = Config->MachineType;
|
||||
COFF->Machine = Config->Machine;
|
||||
COFF->NumberOfSections = OutputSections.size();
|
||||
COFF->Characteristics = IMAGE_FILE_EXECUTABLE_IMAGE;
|
||||
if (Config->is64()) {
|
||||
|
@ -441,7 +441,7 @@ template <typename PEHeaderTy> void Writer::writeHeader() {
|
|||
Defined *Entry = cast<Defined>(Config->Entry->repl());
|
||||
PE->AddressOfEntryPoint = Entry->getRVA();
|
||||
// Pointer to thumb code must have the LSB set, so adjust it.
|
||||
if (Config->MachineType == ARMNT)
|
||||
if (Config->Machine == ARMNT)
|
||||
PE->AddressOfEntryPoint |= 1;
|
||||
}
|
||||
PE->SizeOfStackReserve = Config->StackReserve;
|
||||
|
|
Loading…
Reference in New Issue