Skip to content

Commit

Permalink
Only emit EM_SPARC32PLUS objects on explicit request
Browse files Browse the repository at this point in the history
  • Loading branch information
koachan committed Aug 1, 2024
1 parent ec0450f commit c1068d5
Show file tree
Hide file tree
Showing 8 changed files with 48 additions and 26 deletions.
13 changes: 13 additions & 0 deletions llvm/include/llvm/BinaryFormat/ELF.h
Original file line number Diff line number Diff line change
Expand Up @@ -697,6 +697,19 @@ enum {
#include "ELFRelocs/SystemZ.def"
};

// SPARC Specific e_flags
enum : unsigned {
EF_SPARC_EXT_MASK = 0xffff00,
EF_SPARC_32PLUS = 0x000100,
EF_SPARC_SUN_US1 = 0x000200,
EF_SPARC_HAL_R1 = 0x000400,
EF_SPARC_SUN_US3 = 0x000800,
EF_SPARCV9_MM = 0x3,
EF_SPARCV9_TSO = 0x0,
EF_SPARCV9_PSO = 0x1,
EF_SPARCV9_RMO = 0x2,
};

// ELF Relocation type for Sparc.
enum {
#include "ELFRelocs/Sparc.def"
Expand Down
6 changes: 2 additions & 4 deletions llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,16 +133,14 @@ namespace {
protected:
bool Is64Bit;
bool IsV8Plus;
bool HasV9;

public:
SparcAsmBackend(const MCSubtargetInfo &STI)
: MCAsmBackend(STI.getTargetTriple().isLittleEndian()
? llvm::endianness::little
: llvm::endianness::big),
Is64Bit(STI.getTargetTriple().isArch64Bit()),
IsV8Plus(STI.hasFeature(Sparc::FeatureV8Plus)),
HasV9(STI.hasFeature(Sparc::FeatureV9)) {}
IsV8Plus(STI.hasFeature(Sparc::FeatureV8Plus)) {}

unsigned getNumFixupKinds() const override {
return Sparc::NumTargetFixupKinds;
Expand Down Expand Up @@ -361,7 +359,7 @@ namespace {
std::unique_ptr<MCObjectTargetWriter>
createObjectTargetWriter() const override {
uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(OSType);
return createSparcELFObjectWriter(Is64Bit, IsV8Plus, HasV9, OSABI);
return createSparcELFObjectWriter(Is64Bit, IsV8Plus, OSABI);
}
};

Expand Down
17 changes: 5 additions & 12 deletions llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,11 @@ using namespace llvm;
namespace {
class SparcELFObjectWriter : public MCELFObjectTargetWriter {
public:
SparcELFObjectWriter(bool Is64Bit, bool IsV8Plus, bool HasV9, uint8_t OSABI)
SparcELFObjectWriter(bool Is64Bit, bool IsV8Plus, uint8_t OSABI)
: MCELFObjectTargetWriter(
Is64Bit, OSABI,
Is64Bit
? ELF::EM_SPARCV9
// Note that we still need to emit an EM_SPARC32PLUS object
// even when V8+ isn't explicitly requested, if we're
// targeting a V9-capable CPU. This matches GAS behavior upon
// encountering any V9 instructions in its input.
: ((IsV8Plus || HasV9) ? ELF::EM_SPARC32PLUS : ELF::EM_SPARC),
Is64Bit ? ELF::EM_SPARCV9
: (IsV8Plus ? ELF::EM_SPARC32PLUS : ELF::EM_SPARC),
/*HasRelocationAddend*/ true) {}

~SparcELFObjectWriter() override = default;
Expand Down Expand Up @@ -153,8 +148,6 @@ bool SparcELFObjectWriter::needsRelocateWithSymbol(const MCValue &,
}

std::unique_ptr<MCObjectTargetWriter>
llvm::createSparcELFObjectWriter(bool Is64Bit, bool IsV8Plus, bool HasV9,
uint8_t OSABI) {
return std::make_unique<SparcELFObjectWriter>(Is64Bit, IsV8Plus, HasV9,
OSABI);
llvm::createSparcELFObjectWriter(bool Is64Bit, bool IsV8Plus, uint8_t OSABI) {
return std::make_unique<SparcELFObjectWriter>(Is64Bit, IsV8Plus, OSABI);
}
2 changes: 1 addition & 1 deletion llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ createSparcMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {

static MCTargetStreamer *
createObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
return new SparcTargetELFStreamer(S);
return new SparcTargetELFStreamer(S, STI);
}

static MCTargetStreamer *createTargetAsmStreamer(MCStreamer &S,
Expand Down
6 changes: 2 additions & 4 deletions llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,8 @@ MCCodeEmitter *createSparcMCCodeEmitter(const MCInstrInfo &MCII,
MCAsmBackend *createSparcAsmBackend(const Target &T, const MCSubtargetInfo &STI,
const MCRegisterInfo &MRI,
const MCTargetOptions &Options);
std::unique_ptr<MCObjectTargetWriter> createSparcELFObjectWriter(bool Is64Bit,
bool IsV8Plus,
bool HasV9,
uint8_t OSABI);
std::unique_ptr<MCObjectTargetWriter>
createSparcELFObjectWriter(bool Is64Bit, bool IsV8Plus, uint8_t OSABI);

// Defines symbolic names for Sparc v9 ASI tag names.
namespace SparcASITag {
Expand Down
25 changes: 23 additions & 2 deletions llvm/lib/Target/Sparc/MCTargetDesc/SparcTargetStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,24 @@

#include "SparcTargetStreamer.h"
#include "SparcInstPrinter.h"
#include "SparcMCTargetDesc.h"
#include "llvm/BinaryFormat/ELF.h"
#include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCRegister.h"
#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/Support/FormattedStream.h"

using namespace llvm;

static unsigned getEFlagsForFeatureSet(const MCSubtargetInfo &STI) {
unsigned EFlags = 0;

if (STI.hasFeature(Sparc::FeatureV8Plus))
EFlags |= ELF::EF_SPARC_32PLUS;

return EFlags;
}

// pin vtable to this file
SparcTargetStreamer::SparcTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}

Expand All @@ -38,8 +51,16 @@ void SparcTargetAsmStreamer::emitSparcRegisterScratch(unsigned reg) {
<< ", #scratch\n";
}

SparcTargetELFStreamer::SparcTargetELFStreamer(MCStreamer &S)
: SparcTargetStreamer(S) {}
SparcTargetELFStreamer::SparcTargetELFStreamer(MCStreamer &S,
const MCSubtargetInfo &STI)
: SparcTargetStreamer(S) {
MCAssembler &MCA = getStreamer().getAssembler();
unsigned EFlags = MCA.getELFHeaderEFlags();

EFlags |= getEFlagsForFeatureSet(STI);

MCA.setELFHeaderEFlags(EFlags);
}

MCELFStreamer &SparcTargetELFStreamer::getStreamer() {
return static_cast<MCELFStreamer &>(Streamer);
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Target/Sparc/MCTargetDesc/SparcTargetStreamer.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class SparcTargetAsmStreamer : public SparcTargetStreamer {
// This part is for ELF object output
class SparcTargetELFStreamer : public SparcTargetStreamer {
public:
SparcTargetELFStreamer(MCStreamer &S);
SparcTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);
MCELFStreamer &getStreamer();
void emitSparcRegisterIgnore(unsigned reg) override {}
void emitSparcRegisterScratch(unsigned reg) override {}
Expand Down
3 changes: 1 addition & 2 deletions llvm/test/MC/Sparc/elf-sparc-machine-type.s
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
## Emit correct machine type depending on triple and cpu options.
## - `-triple sparc` emits an object of type EM_SPARC;
## - `-triple sparc -mcpu=v9` or `-triple sparc -mattr=+v8plus` emits EM_SPARC32PLUS; and
## - `-triple sparc -mattr=+v8plus` emits EM_SPARC32PLUS; and
## - `-triple sparcv9` emits EM_SPARCV9.

# RUN: llvm-mc -filetype=obj -triple sparc %s -o - | llvm-readobj -h - | FileCheck --check-prefixes=SPARC %s
# RUN: llvm-mc -filetype=obj -triple sparc -mcpu=v9 %s -o - | llvm-readobj -h - | FileCheck --check-prefixes=SPARC32PLUS %s
# RUN: llvm-mc -filetype=obj -triple sparc -mattr=+v8plus %s -o - | llvm-readobj -h - | FileCheck --check-prefixes=SPARC32PLUS %s
# RUN: llvm-mc -filetype=obj -triple sparcv9 %s -o - | llvm-readobj -h - | FileCheck --check-prefixes=SPARCV9 %s

Expand Down

0 comments on commit c1068d5

Please sign in to comment.