summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-11-02 19:13:59 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-11-02 19:13:59 +0000
commitdcbac6285a1d72d31b842342be04410b6055aa28 (patch)
treeee2e56934698227ecd36fee60b7f1f6d3ab38355 /llvm
parent84f4cb8ba555d102ea45fe84bc59e755610351e4 (diff)
downloadbcm5719-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.h5
-rw-r--r--llvm/lib/MC/MCExpr.cpp5
-rw-r--r--llvm/test/MC/ELF/relocation-pc.s4
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: }
OpenPOWER on IntegriCloud