[llvm] [X86] Check if signed value is too large for fixup under some conditions (PR #150976)
Phoebe Wang via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 6 01:52:30 PDT 2025
================
@@ -721,15 +722,56 @@ void X86AsmBackend::applyFixup(const MCFragment &F, const MCFixup &Fixup,
assert(Fixup.getOffset() + Size <= Data.size() && "Invalid fixup offset!");
int64_t SignedValue = static_cast<int64_t>(Value);
- if (IsResolved && Fixup.isPCRel()) {
- // check that PC relative fixup fits into the fixup size.
+
+ // If the fixup is resolved to an absolute value, and is explictly signed
+ // (either by its type or by being marked as PC-relative), we should check
+ // that it fits.
+ // Otherwise, be conservative because some users may rely on overflow, or
+ // being able to use a signed value where an unsigned value would normally be
+ // expected, so strict checks may break things.
+ bool CheckSignedVal = false;
+ if (IsResolved) {
+ switch (Fixup.getKind()) {
+ default:
+ llvm_unreachable("invalid fixup kind!");
+ case FK_NONE:
+ case FK_Data_1:
+ case FK_Data_2:
+ case FK_Data_4:
+ case FK_Data_8:
+ case FK_SecRel_1:
+ case FK_SecRel_2:
+ case FK_SecRel_4:
+ case FK_SecRel_8:
+ CheckSignedVal = false;
+ break;
+ case X86::reloc_riprel_4byte:
+ case X86::reloc_riprel_4byte_relax:
+ case X86::reloc_riprel_4byte_relax_rex:
+ case X86::reloc_riprel_4byte_relax_rex2:
+ case X86::reloc_riprel_4byte_movq_load:
+ case X86::reloc_riprel_4byte_movq_load_rex2:
+ case X86::reloc_riprel_4byte_relax_evex:
+ case X86::reloc_signed_4byte:
+ case X86::reloc_signed_4byte_relax:
+ case X86::reloc_global_offset_table:
+ case X86::reloc_branch_4byte_pcrel:
+ CheckSignedVal = true;
+ break;
+ }
+
+ if (Fixup.isPCRel())
+ CheckSignedVal = true;
----------------
phoebewang wrote:
Why checking `isPCRel` since we listed all types above?
https://github.com/llvm/llvm-project/pull/150976
More information about the llvm-commits
mailing list