MCExpr: Make COFF-specific VK_SECREL target-specific

to align with ELF targets, where the relocation specifier constants are
all target-specific.
This commit is contained in:
Fangrui Song 2025-06-27 22:54:02 -07:00
parent 3f531552e6
commit b9ca4c5fab
11 changed files with 16 additions and 16 deletions

View File

@ -193,13 +193,10 @@ public:
// VariantKind isn't ideal for encoding relocation operators because:
// (a) other expressions, like MCConstantExpr (e.g., 4@l) and MCBinaryExpr
// (e.g., (a+1)@l), also need it; (b) semantics become unclear (e.g., folding
// expressions with @). MCTargetExpr, as used by AArch64 and RISC-V, offers a
// cleaner approach.
// expressions with @). MCSpecifierExpr, as used by AArch64 and RISC-V, offers
// a cleaner approach.
enum VariantKind : uint16_t {
VK_SECREL = 1,
VK_WEAKREF, // The link between the symbols in .weakref foo, bar
VK_COFF_IMGREL32, // symbol@imgrel (image-relative)
VK_COFF_IMGREL32 = 3, // symbol@imgrel (image-relative)
FirstTargetSpecifier,
};

View File

@ -102,8 +102,6 @@ unsigned AArch64WinCOFFObjectWriter::getRelocType(
return COFF::IMAGE_REL_ARM64_ADDR32;
case MCSymbolRefExpr::VK_COFF_IMGREL32:
return COFF::IMAGE_REL_ARM64_ADDR32NB;
case MCSymbolRefExpr::VK_SECREL:
return COFF::IMAGE_REL_ARM64_SECREL;
}
case FK_Data_8:

View File

@ -859,7 +859,7 @@ static uint8_t getModifierSpecifier(ARMCP::ARMCPModifier Modifier) {
case ARMCP::GOT_PREL:
return ARM::S_GOT_PREL;
case ARMCP::SECREL:
return MCSymbolRefExpr::VK_SECREL;
return ARM::S_COFF_SECREL;
}
llvm_unreachable("Invalid ARMCPModifier!");
}

View File

@ -34,7 +34,7 @@ const MCAsmInfo::AtSpecifier atSpecifiers[] = {
{ARM::S_GOTTPOFF, "GOTTPOFF"},
{ARM::S_GOTTPOFF_FDPIC, "gottpoff_fdpic"},
{ARM::S_PLT, "PLT"},
{MCSymbolRefExpr::VK_SECREL, "SECREL32"},
{ARM::S_COFF_SECREL, "SECREL32"},
{ARM::S_TLSCALL, "tlscall"},
{ARM::S_TLSDESC, "tlsdesc"},
{ARM::S_TLSGD, "TLSGD"},

View File

@ -92,6 +92,8 @@ namespace ARM {
using Specifier = uint16_t;
enum {
S_None,
S_COFF_SECREL,
S_HI16 =
MCSymbolRefExpr::FirstTargetSpecifier, // The R_ARM_MOVT_ABS relocation
// (:upper16: in the .s file)

View File

@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "MCTargetDesc/ARMFixupKinds.h"
#include "MCTargetDesc/ARMMCAsmInfo.h"
#include "llvm/ADT/Twine.h"
#include "llvm/BinaryFormat/COFF.h"
#include "llvm/MC/MCAsmBackend.h"
@ -64,7 +65,7 @@ unsigned ARMWinCOFFObjectWriter::getRelocType(MCContext &Ctx,
switch (Spec) {
case MCSymbolRefExpr::VK_COFF_IMGREL32:
return COFF::IMAGE_REL_ARM_ADDR32NB;
case MCSymbolRefExpr::VK_SECREL:
case ARM::S_COFF_SECREL:
return COFF::IMAGE_REL_ARM_SECREL;
default:
return COFF::IMAGE_REL_ARM_ADDR32;

View File

@ -53,7 +53,7 @@ const MCAsmInfo::AtSpecifier atSpecifiers[] = {
{X86::S_PCREL, "PCREL"},
{X86::S_PLT, "PLT"},
{X86::S_PLTOFF, "PLTOFF"},
{MCSymbolRefExpr::VK_SECREL, "SECREL32"},
{X86::S_COFF_SECREL, "SECREL32"},
{X86::S_SIZE, "SIZE"},
{X86::S_TLSCALL, "tlscall"},
{X86::S_TLSDESC, "tlsdesc"},

View File

@ -69,6 +69,7 @@ using Specifier = uint16_t;
enum {
S_None,
S_COFF_SECREL,
S_ABS8 = MCSymbolRefExpr::FirstTargetSpecifier,
S_DTPOFF,

View File

@ -496,7 +496,7 @@ startsWithGlobalOffsetTable(const MCExpr *Expr) {
static bool hasSecRelSymbolRef(const MCExpr *Expr) {
if (Expr->getKind() == MCExpr::SymbolRef) {
auto *Ref = static_cast<const MCSymbolRefExpr *>(Expr);
return Ref->getKind() == MCSymbolRefExpr::VK_SECREL;
return Ref->getSpecifier() == X86::S_COFF_SECREL;
}
return false;
}

View File

@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "MCTargetDesc/X86FixupKinds.h"
#include "MCTargetDesc/X86MCAsmInfo.h"
#include "MCTargetDesc/X86MCTargetDesc.h"
#include "llvm/BinaryFormat/COFF.h"
#include "llvm/MC/MCContext.h"
@ -76,7 +77,7 @@ unsigned X86WinCOFFObjectWriter::getRelocType(MCContext &Ctx,
case X86::reloc_signed_4byte_relax:
if (Spec == MCSymbolRefExpr::VK_COFF_IMGREL32)
return COFF::IMAGE_REL_AMD64_ADDR32NB;
if (Spec == MCSymbolRefExpr::VK_SECREL)
if (Spec == X86::S_COFF_SECREL)
return COFF::IMAGE_REL_AMD64_SECREL;
return COFF::IMAGE_REL_AMD64_ADDR32;
case FK_Data_8:
@ -100,7 +101,7 @@ unsigned X86WinCOFFObjectWriter::getRelocType(MCContext &Ctx,
case X86::reloc_signed_4byte_relax:
if (Spec == MCSymbolRefExpr::VK_COFF_IMGREL32)
return COFF::IMAGE_REL_I386_DIR32NB;
if (Spec == MCSymbolRefExpr::VK_SECREL)
if (Spec == X86::S_COFF_SECREL)
return COFF::IMAGE_REL_I386_SECREL;
return COFF::IMAGE_REL_I386_DIR32;
case FK_SecRel_2:

View File

@ -256,7 +256,7 @@ MCOperand X86MCInstLower::LowerSymbolOperand(const MachineOperand &MO,
Expr, MCSymbolRefExpr::create(MF.getPICBaseSymbol(), Ctx), Ctx);
break;
case X86II::MO_SECREL:
Specifier = uint16_t(MCSymbolRefExpr::VK_SECREL);
Specifier = uint16_t(X86::S_COFF_SECREL);
break;
case X86II::MO_TLSGD:
Specifier = X86::S_TLSGD;