Skip to content

Commit ee4b86b

Browse files
committed
[SOL][BPF] Enable the _ExtInt extension on the BPF Target for Solana
Signed-off-by: Sean Young <[email protected]>
1 parent a9186e5 commit ee4b86b

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

clang/lib/Basic/Targets/BPF.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ namespace clang {
2222
namespace targets {
2323

2424
class LLVM_LIBRARY_VISIBILITY BPFTargetInfo : public TargetInfo {
25+
bool HasSolanaFeature = false;
2526
static const Builtin::Info BuiltinInfo[];
2627

2728
public:
@@ -34,21 +35,20 @@ class LLVM_LIBRARY_VISIBILITY BPFTargetInfo : public TargetInfo {
3435
IntMaxType = SignedLong;
3536
Int64Type = SignedLong;
3637
RegParmMax = 5;
37-
auto isSolana = false;
3838
for (auto& it : Opts.FeaturesAsWritten) {
3939
if (it == "+solana") {
40-
isSolana = true;
40+
HasSolanaFeature = true;
4141
break;
4242
}
4343
}
4444
if (Triple.getArch() == llvm::Triple::bpfeb) {
45-
if (isSolana) {
45+
if (HasSolanaFeature) {
4646
resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
4747
} else {
4848
resetDataLayout("E-m:e-p:64:64-i64:64-i128:128-n32:64-S128");
4949
}
5050
} else {
51-
if (isSolana) {
51+
if (HasSolanaFeature) {
5252
resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
5353
} else {
5454
resetDataLayout("e-m:e-p:64:64-i64:64-i128:128-n32:64-S128");
@@ -112,6 +112,8 @@ class LLVM_LIBRARY_VISIBILITY BPFTargetInfo : public TargetInfo {
112112
StringRef CPUName(Name);
113113
return isValidCPUName(CPUName);
114114
}
115+
116+
bool hasExtIntType() const override { return HasSolanaFeature; }
115117
};
116118
} // namespace targets
117119
} // namespace clang

clang/test/CodeGen/ext-int-cc.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
// RUN: %clang_cc1 -triple arm64_32-apple-ios -O3 -disable-llvm-passes -emit-llvm -o - %s | FileCheck %s --check-prefixes=AARCH64
2929
// RUN: %clang_cc1 -triple arm64_32-apple-ios -target-abi darwinpcs -O3 -disable-llvm-passes -emit-llvm -o - %s | FileCheck %s --check-prefixes=AARCH64DARWIN
3030
// RUN: %clang_cc1 -triple arm -O3 -disable-llvm-passes -emit-llvm -o - %s | FileCheck %s --check-prefixes=ARM
31+
// RUN: %clang_cc1 -triple bpf -target-feature +solana -O3 -disable-llvm-passes -emit-llvm -o - %s | FileCheck %s --check-prefixes=BPF
3132

3233
// Make sure 128 and 64 bit versions are passed like integers, and that >128
3334
// is passed indirectly.
@@ -59,6 +60,7 @@ void ParamPassing(_ExtInt(129) a, _ExtInt(128) b, _ExtInt(64) c) {}
5960
// AARCH64: define void @ParamPassing(i129* byval(i129) align 8 %{{.+}}, i128 %{{.+}}, i64 %{{.+}})
6061
// AARCH64DARWIN: define void @ParamPassing(i129* byval(i129) align 8 %{{.+}}, i128 %{{.+}}, i64 %{{.+}})
6162
// ARM: define arm_aapcscc void @ParamPassing(i129* byval(i129) align 8 %{{.+}}, i128* byval(i128) align 8 %{{.+}}, i64 %{{.+}})
63+
// BPF: define void @ParamPassing(i129* byval(i129) align 8 %{{.+}}, i128 %{{.+}}, i64 %{{.+}})
6264

6365
void ParamPassing2(_ExtInt(129) a, _ExtInt(127) b, _ExtInt(63) c) {}
6466
// LIN64: define void @ParamPassing2(i129* byval(i129) align 8 %{{.+}}, i64 %{{.+}}, i64 %{{.+}}, i64 %{{.+}})
@@ -88,6 +90,7 @@ void ParamPassing2(_ExtInt(129) a, _ExtInt(127) b, _ExtInt(63) c) {}
8890
// AARCH64: define void @ParamPassing2(i129* byval(i129) align 8 %{{.+}}, i127 %{{.+}}, i63 %{{.+}})
8991
// AARCH64DARWIN: define void @ParamPassing2(i129* byval(i129) align 8 %{{.+}}, i127 %{{.+}}, i63 %{{.+}})
9092
// ARM: define arm_aapcscc void @ParamPassing2(i129* byval(i129) align 8 %{{.+}}, i127* byval(i127) align 8 %{{.+}}, i63 %{{.+}})
93+
// BPF: define void @ParamPassing2(i129* byval(i129) align 8 %{{.+}}, i127 %{{.+}}, i63 %{{.+}})
9194

9295
// Make sure we follow the signext rules for promotable integer types.
9396
void ParamPassing3(_ExtInt(15) a, _ExtInt(31) b) {}
@@ -118,6 +121,7 @@ void ParamPassing3(_ExtInt(15) a, _ExtInt(31) b) {}
118121
// AARCH64: define void @ParamPassing3(i15 %{{.+}}, i31 %{{.+}})
119122
// AARCH64DARWIN: define void @ParamPassing3(i15 signext %{{.+}}, i31 signext %{{.+}})
120123
// ARM: define arm_aapcscc void @ParamPassing3(i15 signext %{{.+}}, i31 signext %{{.+}})
124+
// BPF: define void @ParamPassing3(i15 signext %{{.+}}, i31 signext %{{.+}})
121125

122126
_ExtInt(63) ReturnPassing(){}
123127
// LIN64: define i64 @ReturnPassing(
@@ -147,6 +151,7 @@ _ExtInt(63) ReturnPassing(){}
147151
// AARCH64: define i63 @ReturnPassing(
148152
// AARCH64DARWIN: define i63 @ReturnPassing(
149153
// ARM: define arm_aapcscc i63 @ReturnPassing(
154+
// BPF: define i63 @ReturnPassing(
150155

151156
_ExtInt(64) ReturnPassing2(){}
152157
// LIN64: define i64 @ReturnPassing2(
@@ -176,6 +181,7 @@ _ExtInt(64) ReturnPassing2(){}
176181
// AARCH64: define i64 @ReturnPassing2(
177182
// AARCH64DARWIN: define i64 @ReturnPassing2(
178183
// ARM: define arm_aapcscc i64 @ReturnPassing2(
184+
// BPF: define i64 @ReturnPassing2(
179185

180186
_ExtInt(127) ReturnPassing3(){}
181187
// LIN64: define { i64, i64 } @ReturnPassing3(
@@ -207,6 +213,7 @@ _ExtInt(127) ReturnPassing3(){}
207213
// AARCH64: define i127 @ReturnPassing3(
208214
// AARCH64DARWIN: define i127 @ReturnPassing3(
209215
// ARM: define arm_aapcscc void @ReturnPassing3(i127* noalias sret
216+
// BPF: define i127 @ReturnPassing3(
210217

211218
_ExtInt(128) ReturnPassing4(){}
212219
// LIN64: define { i64, i64 } @ReturnPassing4(
@@ -236,6 +243,7 @@ _ExtInt(128) ReturnPassing4(){}
236243
// AARCH64: define i128 @ReturnPassing4(
237244
// AARCH64DARWIN: define i128 @ReturnPassing4(
238245
// ARM: define arm_aapcscc void @ReturnPassing4(i128* noalias sret
246+
// BPF: define i128 @ReturnPassing4(
239247

240248
_ExtInt(129) ReturnPassing5(){}
241249
// LIN64: define void @ReturnPassing5(i129* noalias sret
@@ -265,6 +273,7 @@ _ExtInt(129) ReturnPassing5(){}
265273
// AARCH64: define void @ReturnPassing5(i129* noalias sret
266274
// AARCH64DARWIN: define void @ReturnPassing5(i129* noalias sret
267275
// ARM: define arm_aapcscc void @ReturnPassing5(i129* noalias sret
276+
// BPF: define void @ReturnPassing5(i129* noalias sret
268277

269278
// SparcV9 is odd in that it has a return-size limit of 256, not 128 or 64
270279
// like other platforms, so test to make sure this behavior will still work.

0 commit comments

Comments
 (0)