[PATCH] D64715: [WIP][RISCV] Use RISCV_32_PCREL reloc for FDE initial location
Edward Jones via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 15 04:05:06 PDT 2019
edward-jones created this revision.
edward-jones added a reviewer: asb.
Herald added subscribers: llvm-commits, Jim, benna, psnobl, jocewei, PkmX, rkruppe, the_o, brucehoult, MartinMosbeck, rogfer01, zzheng, MaskRay, jrtc27, shiva0217, kito-cheng, niosHD, sabuasal, apazos, simoncook, johnrusso, rbar.
Herald added a project: LLVM.
The default FDE encoding is a 4-byte pc-relative offset, and the standard implementation of MCAsmInfo::getExprForFDESymbol generates a <symbol>-<pc> expression for this (which generates a R_RISCV_ADD32+R_RISCV_SUB32 reloc pair).
For reasons that are still not quite clear, the GNU toolchain generates a R_RISCV_32_PCREL relocation instead of the R_RISCV_ADD32+R_RISCV_SUB32 pair. This patch matches that behavior.
Repository:
rL LLVM
https://reviews.llvm.org/D64715
Files:
include/llvm/MC/MCExpr.h
lib/MC/MCExpr.cpp
lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp
lib/Target/RISCV/MCTargetDesc/RISCVMCAsmInfo.cpp
lib/Target/RISCV/MCTargetDesc/RISCVMCAsmInfo.h
Index: lib/Target/RISCV/MCTargetDesc/RISCVMCAsmInfo.h
===================================================================
--- lib/Target/RISCV/MCTargetDesc/RISCVMCAsmInfo.h
+++ lib/Target/RISCV/MCTargetDesc/RISCVMCAsmInfo.h
@@ -23,6 +23,10 @@
public:
explicit RISCVMCAsmInfo(const Triple &TargetTriple);
+
+ const MCExpr* getExprForFDESymbol(const MCSymbol *Sym,
+ unsigned Encoding,
+ MCStreamer &Streamer) const override;
};
} // namespace llvm
Index: lib/Target/RISCV/MCTargetDesc/RISCVMCAsmInfo.cpp
===================================================================
--- lib/Target/RISCV/MCTargetDesc/RISCVMCAsmInfo.cpp
+++ lib/Target/RISCV/MCTargetDesc/RISCVMCAsmInfo.cpp
@@ -12,6 +12,8 @@
#include "RISCVMCAsmInfo.h"
#include "llvm/ADT/Triple.h"
+#include "llvm/BinaryFormat/Dwarf.h"
+#include "llvm/MC/MCStreamer.h"
using namespace llvm;
void RISCVMCAsmInfo::anchor() {}
@@ -25,3 +27,14 @@
Data16bitsDirective = "\t.half\t";
Data32bitsDirective = "\t.word\t";
}
+
+const MCExpr*
+RISCVMCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym,
+ unsigned Encoding,
+ MCStreamer &Streamer) const {
+ auto &Ctx = Streamer.getContext();
+ if (Encoding | dwarf::DW_EH_PE_pcrel)
+ return MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_RISCV_PCREL, Ctx);
+ else
+ return MCSymbolRefExpr::create(Sym, Ctx);
+}
Index: lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp
===================================================================
--- lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp
+++ lib/Target/RISCV/MCTargetDesc/RISCVELFObjectWriter.cpp
@@ -10,6 +10,7 @@
#include "MCTargetDesc/RISCVMCTargetDesc.h"
#include "llvm/MC/MCELFObjectWriter.h"
#include "llvm/MC/MCFixup.h"
+#include "llvm/MC/MCValue.h"
#include "llvm/MC/MCObjectWriter.h"
#include "llvm/Support/ErrorHandling.h"
@@ -48,11 +49,15 @@
const MCFixup &Fixup,
bool IsPCRel) const {
// Determine the type of the relocation
+ MCSymbolRefExpr::VariantKind Variant = Target.getAccessVariant();
switch ((unsigned)Fixup.getKind()) {
default:
llvm_unreachable("invalid fixup kind!");
case FK_Data_4:
- return ELF::R_RISCV_32;
+ if (Variant == MCSymbolRefExpr::VK_RISCV_PCREL)
+ return ELF::R_RISCV_32_PCREL;
+ else
+ return ELF::R_RISCV_32;
case FK_Data_8:
return ELF::R_RISCV_64;
case FK_Data_Add_1:
Index: lib/MC/MCExpr.cpp
===================================================================
--- lib/MC/MCExpr.cpp
+++ lib/MC/MCExpr.cpp
@@ -312,6 +312,7 @@
case VK_AMDGPU_REL64: return "rel64";
case VK_AMDGPU_ABS32_LO: return "abs32 at lo";
case VK_AMDGPU_ABS32_HI: return "abs32 at hi";
+ case VK_RISCV_PCREL: return "pcrel";
}
llvm_unreachable("Invalid variant kind");
}
Index: include/llvm/MC/MCExpr.h
===================================================================
--- include/llvm/MC/MCExpr.h
+++ include/llvm/MC/MCExpr.h
@@ -296,6 +296,8 @@
VK_AMDGPU_ABS32_LO, // symbol at abs32@lo
VK_AMDGPU_ABS32_HI, // symbol at abs32@hi
+ VK_RISCV_PCREL,
+
VK_TPREL,
VK_DTPREL
};
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D64715.209792.patch
Type: text/x-patch
Size: 3307 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190715/1a21adf3/attachment.bin>
More information about the llvm-commits
mailing list