[lld] r219438 - [PECOFF] Remove another use of is64 to support non-Intel architecture
Rui Ueyama
ruiu at google.com
Thu Oct 9 13:31:48 PDT 2014
Author: ruiu
Date: Thu Oct 9 15:31:48 2014
New Revision: 219438
URL: http://llvm.org/viewvc/llvm-project?rev=219438&view=rev
Log:
[PECOFF] Remove another use of is64 to support non-Intel architecture
Modified:
lld/trunk/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp
Modified: lld/trunk/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp?rev=219438&r1=219437&r2=219438&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/ReaderImportHeader.cpp Thu Oct 9 15:31:48 2014
@@ -148,32 +148,37 @@ namespace lld {
namespace {
-uint8_t FuncAtomContent[] = { 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp *0x0
- 0xcc, 0xcc // int 3; int 3
+// This code is valid both in x86 and x64.
+uint8_t FuncAtomContentX86[] = {
+ 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // JMP *0x0
+ 0xcc, 0xcc // INT 3; INT 3
};
/// The defined atom for jump table.
class FuncAtom : public COFFLinkerInternalAtom {
public:
FuncAtom(const File &file, StringRef symbolName)
- : COFFLinkerInternalAtom(
- file, /*oridnal*/ 0,
- std::vector<uint8_t>(FuncAtomContent,
- FuncAtomContent + sizeof(FuncAtomContent)),
- symbolName) {}
+ : COFFLinkerInternalAtom(file, /*oridnal*/ 0, createContent(),
+ symbolName) {}
uint64_t ordinal() const override { return 0; }
Scope scope() const override { return scopeGlobal; }
ContentType contentType() const override { return typeCode; }
Alignment alignment() const override { return Alignment(1); }
ContentPermissions permissions() const override { return permR_X; }
+
+private:
+ std::vector<uint8_t> createContent() const {
+ return std::vector<uint8_t>(
+ FuncAtomContentX86, FuncAtomContentX86 + sizeof(FuncAtomContentX86));
+ }
};
class FileImportLibrary : public File {
public:
FileImportLibrary(std::unique_ptr<MemoryBuffer> mb, std::error_code &ec,
- bool is64)
- : File(mb->getBufferIdentifier(), kindSharedLibrary), _is64(is64) {
+ MachineTypes machine)
+ : File(mb->getBufferIdentifier(), kindSharedLibrary), _machine(machine) {
const char *buf = mb->getBufferStart();
const char *end = mb->getBufferEnd();
@@ -243,12 +248,17 @@ private:
const COFFSharedLibraryAtom *dataAtom) {
auto *atom = new (_alloc) FuncAtom(*this, symbolName);
COFFReference *ref;
- if (_is64) {
- ref = new COFFReference(dataAtom, 2, llvm::COFF::IMAGE_REL_AMD64_REL32,
- Reference::KindArch::x86_64);
- } else {
+ switch (_machine) {
+ case llvm::COFF::IMAGE_FILE_MACHINE_I386:
ref = new COFFReference(dataAtom, 2, llvm::COFF::IMAGE_REL_I386_DIR32,
Reference::KindArch::x86);
+ break;
+ case llvm::COFF::IMAGE_FILE_MACHINE_AMD64:
+ ref = new COFFReference(dataAtom, 2, llvm::COFF::IMAGE_REL_AMD64_REL32,
+ Reference::KindArch::x86_64);
+ break;
+ default:
+ llvm::report_fatal_error("unsupported machine type");
}
atom->addReference(std::unique_ptr<COFFReference>(ref));
_definedAtoms._atoms.push_back(atom);
@@ -292,12 +302,12 @@ private:
return *str;
}
- bool _is64;
+ MachineTypes _machine;
};
class COFFImportLibraryReader : public Reader {
public:
- COFFImportLibraryReader(bool is64) : _is64(is64) {}
+ COFFImportLibraryReader(MachineTypes machine) : _machine(machine) {}
bool canParse(file_magic magic, StringRef,
const MemoryBuffer &mb) const override {
@@ -310,8 +320,8 @@ public:
parseFile(std::unique_ptr<MemoryBuffer> &mb, const class Registry &,
std::vector<std::unique_ptr<File> > &result) const override {
std::error_code ec;
- auto file =
- std::unique_ptr<File>(new FileImportLibrary(std::move(mb), ec, _is64));
+ auto file = std::unique_ptr<File>(
+ new FileImportLibrary(std::move(mb), ec, _machine));
if (ec)
return ec;
result.push_back(std::move(file));
@@ -319,13 +329,14 @@ public:
}
private:
- bool _is64;
+ MachineTypes _machine;
};
} // end anonymous namespace
void Registry::addSupportCOFFImportLibraries(PECOFFLinkingContext &ctx) {
- add(std::unique_ptr<Reader>(new COFFImportLibraryReader(ctx.is64Bit())));
+ MachineTypes machine = ctx.getMachineType();
+ add(std::unique_ptr<Reader>(new COFFImportLibraryReader(machine)));
}
} // end namespace lld
More information about the llvm-commits
mailing list