Skip to content

Commit 1da748c

Browse files
committed
Only emit EM_SPARC32PLUS objects on explicit request
1 parent 3e6323a commit 1da748c

File tree

8 files changed

+48
-26
lines changed

8 files changed

+48
-26
lines changed

llvm/include/llvm/BinaryFormat/ELF.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,19 @@ enum {
697697
#include "ELFRelocs/SystemZ.def"
698698
};
699699

700+
// SPARC Specific e_flags
701+
enum : unsigned {
702+
EF_SPARC_EXT_MASK = 0xffff00,
703+
EF_SPARC_32PLUS = 0x000100,
704+
EF_SPARC_SUN_US1 = 0x000200,
705+
EF_SPARC_HAL_R1 = 0x000400,
706+
EF_SPARC_SUN_US3 = 0x000800,
707+
EF_SPARCV9_MM = 0x3,
708+
EF_SPARCV9_TSO = 0x0,
709+
EF_SPARCV9_PSO = 0x1,
710+
EF_SPARCV9_RMO = 0x2,
711+
};
712+
700713
// ELF Relocation type for Sparc.
701714
enum {
702715
#include "ELFRelocs/Sparc.def"

llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,16 +133,14 @@ namespace {
133133
protected:
134134
bool Is64Bit;
135135
bool IsV8Plus;
136-
bool HasV9;
137136

138137
public:
139138
SparcAsmBackend(const MCSubtargetInfo &STI)
140139
: MCAsmBackend(STI.getTargetTriple().isLittleEndian()
141140
? llvm::endianness::little
142141
: llvm::endianness::big),
143142
Is64Bit(STI.getTargetTriple().isArch64Bit()),
144-
IsV8Plus(STI.hasFeature(Sparc::FeatureV8Plus)),
145-
HasV9(STI.hasFeature(Sparc::FeatureV9)) {}
143+
IsV8Plus(STI.hasFeature(Sparc::FeatureV8Plus)) {}
146144

147145
unsigned getNumFixupKinds() const override {
148146
return Sparc::NumTargetFixupKinds;
@@ -361,7 +359,7 @@ namespace {
361359
std::unique_ptr<MCObjectTargetWriter>
362360
createObjectTargetWriter() const override {
363361
uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(OSType);
364-
return createSparcELFObjectWriter(Is64Bit, IsV8Plus, HasV9, OSABI);
362+
return createSparcELFObjectWriter(Is64Bit, IsV8Plus, OSABI);
365363
}
366364
};
367365

llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,11 @@ using namespace llvm;
2121
namespace {
2222
class SparcELFObjectWriter : public MCELFObjectTargetWriter {
2323
public:
24-
SparcELFObjectWriter(bool Is64Bit, bool IsV8Plus, bool HasV9, uint8_t OSABI)
24+
SparcELFObjectWriter(bool Is64Bit, bool IsV8Plus, uint8_t OSABI)
2525
: MCELFObjectTargetWriter(
2626
Is64Bit, OSABI,
27-
Is64Bit
28-
? ELF::EM_SPARCV9
29-
// Note that we still need to emit an EM_SPARC32PLUS object
30-
// even when V8+ isn't explicitly requested, if we're
31-
// targeting a V9-capable CPU. This matches GAS behavior upon
32-
// encountering any V9 instructions in its input.
33-
: ((IsV8Plus || HasV9) ? ELF::EM_SPARC32PLUS : ELF::EM_SPARC),
27+
Is64Bit ? ELF::EM_SPARCV9
28+
: (IsV8Plus ? ELF::EM_SPARC32PLUS : ELF::EM_SPARC),
3429
/*HasRelocationAddend*/ true) {}
3530

3631
~SparcELFObjectWriter() override = default;
@@ -153,8 +148,6 @@ bool SparcELFObjectWriter::needsRelocateWithSymbol(const MCValue &,
153148
}
154149

155150
std::unique_ptr<MCObjectTargetWriter>
156-
llvm::createSparcELFObjectWriter(bool Is64Bit, bool IsV8Plus, bool HasV9,
157-
uint8_t OSABI) {
158-
return std::make_unique<SparcELFObjectWriter>(Is64Bit, IsV8Plus, HasV9,
159-
OSABI);
151+
llvm::createSparcELFObjectWriter(bool Is64Bit, bool IsV8Plus, uint8_t OSABI) {
152+
return std::make_unique<SparcELFObjectWriter>(Is64Bit, IsV8Plus, OSABI);
160153
}

llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ createSparcMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {
8686

8787
static MCTargetStreamer *
8888
createObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
89-
return new SparcTargetELFStreamer(S);
89+
return new SparcTargetELFStreamer(S, STI);
9090
}
9191

9292
static MCTargetStreamer *createTargetAsmStreamer(MCStreamer &S,

llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,8 @@ MCCodeEmitter *createSparcMCCodeEmitter(const MCInstrInfo &MCII,
3434
MCAsmBackend *createSparcAsmBackend(const Target &T, const MCSubtargetInfo &STI,
3535
const MCRegisterInfo &MRI,
3636
const MCTargetOptions &Options);
37-
std::unique_ptr<MCObjectTargetWriter> createSparcELFObjectWriter(bool Is64Bit,
38-
bool IsV8Plus,
39-
bool HasV9,
40-
uint8_t OSABI);
37+
std::unique_ptr<MCObjectTargetWriter>
38+
createSparcELFObjectWriter(bool Is64Bit, bool IsV8Plus, uint8_t OSABI);
4139

4240
// Defines symbolic names for Sparc v9 ASI tag names.
4341
namespace SparcASITag {

llvm/lib/Target/Sparc/MCTargetDesc/SparcTargetStreamer.cpp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,24 @@
1212

1313
#include "SparcTargetStreamer.h"
1414
#include "SparcInstPrinter.h"
15+
#include "SparcMCTargetDesc.h"
16+
#include "llvm/BinaryFormat/ELF.h"
17+
#include "llvm/MC/MCAssembler.h"
1518
#include "llvm/MC/MCRegister.h"
19+
#include "llvm/MC/MCSubtargetInfo.h"
1620
#include "llvm/Support/FormattedStream.h"
1721

1822
using namespace llvm;
1923

24+
static unsigned getEFlagsForFeatureSet(const MCSubtargetInfo &STI) {
25+
unsigned EFlags = 0;
26+
27+
if (STI.hasFeature(Sparc::FeatureV8Plus))
28+
EFlags |= ELF::EF_SPARC_32PLUS;
29+
30+
return EFlags;
31+
}
32+
2033
// pin vtable to this file
2134
SparcTargetStreamer::SparcTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}
2235

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

41-
SparcTargetELFStreamer::SparcTargetELFStreamer(MCStreamer &S)
42-
: SparcTargetStreamer(S) {}
54+
SparcTargetELFStreamer::SparcTargetELFStreamer(MCStreamer &S,
55+
const MCSubtargetInfo &STI)
56+
: SparcTargetStreamer(S) {
57+
MCAssembler &MCA = getStreamer().getAssembler();
58+
unsigned EFlags = MCA.getELFHeaderEFlags();
59+
60+
EFlags |= getEFlagsForFeatureSet(STI);
61+
62+
MCA.setELFHeaderEFlags(EFlags);
63+
}
4364

4465
MCELFStreamer &SparcTargetELFStreamer::getStreamer() {
4566
return static_cast<MCELFStreamer &>(Streamer);

llvm/lib/Target/Sparc/MCTargetDesc/SparcTargetStreamer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class SparcTargetAsmStreamer : public SparcTargetStreamer {
4040
// This part is for ELF object output
4141
class SparcTargetELFStreamer : public SparcTargetStreamer {
4242
public:
43-
SparcTargetELFStreamer(MCStreamer &S);
43+
SparcTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);
4444
MCELFStreamer &getStreamer();
4545
void emitSparcRegisterIgnore(unsigned reg) override {}
4646
void emitSparcRegisterScratch(unsigned reg) override {}

llvm/test/MC/Sparc/elf-sparc-machine-type.s

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
## Emit correct machine type depending on triple and cpu options.
22
## - `-triple sparc` emits an object of type EM_SPARC;
3-
## - `-triple sparc -mcpu=v9` or `-triple sparc -mattr=+v8plus` emits EM_SPARC32PLUS; and
3+
## - `-triple sparc -mattr=+v8plus` emits EM_SPARC32PLUS; and
44
## - `-triple sparcv9` emits EM_SPARCV9.
55

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

0 commit comments

Comments
 (0)