Skip to content

Commit aca971d

Browse files
authored
[SPARC][IAS] Add v8plus feature bit (#101367)
Implement handling for `v8plus` feature bit to allow the user to switch between V8 and V8+ mode with 32-bit code. Currently this only sets the appropriate ELF machine type and flags; codegen changes will be done in future patches. This is done as a prerequisite for `-mv8plus` flag on clang (#98713).
1 parent 8b26c02 commit aca971d

File tree

9 files changed

+53
-16
lines changed

9 files changed

+53
-16
lines changed

llvm/include/llvm/BinaryFormat/ELF.h

+13
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

+3-3
Original file line numberDiff line numberDiff line change
@@ -132,15 +132,15 @@ namespace {
132132
class SparcAsmBackend : public MCAsmBackend {
133133
protected:
134134
bool Is64Bit;
135-
bool HasV9;
135+
bool IsV8Plus;
136136

137137
public:
138138
SparcAsmBackend(const MCSubtargetInfo &STI)
139139
: MCAsmBackend(STI.getTargetTriple().isLittleEndian()
140140
? llvm::endianness::little
141141
: llvm::endianness::big),
142142
Is64Bit(STI.getTargetTriple().isArch64Bit()),
143-
HasV9(STI.hasFeature(Sparc::FeatureV9)) {}
143+
IsV8Plus(STI.hasFeature(Sparc::FeatureV8Plus)) {}
144144

145145
unsigned getNumFixupKinds() const override {
146146
return Sparc::NumTargetFixupKinds;
@@ -359,7 +359,7 @@ namespace {
359359
std::unique_ptr<MCObjectTargetWriter>
360360
createObjectTargetWriter() const override {
361361
uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(OSType);
362-
return createSparcELFObjectWriter(Is64Bit, HasV9, OSABI);
362+
return createSparcELFObjectWriter(Is64Bit, IsV8Plus, OSABI);
363363
}
364364
};
365365

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ using namespace llvm;
2121
namespace {
2222
class SparcELFObjectWriter : public MCELFObjectTargetWriter {
2323
public:
24-
SparcELFObjectWriter(bool Is64Bit, bool HasV9, uint8_t OSABI)
24+
SparcELFObjectWriter(bool Is64Bit, bool IsV8Plus, uint8_t OSABI)
2525
: MCELFObjectTargetWriter(
2626
Is64Bit, OSABI,
2727
Is64Bit ? ELF::EM_SPARCV9
28-
: (HasV9 ? ELF::EM_SPARC32PLUS : ELF::EM_SPARC),
28+
: (IsV8Plus ? ELF::EM_SPARC32PLUS : ELF::EM_SPARC),
2929
/*HasRelocationAddend*/ true) {}
3030

3131
~SparcELFObjectWriter() override = default;
@@ -148,6 +148,6 @@ bool SparcELFObjectWriter::needsRelocateWithSymbol(const MCValue &,
148148
}
149149

150150
std::unique_ptr<MCObjectTargetWriter>
151-
llvm::createSparcELFObjectWriter(bool Is64Bit, bool HasV9, uint8_t OSABI) {
152-
return std::make_unique<SparcELFObjectWriter>(Is64Bit, HasV9, OSABI);
151+
llvm::createSparcELFObjectWriter(bool Is64Bit, bool IsV8Plus, uint8_t OSABI) {
152+
return std::make_unique<SparcELFObjectWriter>(Is64Bit, IsV8Plus, OSABI);
153153
}

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

+1-1
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

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ MCAsmBackend *createSparcAsmBackend(const Target &T, const MCSubtargetInfo &STI,
3535
const MCRegisterInfo &MRI,
3636
const MCTargetOptions &Options);
3737
std::unique_ptr<MCObjectTargetWriter>
38-
createSparcELFObjectWriter(bool Is64Bit, bool HasV9, uint8_t OSABI);
38+
createSparcELFObjectWriter(bool Is64Bit, bool IsV8Plus, uint8_t OSABI);
3939

4040
// Defines symbolic names for Sparc v9 ASI tag names.
4141
namespace SparcASITag {

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

+23-2
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/MCELFObjectWriter.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+
ELFObjectWriter &W = getStreamer().getWriter();
58+
unsigned EFlags = W.getELFHeaderEFlags();
59+
60+
EFlags |= getEFlagsForFeatureSet(STI);
61+
62+
W.setELFHeaderEFlags(EFlags);
63+
}
4364

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

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

+1-1
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/lib/Target/Sparc/Sparc.td

+3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ def FeatureNoFMULS
3434
def FeatureV9
3535
: SubtargetFeature<"v9", "IsV9", "true",
3636
"Enable SPARC-V9 instructions">;
37+
def FeatureV8Plus
38+
: SubtargetFeature<"v8plus", "IsV8Plus", "true",
39+
"Enable V8+ mode, allowing use of 64-bit V9 instructions in 32-bit code">;
3740
def FeatureV8Deprecated
3841
: SubtargetFeature<"deprecated-v8", "UseV8DeprecatedInsts", "true",
3942
"Enable deprecated V8 instructions in V9 mode">;

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
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` emits EM_SPARC32PLUS; and
3+
## - `-triple sparc -mattr=+v8plus` emits EM_SPARC32PLUS; and
44
## - `-triple sparcv9` emits EM_SPARCV9.
55

6-
# 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
8-
# RUN: llvm-mc -filetype=obj -triple sparcv9 %s -o - | llvm-readobj -h - | FileCheck --check-prefixes=SPARCV9 %s
6+
# 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 -mattr=+v8plus %s -o - | llvm-readobj -h - | FileCheck --check-prefixes=SPARC32PLUS %s
8+
# RUN: llvm-mc -filetype=obj -triple sparcv9 %s -o - | llvm-readobj -h - | FileCheck --check-prefixes=SPARCV9 %s
99

1010
# SPARC: Machine: EM_SPARC (0x2)
1111
# SPARC32PLUS: Machine: EM_SPARC32PLUS (0x12)

0 commit comments

Comments
 (0)