[PATCH] D104473: RISCV: clean up target expression handling
Saleem Abdulrasool via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 17 10:46:45 PDT 2021
compnerd updated this revision to Diff 352787.
compnerd added a comment.
Address feedback from @MaskRay
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D104473/new/
https://reviews.llvm.org/D104473
Files:
llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp
llvm/test/MC/RISCV/expressions.s
Index: llvm/test/MC/RISCV/expressions.s
===================================================================
--- /dev/null
+++ llvm/test/MC/RISCV/expressions.s
@@ -0,0 +1,29 @@
+# RUN: not llvm-mc -triple riscv32 -filetype obj %s -o /dev/null 2>&1 | FileCheck %s
+
+.Ltmp1:
+ .quad tls
+
+ lui a0, %hi(tls+0-.Ltmp1)
+# CHECK: :6:2: error: expected relocatable expression
+ lw a0, %lo(tls+0-.Ltmp1)(t0)
+# CHECK: :8:2: error: expected relocatable expression
+ lui a0, %tprel_hi(tls+0-.Ltmp1)
+# CHECK: :10:2: error: expected relocatable expression
+ add a0, a0, tp, %tprel_add(tls+0-.Ltmp1)
+# CHECK: :12:2: error: expected relocatable expression
+ addi a0, a0, %tprel_lo(tls+0-.Ltmp1)
+# CHECK: :14:2: error: expected relocatable expression
+ auipc a0, %tls_ie_pcrel_hi(tls+0-.Ltmp1)
+# CHECK: :16:2: error: expected relocatable expression
+ auipc a0, %tls_gd_pcrel_hi(tls+0-.Ltmp1)
+# CHECK: :18:2: error: expected relocatable expression
+ auipc a0, %pcrel_hi(tls-.Ltmp1)
+# CHECK: :20:2: error: expected relocatable expression
+ auipc a0, %got_pcrel_hi(tls-.Ltmp1)
+# CHECK: :22:2: error: expected relocatable expression
+ addi a0, a0, %pcrel_lo(tls-.Ltmp1)
+# CHECK: :24:2: error: expected relocatable expression
+
+# tail tls+32
+# tail tls-tls
+# _ :28:2: error: expected relocatable expression
Index: llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp
===================================================================
--- llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp
+++ llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp
@@ -92,33 +92,16 @@
bool RISCVMCExpr::evaluateAsRelocatableImpl(MCValue &Res,
const MCAsmLayout *Layout,
const MCFixup *Fixup) const {
- bool IsSymbolicDifference = false;
- if (const auto *MBE = dyn_cast<MCBinaryExpr>(getSubExpr())) {
- if (isa<MCBinaryExpr>(MBE->getLHS()) && isa<MCConstantExpr>(MBE->getRHS()))
- MBE = cast<MCBinaryExpr>(MBE->getLHS());
- IsSymbolicDifference = isa<MCSymbolRefExpr>(MBE->getLHS()) &&
- isa<MCSymbolRefExpr>(MBE->getRHS());
- }
+ // Explicitly drop the layout and assembler to prevent any symbolic folding in
+ // the expression handling. This is required to preserve symbolic difference
+ // expressions to emit the paired relocations.
+ if (!getSubExpr()->evaluateAsRelocatable(Res, nullptr, nullptr))
+ return false;
- // Some custom fixup types are not valid with symbol difference expressions
- if (IsSymbolicDifference) {
- switch (getKind()) {
- default:
- break;
- case VK_RISCV_LO:
- case VK_RISCV_HI:
- case VK_RISCV_PCREL_LO:
- case VK_RISCV_PCREL_HI:
- case VK_RISCV_GOT_HI:
- case VK_RISCV_TPREL_LO:
- case VK_RISCV_TPREL_HI:
- case VK_RISCV_TPREL_ADD:
- case VK_RISCV_TLS_GOT_HI:
- case VK_RISCV_TLS_GD_HI:
- return false;
- }
- }
- return getSubExpr()->evaluateAsRelocatable(Res, Layout, Fixup);
+ Res =
+ MCValue::get(Res.getSymA(), Res.getSymB(), Res.getConstant(), getKind());
+ // Custom fixup types are not valid with symbol difference expressions.
+ return Res.getSymB() ? getKind() == VK_RISCV_None : true;
}
void RISCVMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D104473.352787.patch
Type: text/x-patch
Size: 3270 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210617/b7aabef6/attachment.bin>
More information about the llvm-commits
mailing list