Skip to content

Commit b045e55

Browse files
committed
[SOL] Add sbf-solana-solana target triplet
1 parent d9d227e commit b045e55

File tree

20 files changed

+69
-11
lines changed

20 files changed

+69
-11
lines changed

clang/include/clang/Basic/Attr.td

+1-1
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ def TargetARM : TargetArch<["arm", "thumb", "armeb", "thumbeb"]>;
364364
def TargetAArch64 : TargetArch<["aarch64"]>;
365365
def TargetAnyArm : TargetArch<!listconcat(TargetARM.Arches, TargetAArch64.Arches)>;
366366
def TargetAVR : TargetArch<["avr"]>;
367-
def TargetBPF : TargetArch<["bpfel", "bpfeb"]>;
367+
def TargetBPF : TargetArch<["bpfel", "bpfeb", "sbf"]>;
368368
def TargetMips32 : TargetArch<["mips", "mipsel"]>;
369369
def TargetAnyMips : TargetArch<["mips", "mipsel", "mips64", "mips64el"]>;
370370
def TargetMSP430 : TargetArch<["msp430"]>;

clang/lib/Basic/Targets.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple,
237237
return new AVRTargetInfo(Triple, Opts);
238238
case llvm::Triple::bpfeb:
239239
case llvm::Triple::bpfel:
240+
case llvm::Triple::sbf:
240241
return new BPFTargetInfo(Triple, Opts);
241242

242243
case llvm::Triple::msp430:

clang/lib/Basic/Targets/BPF.h

