@@ -5950,6 +5950,111 @@ const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5950
5950
#include " clang/Basic/BuiltinsHexagon.def"
5951
5951
};
5952
5952
5953
+ class LanaiTargetInfo : public TargetInfo {
5954
+ // Class for Lanai (32-bit).
5955
+ // The CPU profiles supported by the Lanai backend
5956
+ enum CPUKind {
5957
+ CK_NONE,
5958
+ CK_V11,
5959
+ } CPU;
5960
+
5961
+ static const TargetInfo::GCCRegAlias GCCRegAliases[];
5962
+ static const char *const GCCRegNames[];
5963
+
5964
+ public:
5965
+ LanaiTargetInfo (const llvm::Triple &Triple) : TargetInfo(Triple) {
5966
+ // Description string has to be kept in sync with backend.
5967
+ resetDataLayout (" E" // Big endian
5968
+ " -m:e" // ELF name manging
5969
+ " -p:32:32" // 32 bit pointers, 32 bit aligned
5970
+ " -i64:64" // 64 bit integers, 64 bit aligned
5971
+ " -a:0:32" // 32 bit alignment of objects of aggregate type
5972
+ " -n32" // 32 bit native integer width
5973
+ " -S64" // 64 bit natural stack alignment
5974
+ );
5975
+
5976
+ // Setting RegParmMax equal to what mregparm was set to in the old
5977
+ // toolchain
5978
+ RegParmMax = 4 ;
5979
+
5980
+ // Set the default CPU to V11
5981
+ CPU = CK_V11;
5982
+
5983
+ // Temporary approach to make everything at least word-aligned and allow for
5984
+ // safely casting between pointers with different alignment requirements.
5985
+ // TODO: Remove this when there are no more cast align warnings on the
5986
+ // firmware.
5987
+ MinGlobalAlign = 32 ;
5988
+ }
5989
+
5990
+ void getTargetDefines (const LangOptions &Opts,
5991
+ MacroBuilder &Builder) const override {
5992
+ // Define __lanai__ when building for target lanai.
5993
+ Builder.defineMacro (" __lanai__" );
5994
+
5995
+ // Set define for the CPU specified.
5996
+ switch (CPU) {
5997
+ case CK_V11:
5998
+ Builder.defineMacro (" __LANAI_V11__" );
5999
+ break ;
6000
+ case CK_NONE:
6001
+ llvm_unreachable (" Unhandled target CPU" );
6002
+ }
6003
+ }
6004
+
6005
+ bool setCPU (const std::string &Name) override {
6006
+ CPU = llvm::StringSwitch<CPUKind>(Name)
6007
+ .Case (" v11" , CK_V11)
6008
+ .Default (CK_NONE);
6009
+
6010
+ return CPU != CK_NONE;
6011
+ }
6012
+
6013
+ bool hasFeature (StringRef Feature) const override {
6014
+ return llvm::StringSwitch<bool >(Feature).Case (" lanai" , true ).Default (false );
6015
+ }
6016
+
6017
+ ArrayRef<const char *> getGCCRegNames () const override ;
6018
+
6019
+ ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases () const override ;
6020
+
6021
+ BuiltinVaListKind getBuiltinVaListKind () const override {
6022
+ return TargetInfo::VoidPtrBuiltinVaList;
6023
+ }
6024
+
6025
+ ArrayRef<Builtin::Info> getTargetBuiltins () const override { return None; }
6026
+
6027
+ bool validateAsmConstraint (const char *&Name,
6028
+ TargetInfo::ConstraintInfo &info) const override {
6029
+ return false ;
6030
+ }
6031
+
6032
+ const char *getClobbers () const override { return " " ; }
6033
+ };
6034
+
6035
+ const char *const LanaiTargetInfo::GCCRegNames[] = {
6036
+ " r0" , " r1" , " r2" , " r3" , " r4" , " r5" , " r6" , " r7" , " r8" , " r9" , " r10" ,
6037
+ " r11" , " r12" , " r13" , " r14" , " r15" , " r16" , " r17" , " r18" , " r19" , " r20" , " r21" ,
6038
+ " r22" , " r23" , " r24" , " r25" , " r26" , " r27" , " r28" , " r29" , " r30" , " r31" };
6039
+
6040
+ ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames () const {
6041
+ return llvm::makeArrayRef (GCCRegNames);
6042
+ }
6043
+
6044
+ const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6045
+ {{" pc" }, " r2" },
6046
+ {{" sp" }, " r4" },
6047
+ {{" fp" }, " r5" },
6048
+ {{" rv" }, " r8" },
6049
+ {{" rr1" }, " r10" },
6050
+ {{" rr2" }, " r11" },
6051
+ {{" rca" }, " r15" },
6052
+ };
6053
+
6054
+ ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases () const {
6055
+ return llvm::makeArrayRef (GCCRegAliases);
6056
+ }
6057
+
5953
6058
// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5954
6059
class SparcTargetInfo : public TargetInfo {
5955
6060
static const TargetInfo::GCCRegAlias GCCRegAliases[];
@@ -7672,6 +7777,9 @@ static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
7672
7777
case llvm::Triple::hexagon:
7673
7778
return new HexagonTargetInfo (Triple);
7674
7779
7780
+ case llvm::Triple::lanai:
7781
+ return new LanaiTargetInfo (Triple);
7782
+
7675
7783
case llvm::Triple::aarch64:
7676
7784
if (Triple.isOSDarwin ())
7677
7785
return new DarwinAArch64TargetInfo (Triple);
0 commit comments