[PATCH] D58943: [RISCV][MC] Find matching pcrel_hi fixup in more cases.
Eli Friedman via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 4 17:44:19 PST 2019
efriedma created this revision.
efriedma added reviewers: apazos, lewis-revill, asb.
Herald added subscribers: jocewei, PkmX, rkruppe, the_o, brucehoult, MartinMosbeck, rogfer01, edward-jones, zzheng, jrtc27, shiva0217, kito-cheng, niosHD, sabuasal, simoncook, johnrusso, rbar.
Herald added a project: LLVM.
If a symbol points to the end of a fragment, instead of searching for fixups in that fragment, search in the next fragment.
Fixes spurious assembler error with subtarget change next to "la" pseudo-instruction, or expanded equivalent.
Alternate proposal to fix the problem discussed in https://reviews.llvm.org/D58759.
Repository:
rL LLVM
https://reviews.llvm.org/D58943
Files:
lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp
test/MC/RISCV/option-mix.s
Index: test/MC/RISCV/option-mix.s
===================================================================
--- /dev/null
+++ test/MC/RISCV/option-mix.s
@@ -0,0 +1,51 @@
+# RUN: llvm-mc %s -triple=riscv32 | FileCheck -check-prefix=ASM %s
+# RUN: llvm-mc %s -triple=riscv64 | FileCheck -check-prefix=ASM %s
+# RUN: llvm-mc -filetype=obj -triple riscv32 < %s \
+# RUN: | llvm-objdump -d -riscv-no-aliases - | FileCheck -check-prefix=DISASM %s
+# RUN: llvm-mc -filetype=obj -triple riscv64 < %s \
+# RUN: | llvm-objdump -d -riscv-no-aliases - | FileCheck -check-prefix=DISASM %s
+
+# Checks change of options does not cause error: could not find corresponding %pcrel_hi
+# when assembling pseudoinstruction and its extended form.
+
+.option push
+.option norelax
+ la a0, a_symbol
+.option pop
+ la a1, another_symbol
+
+# ASM: .Lpcrel_hi0:
+# ASM: auipc a0, %pcrel_hi(a_symbol)
+# ASM: addi a0, a0, %pcrel_lo(.Lpcrel_hi0)
+# ASM: .Lpcrel_hi1:
+# ASM: auipc a1, %pcrel_hi(another_symbol)
+# ASM: addi a1, a1, %pcrel_lo(.Lpcrel_hi1)
+
+# DISASM: .Lpcrel_hi0:
+# DISASM: auipc a0, 0
+# DISASM: addi a0, a0, 0
+# DISASM:.Lpcrel_hi1:
+# DISASM: auipc a1, 0
+# DISASM: addi a1, a1, 0
+
+.option push
+.option norelax
+1:auipc a0, %pcrel_hi(a_symbol)
+ addi a0, a0, %pcrel_lo(1b)
+.option pop
+2:auipc a1, %pcrel_hi(another_symbol)
+ addi a1, a1, %pcrel_lo(2b)
+
+# ASM: .Ltmp0:
+# ASM: auipc a0, %pcrel_hi(a_symbol)
+# ASM: addi a0, a0, %pcrel_lo(.Ltmp0)
+# ASM: .Ltmp1:
+# ASM: auipc a1, %pcrel_hi(another_symbol)
+# ASM: addi a1, a1, %pcrel_lo(.Ltmp1)
+
+# DISASM: .Ltmp0:
+# DISASM: auipc a0, 0
+# DISASM: addi a0, a0, 0
+# DISASM: .Ltmp1:
+# DISASM: auipc a1, 0
+# DISASM: addi a1, a1, 0
Index: lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp
===================================================================
--- lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp
+++ lib/Target/RISCV/MCTargetDesc/RISCVMCExpr.cpp
@@ -49,14 +49,22 @@
if (!AUIPCSRE)
return nullptr;
- const auto *DF =
- dyn_cast_or_null<MCDataFragment>(AUIPCSRE->findAssociatedFragment());
+ const MCSymbol *AUIPCSymbol = &AUIPCSRE->getSymbol();
+ const auto *DF = dyn_cast_or_null<MCDataFragment>(AUIPCSymbol->getFragment());
+
if (!DF)
return nullptr;
- const MCSymbol *AUIPCSymbol = &AUIPCSRE->getSymbol();
+ uint64_t Offset = AUIPCSymbol->getOffset();
+ if (DF->getContents().size() == Offset) {
+ DF = dyn_cast_or_null<MCDataFragment>(DF->getNextNode());
+ if (!DF)
+ return nullptr;
+ Offset = 0;
+ }
+
for (const MCFixup &F : DF->getFixups()) {
- if (F.getOffset() != AUIPCSymbol->getOffset())
+ if (F.getOffset() != Offset)
continue;
switch ((unsigned)F.getKind()) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D58943.189247.patch
Type: text/x-patch
Size: 2754 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190305/4528a4c6/attachment.bin>
More information about the llvm-commits
mailing list