diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-11-02 19:13:59 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-11-02 19:13:59 +0000 |
commit | dcbac6285a1d72d31b842342be04410b6055aa28 (patch) | |
tree | ee2e56934698227ecd36fee60b7f1f6d3ab38355 /llvm | |
parent | 84f4cb8ba555d102ea45fe84bc59e755610351e4 (diff) | |
download | bcm5719-llvm-dcbac6285a1d72d31b842342be04410b6055aa28.tar.gz bcm5719-llvm-dcbac6285a1d72d31b842342be04410b6055aa28.zip |
ELF can handle some relocations of the form -sym + constant.
Remove code that was assuming that this would never work.
Thanks to Colin LeMahie for finding and diagnosing the bug.
llvm-svn: 251818
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/include/llvm/MC/MCValue.h | 5 | ||||
-rw-r--r-- | llvm/lib/MC/MCExpr.cpp | 5 | ||||
-rw-r--r-- | llvm/test/MC/ELF/relocation-pc.s | 4 |
3 files changed, 3 insertions, 11 deletions
diff --git a/llvm/include/llvm/MC/MCValue.h b/llvm/include/llvm/MC/MCValue.h index 6bdf43685f2..ead08fd90ca 100644 --- a/llvm/include/llvm/MC/MCValue.h +++ b/llvm/include/llvm/MC/MCValue.h @@ -35,10 +35,6 @@ class raw_ostream; /// relocation modifiers apply to the closest symbol or the whole /// expression. /// -/// In the general form, SymbolB can only be defined if SymbolA is, and both -/// must be in the same (non-external) section. The latter constraint is not -/// enforced, since a symbol's section may not be known at construction. -/// /// Note that this class must remain a simple POD value class, because we need /// it to live in unions etc. class MCValue { @@ -67,7 +63,6 @@ public: const MCSymbolRefExpr *SymB = nullptr, int64_t Val = 0, uint32_t RefKind = 0) { MCValue R; - assert((!SymB || SymA) && "Invalid relocatable MCValue!"); R.Cst = Val; R.SymA = SymA; R.SymB = SymB; diff --git a/llvm/lib/MC/MCExpr.cpp b/llvm/lib/MC/MCExpr.cpp index caa502086a0..56524031d69 100644 --- a/llvm/lib/MC/MCExpr.cpp +++ b/llvm/lib/MC/MCExpr.cpp @@ -585,11 +585,6 @@ EvaluateSymbolicAdd(const MCAssembler *Asm, const MCAsmLayout *Layout, const MCSymbolRefExpr *A = LHS_A ? LHS_A : RHS_A; const MCSymbolRefExpr *B = LHS_B ? LHS_B : RHS_B; - // If we have a negated symbol, then we must have also have a non-negated - // symbol in order to encode the expression. - if (B && !A) - return false; - Res = MCValue::get(A, B, Result_Cst); return true; } diff --git a/llvm/test/MC/ELF/relocation-pc.s b/llvm/test/MC/ELF/relocation-pc.s index 28a911db8d9..85e97f05958 100644 --- a/llvm/test/MC/ELF/relocation-pc.s +++ b/llvm/test/MC/ELF/relocation-pc.s @@ -4,6 +4,7 @@ loope 0 # R_X86_64_PC8 jmp -256 # R_X86_64_PC32 + .word 0x42 - . # R_X86_64_PC16 // CHECK: Section { // CHECK: Index: @@ -13,7 +14,7 @@ // CHECK-NEXT: ] // CHECK-NEXT: Address: 0x0 // CHECK-NEXT: Offset: -// CHECK-NEXT: Size: 48 +// CHECK-NEXT: Size: // CHECK-NEXT: Link: // CHECK-NEXT: Info: // CHECK-NEXT: AddressAlignment: 8 @@ -21,5 +22,6 @@ // CHECK-NEXT: Relocations [ // CHECK-NEXT: 0x1 R_X86_64_PC8 - 0xFFFFFFFFFFFFFFFF // CHECK-NEXT: 0x3 R_X86_64_PC32 - 0xFFFFFFFFFFFFFEFC +// CHECK-NEXT: 0x7 R_X86_64_PC16 - 0x42 // CHECK-NEXT: ] // CHECK-NEXT: } |