aboutsummaryrefslogtreecommitdiff
path: root/lld/COFF
diff options
context:
space:
mode:
Diffstat (limited to 'lld/COFF')
-rw-r--r--lld/COFF/Chunks.cpp28
-rw-r--r--lld/COFF/Chunks.h6
-rw-r--r--lld/COFF/Driver.cpp14
-rw-r--r--lld/COFF/SymbolTable.cpp1
4 files changed, 19 insertions, 30 deletions
diff --git a/lld/COFF/Chunks.cpp b/lld/COFF/Chunks.cpp
index 39f4575..004d710 100644
--- a/lld/COFF/Chunks.cpp
+++ b/lld/COFF/Chunks.cpp
@@ -437,19 +437,17 @@ void SectionChunk::applyRelocation(uint8_t *off,
// Compute the RVA of the relocation for relative relocations.
uint64_t p = rva + rel.VirtualAddress;
uint64_t imageBase = file->ctx.config.imageBase;
- switch (getMachine()) {
- case AMD64:
+ switch (getArch()) {
+ case Triple::x86_64:
applyRelX64(off, rel.Type, os, s, p, imageBase);
break;
- case I386:
+ case Triple::x86:
applyRelX86(off, rel.Type, os, s, p, imageBase);
break;
- case ARMNT:
+ case Triple::thumb:
applyRelARM(off, rel.Type, os, s, p, imageBase);
break;
- case ARM64:
- case ARM64EC:
- case ARM64X:
+ case Triple::aarch64:
applyRelARM64(off, rel.Type, os, s, p, imageBase);
break;
default:
@@ -516,27 +514,25 @@ void SectionChunk::addAssociative(SectionChunk *child) {
}
static uint8_t getBaserelType(const coff_relocation &rel,
- llvm::COFF::MachineTypes machine) {
- switch (machine) {
- case AMD64:
+ Triple::ArchType arch) {
+ switch (arch) {
+ case Triple::x86_64:
if (rel.Type == IMAGE_REL_AMD64_ADDR64)
return IMAGE_REL_BASED_DIR64;
if (rel.Type == IMAGE_REL_AMD64_ADDR32)
return IMAGE_REL_BASED_HIGHLOW;
return IMAGE_REL_BASED_ABSOLUTE;
- case I386:
+ case Triple::x86:
if (rel.Type == IMAGE_REL_I386_DIR32)
return IMAGE_REL_BASED_HIGHLOW;
return IMAGE_REL_BASED_ABSOLUTE;
- case ARMNT:
+ case Triple::thumb:
if (rel.Type == IMAGE_REL_ARM_ADDR32)
return IMAGE_REL_BASED_HIGHLOW;
if (rel.Type == IMAGE_REL_ARM_MOV32T)
return IMAGE_REL_BASED_ARM_MOV32T;
return IMAGE_REL_BASED_ABSOLUTE;
- case ARM64:
- case ARM64EC:
- case ARM64X:
+ case Triple::aarch64:
if (rel.Type == IMAGE_REL_ARM64_ADDR64)
return IMAGE_REL_BASED_DIR64;
return IMAGE_REL_BASED_ABSOLUTE;
@@ -551,7 +547,7 @@ static uint8_t getBaserelType(const coff_relocation &rel,
// Only called when base relocation is enabled.
void SectionChunk::getBaserels(std::vector<Baserel> *res) {
for (const coff_relocation &rel : getRelocs()) {
- uint8_t ty = getBaserelType(rel, getMachine());
+ uint8_t ty = getBaserelType(rel, getArch());
if (ty == IMAGE_REL_BASED_ABSOLUTE)
continue;
Symbol *target = file->getSymbol(rel.SymbolTableIndex);
diff --git a/lld/COFF/Chunks.h b/lld/COFF/Chunks.h
index 7b6bdea..bb91903 100644
--- a/lld/COFF/Chunks.h
+++ b/lld/COFF/Chunks.h
@@ -18,6 +18,7 @@
#include "llvm/ADT/iterator_range.h"
#include "llvm/MC/StringTableBuilder.h"
#include "llvm/Object/COFF.h"
+#include "llvm/Object/WindowsMachineFlag.h"
#include <utility>
#include <vector>
@@ -116,6 +117,7 @@ public:
bool isHotPatchable() const;
MachineTypes getMachine() const;
+ llvm::Triple::ArchType getArch() const;
std::optional<chpe_range_type> getArm64ECRangeType() const;
protected:
@@ -437,6 +439,10 @@ inline MachineTypes Chunk::getMachine() const {
return static_cast<const NonSectionChunk *>(this)->getMachine();
}
+inline llvm::Triple::ArchType Chunk::getArch() const {
+ return llvm::getMachineArchType(getMachine());
+}
+
inline std::optional<chpe_range_type> Chunk::getArm64ECRangeType() const {
// Data sections don't need codemap entries.
if (!(getOutputCharacteristics() & llvm::COFF::IMAGE_SCN_MEM_EXECUTE))
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index 2b1d4ab..b0365b5 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -31,7 +31,6 @@
#include "llvm/Object/ArchiveWriter.h"
#include "llvm/Object/COFFImportFile.h"
#include "llvm/Object/COFFModuleDefinition.h"
-#include "llvm/Object/WindowsMachineFlag.h"
#include "llvm/Option/Arg.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Option/Option.h"
@@ -157,18 +156,7 @@ StringRef LinkerDriver::mangle(StringRef sym) {
}
llvm::Triple::ArchType LinkerDriver::getArch() {
- switch (ctx.config.machine) {
- case I386:
- return llvm::Triple::ArchType::x86;
- case AMD64:
- return llvm::Triple::ArchType::x86_64;
- case ARMNT:
- return llvm::Triple::ArchType::arm;
- case ARM64:
- return llvm::Triple::ArchType::aarch64;
- default:
- return llvm::Triple::ArchType::UnknownArch;
- }
+ return getMachineArchType(ctx.config.machine);
}
bool LinkerDriver::findUnderscoreMangle(StringRef sym) {
diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp
index 44aa506..3accf24 100644
--- a/lld/COFF/SymbolTable.cpp
+++ b/lld/COFF/SymbolTable.cpp
@@ -19,7 +19,6 @@
#include "llvm/DebugInfo/DIContext.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/LTO/LTO.h"
-#include "llvm/Object/WindowsMachineFlag.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include <utility>