summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorEric Christopher <echristo@gmail.com>2014-10-06 06:55:55 +0000
committerEric Christopher <echristo@gmail.com>2014-10-06 06:55:55 +0000
commit47e079d45e04c294bb968046373dc64ef497033e (patch)
treeb2febf53ec53436679414b6183f03180f48f9bf1 /llvm
parent1452c8e640297e0134f5294d4060efdd6b103084 (diff)
downloadbcm5719-llvm-47e079d45e04c294bb968046373dc64ef497033e.tar.gz
bcm5719-llvm-47e079d45e04c294bb968046373dc64ef497033e.zip
Refactor RelocVisitor to take an object. This removes some
string comparisons and makes it a bit easier to check individual targets. Patch by Charlie Turner. llvm-svn: 219108
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/Object/ELFObjectFile.h2
-rw-r--r--llvm/include/llvm/Object/RelocVisitor.h210
-rw-r--r--llvm/lib/DebugInfo/DWARFContext.cpp2
3 files changed, 116 insertions, 98 deletions
diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h
index b2c22336b7b..ed3c08f6f32 100644
--- a/llvm/include/llvm/Object/ELFObjectFile.h
+++ b/llvm/include/llvm/Object/ELFObjectFile.h
@@ -924,6 +924,8 @@ unsigned ELFObjectFile<ELFT>::getArch() const {
default:
report_fatal_error("Invalid ELFCLASS!");
}
+ case ELF::EM_PPC:
+ return Triple::ppc;
case ELF::EM_PPC64:
return IsLittleEndian ? Triple::ppc64le : Triple::ppc64;
case ELF::EM_S390:
diff --git a/llvm/include/llvm/Object/RelocVisitor.h b/llvm/include/llvm/Object/RelocVisitor.h
index 5ca245057a5..c30699f511e 100644
--- a/llvm/include/llvm/Object/RelocVisitor.h
+++ b/llvm/include/llvm/Object/RelocVisitor.h
@@ -40,16 +40,18 @@ struct RelocToApply {
/// @brief Base class for object file relocation visitors.
class RelocVisitor {
public:
- explicit RelocVisitor(StringRef FileFormat)
- : FileFormat(FileFormat), HasError(false) {}
+ explicit RelocVisitor(ObjectFile &Obj)
+ : ObjToVisit(Obj), HasError(false) {}
// TODO: Should handle multiple applied relocations via either passing in the
// previously computed value or just count paired relocations as a single
// visit.
RelocToApply visit(uint32_t RelocType, RelocationRef R, uint64_t SecAddr = 0,
uint64_t Value = 0) {
- if (FileFormat == "ELF64-x86-64") {
- switch (RelocType) {
+ if (ObjToVisit.getBytesInAddress() == 8) { // 64-bit object file
+ switch (ObjToVisit.getArch()) {
+ case Triple::x86_64:
+ switch (RelocType) {
case llvm::ELF::R_X86_64_NONE:
return visitELF_X86_64_NONE(R);
case llvm::ELF::R_X86_64_64:
@@ -63,113 +65,127 @@ public:
default:
HasError = true;
return RelocToApply();
- }
- } else if (FileFormat == "ELF32-i386") {
- switch (RelocType) {
- case llvm::ELF::R_386_NONE:
- return visitELF_386_NONE(R);
- case llvm::ELF::R_386_32:
- return visitELF_386_32(R, Value);
- case llvm::ELF::R_386_PC32:
- return visitELF_386_PC32(R, Value, SecAddr);
- default:
- HasError = true;
- return RelocToApply();
- }
- } else if (FileFormat == "ELF64-ppc64") {
- switch (RelocType) {
- case llvm::ELF::R_PPC64_ADDR32:
- return visitELF_PPC64_ADDR32(R, Value);
- case llvm::ELF::R_PPC64_ADDR64:
- return visitELF_PPC64_ADDR64(R, Value);
- default:
- HasError = true;
- return RelocToApply();
- }
- } else if (FileFormat == "ELF32-ppc") {
- switch (RelocType) {
- case llvm::ELF::R_PPC_ADDR32:
- return visitELF_PPC_ADDR32(R, Value);
- default:
- HasError = true;
- return RelocToApply();
- }
- } else if (FileFormat == "ELF32-mips") {
- switch (RelocType) {
- case llvm::ELF::R_MIPS_32:
- return visitELF_MIPS_32(R, Value);
- default:
- HasError = true;
- return RelocToApply();
- }
- } else if (FileFormat == "ELF64-mips") {
- switch (RelocType) {
- case llvm::ELF::R_MIPS_32:
- return visitELF_MIPS_32(R, Value);
- case llvm::ELF::R_MIPS_64:
- return visitELF_MIPS_64(R, Value);
- default:
- HasError = true;
- return RelocToApply();
- }
- } else if (FileFormat == "ELF64-aarch64") {
- switch (RelocType) {
- case llvm::ELF::R_AARCH64_ABS32:
- return visitELF_AARCH64_ABS32(R, Value);
- case llvm::ELF::R_AARCH64_ABS64:
- return visitELF_AARCH64_ABS64(R, Value);
- default:
- HasError = true;
- return RelocToApply();
- }
- } else if (FileFormat == "ELF64-s390") {
- switch (RelocType) {
- case llvm::ELF::R_390_32:
- return visitELF_390_32(R, Value);
- case llvm::ELF::R_390_64:
- return visitELF_390_64(R, Value);
- default:
- HasError = true;
- return RelocToApply();
- }
- } else if (FileFormat == "ELF32-sparc") {
- switch (RelocType) {
- case llvm::ELF::R_SPARC_32:
- case llvm::ELF::R_SPARC_UA32:
- return visitELF_SPARC_32(R, Value);
- default:
- HasError = true;
- return RelocToApply();
- }
- } else if (FileFormat == "ELF64-sparc") {
- switch (RelocType) {
- case llvm::ELF::R_SPARC_32:
- case llvm::ELF::R_SPARC_UA32:
- return visitELF_SPARCV9_32(R, Value);
- case llvm::ELF::R_SPARC_64:
- case llvm::ELF::R_SPARC_UA64:
- return visitELF_SPARCV9_64(R, Value);
+ }
+ case Triple::aarch64:
+ switch (RelocType) {
+ case llvm::ELF::R_AARCH64_ABS32:
+ return visitELF_AARCH64_ABS32(R, Value);
+ case llvm::ELF::R_AARCH64_ABS64:
+ return visitELF_AARCH64_ABS64(R, Value);
+ default:
+ HasError = true;
+ return RelocToApply();
+ }
+ case Triple::mips64el:
+ case Triple::mips64:
+ switch (RelocType) {
+ case llvm::ELF::R_MIPS_32:
+ return visitELF_MIPS_32(R, Value);
+ case llvm::ELF::R_MIPS_64:
+ return visitELF_MIPS_64(R, Value);
+ default:
+ HasError = true;
+ return RelocToApply();
+ }
+ case Triple::ppc64le:
+ case Triple::ppc64:
+ switch (RelocType) {
+ case llvm::ELF::R_PPC64_ADDR32:
+ return visitELF_PPC64_ADDR32(R, Value);
+ case llvm::ELF::R_PPC64_ADDR64:
+ return visitELF_PPC64_ADDR64(R, Value);
+ default:
+ HasError = true;
+ return RelocToApply();
+ }
+ case Triple::systemz:
+ switch (RelocType) {
+ case llvm::ELF::R_390_32:
+ return visitELF_390_32(R, Value);
+ case llvm::ELF::R_390_64:
+ return visitELF_390_64(R, Value);
+ default:
+ HasError = true;
+ return RelocToApply();
+ }
+ case Triple::sparcv9:
+ switch (RelocType) {
+ case llvm::ELF::R_SPARC_32:
+ case llvm::ELF::R_SPARC_UA32:
+ return visitELF_SPARCV9_32(R, Value);
+ case llvm::ELF::R_SPARC_64:
+ case llvm::ELF::R_SPARC_UA64:
+ return visitELF_SPARCV9_64(R, Value);
+ default:
+ HasError = true;
+ return RelocToApply();
+ }
default:
HasError = true;
return RelocToApply();
}
- } else if (FileFormat == "ELF32-arm") {
- switch (RelocType) {
+ } else if (ObjToVisit.getBytesInAddress() == 4) { // 32-bit object file
+ switch (ObjToVisit.getArch()) {
+ case Triple::x86:
+ switch (RelocType) {
+ case llvm::ELF::R_386_NONE:
+ return visitELF_386_NONE(R);
+ case llvm::ELF::R_386_32:
+ return visitELF_386_32(R, Value);
+ case llvm::ELF::R_386_PC32:
+ return visitELF_386_PC32(R, Value, SecAddr);
+ default:
+ HasError = true;
+ return RelocToApply();
+ }
+ case Triple::ppc:
+ switch (RelocType) {
+ case llvm::ELF::R_PPC_ADDR32:
+ return visitELF_PPC_ADDR32(R, Value);
+ default:
+ HasError = true;
+ return RelocToApply();
+ }
+ case Triple::arm:
+ case Triple::armeb:
+ switch (RelocType) {
+ default:
+ HasError = true;
+ return RelocToApply();
+ case llvm::ELF::R_ARM_ABS32:
+ return visitELF_ARM_ABS32(R, Value);
+ }
+ case Triple::mipsel:
+ case Triple::mips:
+ switch (RelocType) {
+ case llvm::ELF::R_MIPS_32:
+ return visitELF_MIPS_32(R, Value);
+ default:
+ HasError = true;
+ return RelocToApply();
+ }
+ case Triple::sparc:
+ switch (RelocType) {
+ case llvm::ELF::R_SPARC_32:
+ case llvm::ELF::R_SPARC_UA32:
+ return visitELF_SPARC_32(R, Value);
+ default:
+ HasError = true;
+ return RelocToApply();
+ }
default:
HasError = true;
return RelocToApply();
- case llvm::ELF::R_ARM_ABS32:
- return visitELF_ARM_ABS32(R, Value);
}
+ } else {
+ report_fatal_error("Invalid word size in object file");
}
- HasError = true;
- return RelocToApply();
}
bool error() { return HasError; }
private:
- StringRef FileFormat;
+ ObjectFile &ObjToVisit;
bool HasError;
int64_t getAddend32LE(RelocationRef R) {
diff --git a/llvm/lib/DebugInfo/DWARFContext.cpp b/llvm/lib/DebugInfo/DWARFContext.cpp
index 39799f0b235..ceaff053ef8 100644
--- a/llvm/lib/DebugInfo/DWARFContext.cpp
+++ b/llvm/lib/DebugInfo/DWARFContext.cpp
@@ -626,7 +626,7 @@ DWARFContextInMemory::DWARFContextInMemory(object::ObjectFile &Obj)
Sym->getAddress(SymAddr);
}
- object::RelocVisitor V(Obj.getFileFormatName());
+ object::RelocVisitor V(Obj);
// The section address is always 0 for debug sections.
object::RelocToApply R(V.visit(Type, Reloc, 0, SymAddr));
if (V.error()) {
OpenPOWER on IntegriCloud