1 //===--- Nios2.h - Declare Nios2 target feature support ---------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file declares Nios2 TargetInfo objects.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_NIOS2_H
15 #define LLVM_CLANG_LIB_BASIC_TARGETS_NIOS2_H
17 #include "clang/Basic/TargetInfo.h"
18 #include "clang/Basic/TargetOptions.h"
19 #include "llvm/ADT/Triple.h"
20 #include "llvm/Support/Compiler.h"
25 class LLVM_LIBRARY_VISIBILITY Nios2TargetInfo : public TargetInfo {
26 void setDataLayout() {
28 resetDataLayout("E-p:32:32:32-i8:8:32-i16:16:32-n32");
30 resetDataLayout("e-p:32:32:32-i8:8:32-i16:16:32-n32");
33 static const Builtin::Info BuiltinInfo[];
38 Nios2TargetInfo(const llvm::Triple &triple, const TargetOptions &opts)
39 : TargetInfo(triple), CPU(opts.CPU), ABI(opts.ABI) {
40 SizeType = UnsignedInt;
41 PtrDiffType = SignedInt;
42 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
46 StringRef getABI() const override { return ABI; }
47 bool setABI(const std::string &Name) override {
48 if (Name == "o32" || Name == "eabi") {
55 bool isValidCPUName(StringRef Name) const override {
56 return Name == "nios2r1" || Name == "nios2r2";
59 void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override {
60 Values.append({"nios2r1", "nios2r2"});
63 bool setCPU(const std::string &Name) override {
64 if (isValidCPUName(Name)) {
71 void getTargetDefines(const LangOptions &Opts,
72 MacroBuilder &Builder) const override;
74 ArrayRef<Builtin::Info> getTargetBuiltins() const override;
76 bool isFeatureSupportedByCPU(StringRef Feature, StringRef CPU) const;
79 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
81 const std::vector<std::string> &FeatureVec) const override {
82 static const char *allFeatures[] = {"nios2r2mandatory", "nios2r2bmx",
83 "nios2r2mpx", "nios2r2cdx"
85 for (const char *feature : allFeatures) {
86 Features[feature] = isFeatureSupportedByCPU(feature, CPU);
91 bool hasFeature(StringRef Feature) const override {
92 return isFeatureSupportedByCPU(Feature, CPU);
95 BuiltinVaListKind getBuiltinVaListKind() const override {
96 return TargetInfo::VoidPtrBuiltinVaList;
99 ArrayRef<const char *> getGCCRegNames() const override {
100 static const char *const GCCRegNames[] = {
101 // CPU register names
102 // Must match second column of GCCRegAliases
103 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
104 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20",
105 "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30",
107 // Floating point register names
108 "ctl0", "ctl1", "ctl2", "ctl3", "ctl4", "ctl5", "ctl6", "ctl7", "ctl8",
109 "ctl9", "ctl10", "ctl11", "ctl12", "ctl13", "ctl14", "ctl15"
111 return llvm::makeArrayRef(GCCRegNames);
114 bool validateAsmConstraint(const char *&Name,
115 TargetInfo::ConstraintInfo &Info) const override {
120 case 'r': // CPU registers.
121 case 'd': // Equivalent to "r" unless generating MIPS16 code.
122 case 'y': // Equivalent to "r", backwards compatibility only.
123 case 'f': // floating-point registers.
124 case 'c': // $25 for indirect jumps
125 case 'l': // lo register
126 case 'x': // hilo register pair
127 Info.setAllowsRegister();
132 const char *getClobbers() const override { return ""; }
134 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
135 static const TargetInfo::GCCRegAlias aliases[] = {
136 {{"zero"}, "r0"}, {{"at"}, "r1"}, {{"et"}, "r24"},
137 {{"bt"}, "r25"}, {{"gp"}, "r26"}, {{"sp"}, "r27"},
138 {{"fp"}, "r28"}, {{"ea"}, "r29"}, {{"ba"}, "r30"},
139 {{"ra"}, "r31"}, {{"status"}, "ctl0"}, {{"estatus"}, "ctl1"},
140 {{"bstatus"}, "ctl2"}, {{"ienable"}, "ctl3"}, {{"ipending"}, "ctl4"},
141 {{"cpuid"}, "ctl5"}, {{"exception"}, "ctl7"}, {{"pteaddr"}, "ctl8"},
142 {{"tlbacc"}, "ctl9"}, {{"tlbmisc"}, "ctl10"}, {{"badaddr"}, "ctl12"},
143 {{"config"}, "ctl13"}, {{"mpubase"}, "ctl14"}, {{"mpuacc"}, "ctl15"},
145 return llvm::makeArrayRef(aliases);
149 } // namespace targets
151 #endif // LLVM_CLANG_LIB_BASIC_TARGETS_NIOS2_H