[lld] c1a6def - [ELF] Make RelType a struct type
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sat Nov 16 20:26:39 PST 2024
Author: Fangrui Song
Date: 2024-11-16T20:26:34-08:00
New Revision: c1a6defd9ff1540638d660888c5f32ea5cf4fa7d
URL: https://github.com/llvm/llvm-project/commit/c1a6defd9ff1540638d660888c5f32ea5cf4fa7d
DIFF: https://github.com/llvm/llvm-project/commit/c1a6defd9ff1540638d660888c5f32ea5cf4fa7d.diff
LOG: [ELF] Make RelType a struct type
otherwise operator<<(const ELFSyncStream &s, RelType type) applies to
non-reloc-type uint32_t, which can be confusing.
Added:
Modified:
lld/ELF/Arch/AArch64.cpp
lld/ELF/Arch/AMDGPU.cpp
lld/ELF/Arch/ARM.cpp
lld/ELF/Arch/AVR.cpp
lld/ELF/Arch/Hexagon.cpp
lld/ELF/Arch/LoongArch.cpp
lld/ELF/Arch/Mips.cpp
lld/ELF/Arch/PPC.cpp
lld/ELF/Arch/PPC64.cpp
lld/ELF/Arch/RISCV.cpp
lld/ELF/Arch/SPARCV9.cpp
lld/ELF/Arch/SystemZ.cpp
lld/ELF/Arch/X86.cpp
lld/ELF/Arch/X86_64.cpp
lld/ELF/InputFiles.cpp
lld/ELF/OutputSections.cpp
lld/ELF/Relocations.cpp
lld/ELF/Relocations.h
Removed:
################################################################################
diff --git a/lld/ELF/Arch/AArch64.cpp b/lld/ELF/Arch/AArch64.cpp
index e66982ce52afd1..bc7ac676165fec 100644
--- a/lld/ELF/Arch/AArch64.cpp
+++ b/lld/ELF/Arch/AArch64.cpp
@@ -213,7 +213,7 @@ RelExpr AArch64::getRelExpr(RelType type, const Symbol &s,
case R_AARCH64_NONE:
return R_NONE;
default:
- Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << Twine(type)
+ Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << type.v
<< ") against symbol " << &s;
return R_NONE;
}
diff --git a/lld/ELF/Arch/AMDGPU.cpp b/lld/ELF/Arch/AMDGPU.cpp
index fb85291fd77c25..df7e4ee04bb885 100644
--- a/lld/ELF/Arch/AMDGPU.cpp
+++ b/lld/ELF/Arch/AMDGPU.cpp
@@ -193,7 +193,7 @@ RelExpr AMDGPU::getRelExpr(RelType type, const Symbol &s,
case R_AMDGPU_GOTPCREL32_HI:
return R_GOT_PC;
default:
- Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << Twine(type)
+ Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << type.v
<< ") against symbol " << &s;
return R_NONE;
}
diff --git a/lld/ELF/Arch/ARM.cpp b/lld/ELF/Arch/ARM.cpp
index 65be407815701c..c8fbc77e308251 100644
--- a/lld/ELF/Arch/ARM.cpp
+++ b/lld/ELF/Arch/ARM.cpp
@@ -195,7 +195,7 @@ RelExpr ARM::getRelExpr(RelType type, const Symbol &s,
// not ARMv4 output, we can just ignore it.
return R_NONE;
default:
- Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << Twine(type)
+ Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << type.v
<< ") against symbol " << &s;
return R_NONE;
}
diff --git a/lld/ELF/Arch/AVR.cpp b/lld/ELF/Arch/AVR.cpp
index 5538acd90de428..826ad54dc3dbae 100644
--- a/lld/ELF/Arch/AVR.cpp
+++ b/lld/ELF/Arch/AVR.cpp
@@ -93,7 +93,7 @@ RelExpr AVR::getRelExpr(RelType type, const Symbol &s,
case R_AVR_13_PCREL:
return R_PC;
default:
- Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << Twine(type)
+ Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << type.v
<< ") against symbol " << &s;
return R_NONE;
}
diff --git a/lld/ELF/Arch/Hexagon.cpp b/lld/ELF/Arch/Hexagon.cpp
index b9e1eeffc07aaf..e7779683c9707b 100644
--- a/lld/ELF/Arch/Hexagon.cpp
+++ b/lld/ELF/Arch/Hexagon.cpp
@@ -153,7 +153,7 @@ RelExpr Hexagon::getRelExpr(RelType type, const Symbol &s,
case R_HEX_TPREL_LO16:
return R_TPREL;
default:
- Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << Twine(type)
+ Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << type.v
<< ") against symbol " << &s;
return R_NONE;
}
diff --git a/lld/ELF/Arch/LoongArch.cpp b/lld/ELF/Arch/LoongArch.cpp
index 850b7980c85c22..7a660587a12bf0 100644
--- a/lld/ELF/Arch/LoongArch.cpp
+++ b/lld/ELF/Arch/LoongArch.cpp
@@ -527,7 +527,7 @@ RelExpr LoongArch::getRelExpr(const RelType type, const Symbol &s,
//
// [1]: https://web.archive.org/web/20230709064026/https://github.com/loongson/LoongArch-Documentation/issues/51
default:
- Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << Twine(type)
+ Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << type.v
<< ") against symbol " << &s;
return R_NONE;
}
diff --git a/lld/ELF/Arch/Mips.cpp b/lld/ELF/Arch/Mips.cpp
index b60c9c159e0bb2..02f360d73ea15e 100644
--- a/lld/ELF/Arch/Mips.cpp
+++ b/lld/ELF/Arch/Mips.cpp
@@ -78,7 +78,7 @@ RelExpr MIPS<ELFT>::getRelExpr(RelType type, const Symbol &s,
const uint8_t *loc) const {
// See comment in the calculateMipsRelChain.
if (ELFT::Is64Bits || ctx.arg.mipsN32Abi)
- type &= 0xff;
+ type.v &= 0xff;
switch (type) {
case R_MIPS_JALR:
@@ -191,7 +191,7 @@ RelExpr MIPS<ELFT>::getRelExpr(RelType type, const Symbol &s,
case R_MIPS_NONE:
return R_NONE;
default:
- Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << Twine(type)
+ Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << type.v
<< ") against symbol " << &s;
return R_NONE;
}
@@ -481,7 +481,7 @@ int64_t MIPS<ELFT>::getImplicitAddend(const uint8_t *buf, RelType type) const {
}
static std::pair<uint32_t, uint64_t>
-calculateMipsRelChain(Ctx &ctx, uint8_t *loc, RelType type, uint64_t val) {
+calculateMipsRelChain(Ctx &ctx, uint8_t *loc, uint32_t type, uint64_t val) {
// MIPS N64 ABI packs multiple relocations into the single relocation
// record. In general, all up to three relocations can have arbitrary
// types. In fact, Clang and GCC uses only a few combinations. For now,
@@ -494,8 +494,8 @@ calculateMipsRelChain(Ctx &ctx, uint8_t *loc, RelType type, uint64_t val) {
// relocations used to modify result of the first one: extend it to
// 64-bit, extract high or low part etc. For details, see part 2.9 Relocation
// at the https://dmz-portal.mips.com/mw/images/8/82/007-4658-001.pdf
- RelType type2 = (type >> 8) & 0xff;
- RelType type3 = (type >> 16) & 0xff;
+ uint32_t type2 = (type >> 8) & 0xff;
+ uint32_t type3 = (type >> 16) & 0xff;
if (type2 == R_MIPS_NONE && type3 == R_MIPS_NONE)
return std::make_pair(type, val);
if (type2 == R_MIPS_64 && type3 == R_MIPS_NONE)
diff --git a/lld/ELF/Arch/PPC.cpp b/lld/ELF/Arch/PPC.cpp
index 7f46656521d21a..417401374436ae 100644
--- a/lld/ELF/Arch/PPC.cpp
+++ b/lld/ELF/Arch/PPC.cpp
@@ -269,7 +269,7 @@ RelExpr PPC::getRelExpr(RelType type, const Symbol &s,
case R_PPC_TPREL16_HI:
return R_TPREL;
default:
- Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << Twine(type)
+ Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << type.v
<< ") against symbol " << &s;
return R_NONE;
}
diff --git a/lld/ELF/Arch/PPC64.cpp b/lld/ELF/Arch/PPC64.cpp
index ef5c06299e053c..cb0a94e3a1a7d9 100644
--- a/lld/ELF/Arch/PPC64.cpp
+++ b/lld/ELF/Arch/PPC64.cpp
@@ -644,7 +644,7 @@ uint32_t PPC64::calcEFlags() const {
if (flag == 1)
ErrAlways(ctx) << f << ": ABI version 1 is not supported";
else if (flag > 2)
- ErrAlways(ctx) << f << ": unrecognized e_flags: " << Twine(flag);
+ ErrAlways(ctx) << f << ": unrecognized e_flags: " << flag;
}
return 2;
}
@@ -1100,7 +1100,7 @@ RelExpr PPC64::getRelExpr(RelType type, const Symbol &s,
case R_PPC64_TLS:
return R_TLSIE_HINT;
default:
- Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << Twine(type)
+ Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << type.v
<< ") against symbol " << &s;
return R_NONE;
}
diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 4152b403ecfc60..1cf42e1a301bde 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -324,7 +324,7 @@ RelExpr RISCV::getRelExpr(const RelType type, const Symbol &s,
case R_RISCV_SUB_ULEB128:
return R_RISCV_LEB128;
default:
- Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << Twine(type)
+ Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << type.v
<< ") against symbol " << &s;
return R_NONE;
}
diff --git a/lld/ELF/Arch/SPARCV9.cpp b/lld/ELF/Arch/SPARCV9.cpp
index d733f2e0a43909..b594b6677f3ad3 100644
--- a/lld/ELF/Arch/SPARCV9.cpp
+++ b/lld/ELF/Arch/SPARCV9.cpp
@@ -78,7 +78,7 @@ RelExpr SPARCV9::getRelExpr(RelType type, const Symbol &s,
case R_SPARC_TLS_LE_LOX10:
return R_TPREL;
default:
- Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << Twine(type)
+ Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << type.v
<< ") against symbol " << &s;
return R_NONE;
}
diff --git a/lld/ELF/Arch/SystemZ.cpp b/lld/ELF/Arch/SystemZ.cpp
index ddea201dd7f7f1..e0c6feb6031fc0 100644
--- a/lld/ELF/Arch/SystemZ.cpp
+++ b/lld/ELF/Arch/SystemZ.cpp
@@ -170,7 +170,7 @@ RelExpr SystemZ::getRelExpr(RelType type, const Symbol &s,
return R_GOT_PC;
default:
- Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << Twine(type)
+ Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << type.v
<< ") against symbol " << &s;
return R_NONE;
}
diff --git a/lld/ELF/Arch/X86.cpp b/lld/ELF/Arch/X86.cpp
index d37be54d6a3123..0edcde950d850a 100644
--- a/lld/ELF/Arch/X86.cpp
+++ b/lld/ELF/Arch/X86.cpp
@@ -151,7 +151,7 @@ RelExpr X86::getRelExpr(RelType type, const Symbol &s,
case R_386_NONE:
return R_NONE;
default:
- Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << Twine(type)
+ Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << type.v
<< ") against symbol " << &s;
return R_NONE;
}
diff --git a/lld/ELF/Arch/X86_64.cpp b/lld/ELF/Arch/X86_64.cpp
index 42448d5edf26be..e9267bd4128d18 100644
--- a/lld/ELF/Arch/X86_64.cpp
+++ b/lld/ELF/Arch/X86_64.cpp
@@ -407,7 +407,7 @@ RelExpr X86_64::getRelExpr(RelType type, const Symbol &s,
case R_X86_64_NONE:
return R_NONE;
default:
- Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << Twine(type)
+ Err(ctx) << getErrorLoc(ctx, loc) << "unknown relocation (" << type.v
<< ") against symbol " << &s;
return R_NONE;
}
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index 5a446f3544ada9..011ad7e2698569 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -1042,8 +1042,8 @@ InputSectionBase *ObjFile<ELFT>::getRelocTarget(uint32_t idx, uint32_t info) {
return target;
}
- ErrAlways(ctx) << this << Twine(": relocation section (index ") << Twine(idx)
- << ") has invalid sh_info (" << Twine(info) << ")";
+ ErrAlways(ctx) << this << Twine(": relocation section (index ") << idx
+ << ") has invalid sh_info (" << info << ')';
return nullptr;
}
@@ -1211,9 +1211,8 @@ void ObjFile<ELFT>::initSectionsAndLocalSyms(bool ignoreComdats) {
if (LLVM_UNLIKELY(secIdx >= sections.size()))
Fatal(ctx) << this << ": invalid section index: " << Twine(secIdx);
if (LLVM_UNLIKELY(eSym.getBinding() != STB_LOCAL))
- ErrAlways(ctx) << this << ": non-local symbol (" << Twine(i)
- << ") found at index < .symtab's sh_info (" << Twine(end)
- << ")";
+ ErrAlways(ctx) << this << ": non-local symbol (" << i
+ << ") found at index < .symtab's sh_info (" << end << ")";
InputSectionBase *sec = sections[secIdx];
uint8_t type = eSym.getType();
@@ -1247,8 +1246,8 @@ template <class ELFT> void ObjFile<ELFT>::postParse() {
uint8_t binding = eSym.getBinding();
if (LLVM_UNLIKELY(binding != STB_GLOBAL && binding != STB_WEAK &&
binding != STB_GNU_UNIQUE))
- Err(ctx) << this << ": symbol (" << Twine(i)
- << ") has invalid binding: " << Twine((int)binding);
+ Err(ctx) << this << ": symbol (" << i
+ << ") has invalid binding: " << (int)binding;
// st_value of STT_TLS represents the assigned offset, not the actual
// address which is used by STT_FUNC and STT_OBJECT. STT_TLS symbols can
diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp
index 0e301a4921fe02..ccc8bb151b7d4e 100644
--- a/lld/ELF/OutputSections.cpp
+++ b/lld/ELF/OutputSections.cpp
@@ -315,7 +315,7 @@ static SmallVector<uint8_t, 0> deflateShard(Ctx &ctx, ArrayRef<uint8_t> in,
z_stream s = {};
auto res = deflateInit2(&s, level, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
if (res != 0) {
- Err(ctx) << "--compress-sections: deflateInit2 returned " << Twine(res);
+ Err(ctx) << "--compress-sections: deflateInit2 returned " << res;
return {};
}
s.next_in = const_cast<uint8_t *>(in.data());
diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp
index 4ca22de2a87d17..a000e79d5f4216 100644
--- a/lld/ELF/Relocations.cpp
+++ b/lld/ELF/Relocations.cpp
@@ -502,7 +502,7 @@ int64_t RelocationScanner::computeMipsAddend(const RelTy &rel, RelExpr expr,
return 0;
RelType type = rel.getType(ctx.arg.isMips64EL);
- uint32_t pairTy = getMipsPairType(type, isLocal);
+ RelType pairTy = getMipsPairType(type, isLocal);
if (pairTy == R_MIPS_NONE)
return 0;
@@ -843,7 +843,7 @@ static bool maybeReportUndefined(Ctx &ctx, Undefined &sym,
// theirs types into the single bit-set.
template <class RelTy>
RelType RelocationScanner::getMipsN32RelType(RelTy *&rel) const {
- RelType type = 0;
+ uint32_t type = 0;
uint64_t offset = rel->r_offset;
int n = 0;
diff --git a/lld/ELF/Relocations.h b/lld/ELF/Relocations.h
index ed0c665c7ffe9c..f800b5db61e971 100644
--- a/lld/ELF/Relocations.h
+++ b/lld/ELF/Relocations.h
@@ -25,7 +25,12 @@ class OutputSection;
class SectionBase;
// Represents a relocation type, such as R_X86_64_PC32 or R_ARM_THM_CALL.
-using RelType = uint32_t;
+struct RelType {
+ uint32_t v = 0;
+ /*implicit*/ constexpr RelType(uint32_t v = 0) : v(v) {}
+ /*implicit*/ operator uint32_t() const { return v; }
+};
+
using JumpModType = uint32_t;
// List of target-independent relocation types. Relocations read
More information about the llvm-commits
mailing list