+8-4
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,14 @@ class LLVM_LIBRARY_VISIBILITY BPFTargetInfo : public TargetInfo {
3636
IntMaxType = SignedLong;
3737
Int64Type = SignedLong;
3838
RegParmMax = 5;
39-
for (auto& it : Opts.FeaturesAsWritten) {
40-
if (it == "+solana") {
41-
HasSolanaFeature = true;
42-
break;
39+
if (Triple.getArch() == llvm::Triple::sbf) {
40+
HasSolanaFeature = true;
41+
} else {
42+
for (auto& it : Opts.FeaturesAsWritten) {
43+
if (it == "+solana") {
44+
HasSolanaFeature = true;
45+
break;
46+
}
4347
}
4448
}
4549
if (Triple.getArch() == llvm::Triple::bpfeb) {

clang/lib/CodeGen/CGBuiltin.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -5308,6 +5308,7 @@ static Value *EmitTargetArchBuiltinExpr(CodeGenFunction *CGF,
53085308
return CGF->EmitAArch64BuiltinExpr(BuiltinID, E, Arch);
53095309
case llvm::Triple::bpfeb:
53105310
case llvm::Triple::bpfel:
5311+
case llvm::Triple::sbf:
53115312
return CGF->EmitBPFBuiltinExpr(BuiltinID, E);
53125313
case llvm::Triple::x86:
53135314
case llvm::Triple::x86_64:

clang/lib/Driver/ToolChains/Arch/BPF.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ getBPFArchFeaturesFromMarch(const Driver &D, StringRef March,
3838
std::string MarchLowerCase = March.lower();
3939
std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
4040

41+
if (Split.first == "sbf") {
42+
Features.push_back("+solana");
43+
return true;
44+
}
45+
4146
return (Split.first == "bpfel" || Split.first == "bpfeb") &&
4247
(Split.second.size() == 0 || DecodeBPFFeatures(D, Split.second, Features));
4348
}

clang/lib/Driver/ToolChains/Clang.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
349349
break;
350350
case llvm::Triple::bpfeb:
351351
case llvm::Triple::bpfel:
352+
case llvm::Triple::sbf:
352353
bpf::getBPFTargetFeatures(D, Args, Features);
353354
break;
354355
case llvm::Triple::x86:

clang/lib/Driver/ToolChains/CommonArgs.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,7 @@ std::string tools::getCPUName(const ArgList &Args, const llvm::Triple &T,
427427

428428
case llvm::Triple::bpfel:
429429
case llvm::Triple::bpfeb:
430+
case llvm::Triple::sbf:
430431
case llvm::Triple::sparc:
431432
case llvm::Triple::sparcel:
432433
case llvm::Triple::sparcv9:

clang/lib/Driver/ToolChains/Gnu.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -2744,6 +2744,7 @@ bool Generic_GCC::IsIntegratedAssemblerDefault() const {
27442744
case llvm::Triple::avr:
27452745
case llvm::Triple::bpfel:
27462746
case llvm::Triple::bpfeb:
2747+
case llvm::Triple::sbf:
27472748
case llvm::Triple::thumb:
27482749
case llvm::Triple::thumbeb:
27492750
case llvm::Triple::ppc:

clang/lib/Sema/SemaChecking.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1410,6 +1410,7 @@ bool Sema::CheckTSBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
14101410
return CheckAArch64BuiltinFunctionCall(TI, BuiltinID, TheCall);
14111411
case llvm::Triple::bpfeb:
14121412
case llvm::Triple::bpfel:
1413+
case llvm::Triple::sbf:
14131414
return CheckBPFBuiltinFunctionCall(BuiltinID, TheCall);
14141415
case llvm::Triple::hexagon:
14151416
return CheckHexagonBuiltinFunctionCall(BuiltinID, TheCall);

clang/test/CodeGen/target-data.c

+4
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,10 @@
281281
// RUN: FileCheck %s -check-prefix=BPFEB
282282
// BPFEB: target datalayout = "E-m:e-p:64:64-i64:64-i128:128-n32:64-S128"
283283

284+
// RUN: %clang_cc1 -triple sbf -o - -emit-llvm %s | \
285+
// RUN: FileCheck %s -check-prefix=SBF
286+
// SBF: target datalayout = "e-m:e-p:64:64-i64:64-n32:64-S128"
287+
284288
// RUN: %clang_cc1 -triple bpfel -target-feature +solana -o - -emit-llvm %s | \
285289
// RUN: FileCheck %s -check-prefix=BPFELSOL
286290
// BPFELSOL: target datalayout = "e-m:e-p:64:64-i64:64-n32:64-S128"

llvm/include/llvm/ADT/Triple.h

+3
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class Triple {
5656
avr, // AVR: Atmel AVR microcontroller
5757
bpfel, // eBPF or extended BPF or 64-bit BPF (little endian)
5858
bpfeb, // eBPF or extended BPF or 64-bit BPF (big endian)
59+
sbf, // Solana dialect of eBPF (little endian)
5960
csky, // CSKY: csky
6061
hexagon, // Hexagon: hexagon
6162
m68k, // M68k: Motorola 680x0 family
@@ -159,6 +160,7 @@ class Triple {
159160
Mesa,
160161
SUSE,
161162
OpenEmbedded,
163+
Solana,
162164
LastVendorType = OpenEmbedded
163165
};
164166
enum OSType {
@@ -199,6 +201,7 @@ class Triple {
199201
Hurd, // GNU/Hurd
200202
WASI, // Experimental WebAssembly OS
201203
Emscripten,
204+
SolanaOS,
202205
LastOSType = Emscripten
203206
};
204207
enum EnvironmentType {

llvm/lib/Support/Triple.cpp

+16-1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ StringRef Triple::getArchTypeName(ArchType Kind) {
6161
case renderscript64: return "renderscript64";
6262
case riscv32: return "riscv32";
6363
case riscv64: return "riscv64";
64+
case sbf: return "sbf";
6465
case shave: return "shave";
6566
case sparc: return "sparc";
6667
case sparcel: return "sparcel";
@@ -158,6 +159,8 @@ StringRef Triple::getArchTypePrefix(ArchType Kind) {
158159

159160
case ve: return "ve";
160161
case csky: return "csky";
162+
163+
case sbf: return "sbf";
161164
}
162165
}
163166

@@ -179,6 +182,7 @@ StringRef Triple::getVendorTypeName(VendorType Kind) {
179182
case PC: return "pc";
180183
case SCEI: return "scei";
181184
case SUSE: return "suse";
185+
case Solana: return "solana";
182186
}
183187

184188
llvm_unreachable("Invalid VendorType!");
@@ -223,6 +227,7 @@ StringRef Triple::getOSTypeName(OSType Kind) {
223227
case WatchOS: return "watchos";
224228
case Win32: return "windows";
225229
case ZOS: return "zos";
230+
case SolanaOS: return "solana";
226231
}
227232

228233
llvm_unreachable("Invalid OSType");
@@ -267,6 +272,8 @@ static Triple::ArchType parseBPFArch(StringRef ArchName) {
267272
return Triple::bpfeb;
268273
} else if (ArchName.equals("bpf_le") || ArchName.equals("bpfel")) {
269274
return Triple::bpfel;
275+
} else if (ArchName.equals("sbf")) {
276+
return Triple::sbf;
270277
} else {
271278
return Triple::UnknownArch;
272279
}
@@ -302,6 +309,7 @@ Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
302309
.Case("riscv32", riscv32)
303310
.Case("riscv64", riscv64)
304311
.Case("hexagon", hexagon)
312+
.Case("sbf", BPFArch)
305313
.Case("sparc", sparc)
306314
.Case("sparcel", sparcel)
307315
.Case("sparcv9", sparcv9)
@@ -473,7 +481,7 @@ static Triple::ArchType parseArch(StringRef ArchName) {
473481
if (ArchName.startswith("arm") || ArchName.startswith("thumb") ||
474482
ArchName.startswith("aarch64"))
475483
return parseARMArch(ArchName);
476-
if (ArchName.startswith("bpf"))
484+
if (ArchName.startswith("bpf") || ArchName.startswith("sbf"))
477485
return parseBPFArch(ArchName);
478486
}
479487

@@ -497,6 +505,7 @@ static Triple::VendorType parseVendor(StringRef VendorName) {
497505
.Case("mesa", Triple::Mesa)
498506
.Case("suse", Triple::SUSE)
499507
.Case("oe", Triple::OpenEmbedded)
508+
.Case("solana", Triple::Solana)
500509
.Default(Triple::UnknownVendor);
501510
}
502511

@@ -538,6 +547,7 @@ static Triple::OSType parseOS(StringRef OSName) {
538547
.StartsWith("hurd", Triple::Hurd)
539548
.StartsWith("wasi", Triple::WASI)
540549
.StartsWith("emscripten", Triple::Emscripten)
550+
.StartsWith("solana", Triple::SolanaOS)
541551
.Default(Triple::UnknownOS);
542552
}
543553

@@ -726,6 +736,7 @@ static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {
726736
case Triple::renderscript64:
727737
case Triple::riscv32:
728738
case Triple::riscv64:
739+
case Triple::sbf:
729740
case Triple::shave:
730741
case Triple::sparc:
731742
case Triple::sparcel:
@@ -1322,6 +1333,7 @@ static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
13221333
case llvm::Triple::ppc64le:
13231334
case llvm::Triple::renderscript64:
13241335
case llvm::Triple::riscv64:
1336+
case llvm::Triple::sbf:
13251337
case llvm::Triple::sparcv9:
13261338
case llvm::Triple::spir64:
13271339
case llvm::Triple::systemz:
@@ -1354,6 +1366,7 @@ Triple Triple::get32BitArchVariant() const {
13541366
case Triple::bpfeb:
13551367
case Triple::bpfel:
13561368
case Triple::msp430:
1369+
case Triple::sbf:
13571370
case Triple::systemz:
13581371
case Triple::ve:
13591372
T.setArch(UnknownArch);
@@ -1449,6 +1462,7 @@ Triple Triple::get64BitArchVariant() const {
14491462
case Triple::ppc64le:
14501463
case Triple::renderscript64:
14511464
case Triple::riscv64:
1465+
case Triple::sbf:
14521466
case Triple::sparcv9:
14531467
case Triple::spir64:
14541468
case Triple::systemz:
@@ -1600,6 +1614,7 @@ bool Triple::isLittleEndian() const {
16001614
case Triple::renderscript64:
16011615
case Triple::riscv32:
16021616
case Triple::riscv64:
1617+
case Triple::sbf:
16031618
case Triple::shave:
16041619
case Triple::sparcel:
16051620
case Triple::spir64:

llvm/lib/Target/BPF/BPFAbstractMemberAccess.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -708,7 +708,7 @@ uint32_t BPFAbstractMemberAccess::GetFieldInfo(uint32_t InfoKind,
708708
report_fatal_error("too big field size for llvm.bpf.preserve.field.info");
709709

710710
unsigned OffsetInBits = MemberTy->getOffsetInBits();
711-
if (Triple.getArch() == Triple::bpfel)
711+
if (Triple.getArch() == Triple::bpfel || Triple.getArch() == Triple::sbf)
712712
return SBitOffset + 64 - OffsetInBits - SizeInBits;
713713
else
714714
return OffsetInBits + 64 - NextSBitOffset;

llvm/lib/Target/BPF/BPFAsmPrinter.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -152,4 +152,5 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeBPFAsmPrinter() {
152152
RegisterAsmPrinter<BPFAsmPrinter> X(getTheBPFleTarget());
153153
RegisterAsmPrinter<BPFAsmPrinter> Y(getTheBPFbeTarget());
154154
RegisterAsmPrinter<BPFAsmPrinter> Z(getTheBPFTarget());
155+
RegisterAsmPrinter<BPFAsmPrinter> XX(getTheSBFTarget());
155156
}

llvm/lib/Target/BPF/BPFSubtarget.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -63,5 +63,8 @@ BPFSubtarget::BPFSubtarget(const Triple &TT, const std::string &CPU,
6363
: BPFGenSubtargetInfo(TT, CPU, /*TuneCPU*/ CPU, FS), InstrInfo(),
6464
FrameLowering(initializeSubtargetDependencies(CPU, FS)),
6565
TLInfo(TM, *this) {
66+
if (TT.getArch() == Triple::sbf) {
67+
IsSolana = true;
68+
}
6669
TSInfo.setSolanaFlag(IsSolana);
6770
}

llvm/lib/Target/BPF/BPFTargetMachine.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeBPFTarget() {
4040
RegisterTargetMachine<BPFTargetMachine> Y(getTheBPFbeTarget());
4141
RegisterTargetMachine<BPFTargetMachine> Z(getTheBPFTarget());
4242

43+
RegisterTargetMachine<BPFTargetMachine> XX(getTheSBFTarget());
44+
4345
PassRegistry &PR = *PassRegistry::getPassRegistry();
4446
initializeBPFAbstractMemberAccessLegacyPassPass(PR);
4547
initializeBPFPreserveDITypePass(PR);
@@ -51,7 +53,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeBPFTarget() {
5153

5254
// DataLayout: little or big endian
5355
static std::string computeDataLayout(const Triple &TT, StringRef FS) {
54-
bool isSolana = FS.contains("solana");
56+
bool isSolana = TT.getArch() == Triple::sbf || FS.contains("solana");
5557
if (TT.getArch() == Triple::bpfeb) {
5658
return isSolana ? "E-m:e-p:64:64-i64:64-n32:64-S128"
5759
: "E-m:e-p:64:64-i64:64-i128:128-n32:64-S128";

llvm/lib/Target/BPF/Disassembler/BPFDisassembler.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeBPFDisassembler() {
9191
createBPFDisassembler);
9292
TargetRegistry::RegisterMCDisassembler(getTheBPFbeTarget(),
9393
createBPFDisassembler);
94+
TargetRegistry::RegisterMCDisassembler(getTheSBFTarget(),
95+
createBPFDisassembler);
9496
}
9597

9698
static const unsigned GPRDecoderTable[] = {

llvm/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ static MCInstrAnalysis *createBPFInstrAnalysis(const MCInstrInfo *Info) {
9999

100100
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeBPFTargetMC() {
101101
for (Target *T :
102-
{&getTheBPFleTarget(), &getTheBPFbeTarget(), &getTheBPFTarget()}) {
102+
{&getTheBPFleTarget(), &getTheBPFbeTarget(), &getTheBPFTarget(), &getTheSBFTarget()}) {
103103
// Register the MC asm info.
104104
RegisterMCAsmInfo<BPFMCAsmInfo> X(*T);
105105

@@ -128,12 +128,16 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeBPFTargetMC() {
128128
createBPFMCCodeEmitter);
129129
TargetRegistry::RegisterMCCodeEmitter(getTheBPFbeTarget(),
130130
createBPFbeMCCodeEmitter);
131+
TargetRegistry::RegisterMCCodeEmitter(getTheSBFTarget(),
132+
createBPFMCCodeEmitter);
131133

132134
// Register the ASM Backend
133135
TargetRegistry::RegisterMCAsmBackend(getTheBPFleTarget(),
134136
createBPFAsmBackend);
135137
TargetRegistry::RegisterMCAsmBackend(getTheBPFbeTarget(),
136138
createBPFbeAsmBackend);
139+
TargetRegistry::RegisterMCAsmBackend(getTheSBFTarget(),
140+
createBPFAsmBackend);
137141

138142
if (sys::IsLittleEndianHost) {
139143
TargetRegistry::RegisterMCCodeEmitter(getTheBPFTarget(),

llvm/lib/Target/BPF/TargetInfo/BPFTargetInfo.cpp

+10-2
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,20 @@ Target &llvm::getTheBPFTarget() {
2424
return TheBPFTarget;
2525
}
2626

27+
Target &llvm::getTheSBFTarget() {
28+
static Target TheSBFTarget;
29+
return TheSBFTarget;
30+
}
31+
2732
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeBPFTargetInfo() {
2833
TargetRegistry::RegisterTarget(getTheBPFTarget(), "bpf", "BPF (host endian)",
2934
"BPF", [](Triple::ArchType) { return false; },
3035
true);
3136
RegisterTarget<Triple::bpfel, /*HasJIT=*/true> X(
3237
getTheBPFleTarget(), "bpfel", "BPF (little endian)", "BPF");
33-
RegisterTarget<Triple::bpfeb, /*HasJIT=*/true> Y(getTheBPFbeTarget(), "bpfeb",
34-
"BPF (big endian)", "BPF");
38+
RegisterTarget<Triple::bpfeb, /*HasJIT=*/true> Y(
39+
getTheBPFbeTarget(), "bpfeb", "BPF (big endian)", "BPF");
40+
41+
RegisterTarget<Triple::sbf, /*HasJIT=*/true> XX(
42+
getTheSBFTarget(), "sbf", "SBF (little endian)", "SBF");
3543
}

llvm/lib/Target/BPF/TargetInfo/BPFTargetInfo.h

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Target &getTheBPFleTarget();
1717
Target &getTheBPFbeTarget();
1818
Target &getTheBPFTarget();
1919

20+
Target &getTheSBFTarget();
2021
} // namespace llvm
2122

2223
#endif // LLVM_LIB_TARGET_BPF_TARGETINFO_BPFTARGETINFO_H

0 commit comments

Comments
 (0)