edward-jones created this revision.
edward-jones added a subscriber: cfe-commits.
AAP is a Harvard architecture, with features representative of a large range of
deeply embedded microprocessors. It aims to aid the development and maintenance
of other out-of-tree deeply embedded systems.
http://reviews.llvm.org/D12192
Files:
lib/Basic/Targets.cpp
lib/Driver/Driver.cpp
lib/Driver/ToolChains.cpp
lib/Driver/ToolChains.h
lib/Driver/Tools.cpp
lib/Driver/Tools.h
lib/Headers/float.h
Index: lib/Headers/float.h
===================================================================
--- lib/Headers/float.h
+++ lib/Headers/float.h
@@ -74,7 +74,14 @@
/* Characteristics of floating point types, C99 5.2.4.2.2 */
#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
-#define FLT_ROUNDS (__builtin_flt_rounds())
+
+/* __builtin_flt_rounds is not supported by AAP, and the rounding mode cannot
+ be changed anyway so we just default to 'to nearest' */
+#ifdef __AAP__
+ #define FLT_ROUNDS 1
+#else
+ #define FLT_ROUNDS (__builtin_flt_rounds())
+#endif
#define FLT_RADIX __FLT_RADIX__
#define FLT_MANT_DIG __FLT_MANT_DIG__
Index: lib/Driver/Tools.h
===================================================================
--- lib/Driver/Tools.h
+++ lib/Driver/Tools.h
@@ -57,6 +57,8 @@
const InputInfo &Output,
const InputInfoList &Inputs) const;
+ void AddAAPTargetArgs(const llvm::opt::ArgList &Args,
+ llvm::opt::ArgStringList &CmdArgs) const;
void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const;
void AddARMTargetArgs(const llvm::opt::ArgList &Args,
@@ -795,6 +797,35 @@
};
} // end namespace SHAVE
+
+namespace AAP {
+ class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
+ public:
+ Assemble(const ToolChain &TC) : Tool("AAP::Assemble", "aap-as", TC)
+ {}
+
+ bool hasIntegratedCPP() const override { return false; }
+ void ConstructJob(Compilation &C, const JobAction &JA,
+ const InputInfo &Output,
+ const InputInfoList &Inputs,
+ const llvm::opt::ArgList &TCArgs,
+ const char *LinkingOutput) const override;
+ };
+ class LLVM_LIBRARY_VISIBILITY Link : public Tool {
+ public:
+ Link(const ToolChain &TC) : Tool("AAP::Link", "aap-ld", TC)
+ {}
+
+ bool hasIntegratedCPP() const override { return false; }
+ bool isLinkJob() const override { return true; }
+ void ConstructJob(Compilation &C, const JobAction &JA,
+ const InputInfo &Output,
+ const InputInfoList &Inputs,
+ const llvm::opt::ArgList &TCArgs,
+ const char *LinkingOutput) const override;
+ };
+}
+
} // end namespace tools
} // end namespace driver
} // end namespace clang
Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -1900,6 +1900,11 @@
CmdArgs.push_back("-machine-sink-split=0");
}
+void Clang::AddAAPTargetArgs(const ArgList &Args,
+ ArgStringList &CmdArgs) const {
+ return;
+}
+
// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
static bool DecodeAArch64Features(const Driver &D, StringRef text,
std::vector<const char *> &Features) {
@@ -2574,8 +2579,9 @@
static bool shouldUseFramePointerForTarget(const ArgList &Args,
const llvm::Triple &Triple) {
- // XCore never wants frame pointers, regardless of OS.
- if (Triple.getArch() == llvm::Triple::xcore) {
+ // XCore and AAP never want frame pointers, regardless of OS.
+ if ((Triple.getArch() == llvm::Triple::aap) ||
+ (Triple.getArch() == llvm::Triple::xcore)) {
return false;
}
@@ -3600,6 +3606,10 @@
default:
break;
+ case llvm::Triple::aap:
+ AddAAPTargetArgs(Args, CmdArgs);
+ break;
+
case llvm::Triple::arm:
case llvm::Triple::armeb:
case llvm::Triple::thumb:
@@ -9644,3 +9654,71 @@
C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
CmdArgs, Inputs));
}
+
+void AAP::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
+ const InputInfo &Output,
+ const InputInfoList &Inputs,
+ const ArgList &Args,
+ const char *LinkingOutput) const {
+ ArgStringList CmdArgs;
+
+ // Add input assembly files to command line
+ for (InputInfoList::const_iterator it = Inputs.begin(), ie = Inputs.end();
+ it != ie;
+ ++it) {
+ const InputInfo &II = *it;
+ CmdArgs.push_back(II.getFilename());
+ }
+
+ const char *Exec =
+ Args.MakeArgString(getToolChain().GetProgramPath("aap-as"));
+
+ C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
+}
+
+void AAP::Link::ConstructJob(Compilation &C, const JobAction &JA,
+ const InputInfo &Output,
+ const InputInfoList &Inputs,
+ const ArgList &Args,
+ const char *LinkingOutput) const {
+ ArgStringList CmdArgs;
+
+ // Add crt0 and libc
+ const toolchains::AAP& ToolChain =
+ static_cast<const toolchains::AAP&>(getToolChain());
+ const Driver &D = ToolChain.getDriver();
+
+ const std::string InstallPrefix = D.InstalledDir;
+ const std::string LibFilesDir = InstallPrefix + "/../aap/lib";
+ const std::string crt0 = LibFilesDir + "/crt0.o";
+ const std::string libpath = "-L" + LibFilesDir;
+
+ if (!Args.hasArg(options::OPT_nostdlib) &&
+ !Args.hasArg(options::OPT_nostartfiles)) {
+ CmdArgs.push_back(Args.MakeArgString(crt0));
+ }
+ AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
+
+ CmdArgs.push_back(Args.MakeArgString(libpath));
+ if (!Args.hasArg(options::OPT_nostdlib)) {
+ CmdArgs.push_back("-lc");
+ CmdArgs.push_back("-laap");
+ CmdArgs.push_back("-lcompiler_rt");
+
+ // This may need to link a second time to resolve interdependencies
+ }
+
+ Args.AddAllArgs(CmdArgs, options::OPT_L);
+
+ if (Output.isFilename()) {
+ CmdArgs.push_back("-o");
+ CmdArgs.push_back(Output.getFilename());
+ }
+ else {
+ assert(Output.isNothing() && "Input output");
+ }
+
+ const char *Exec =
+ Args.MakeArgString(getToolChain().GetProgramPath("aap-ld"));
+ C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
+}
Index: lib/Driver/ToolChains.h
===================================================================
--- lib/Driver/ToolChains.h
+++ lib/Driver/ToolChains.h
@@ -925,6 +925,29 @@
mutable std::unique_ptr<Tool> Assembler;
};
+class LLVM_LIBRARY_VISIBILITY AAP : public ToolChain {
+public:
+ AAP(const Driver &D, const llvm::Triple &Triple,
+ const llvm::opt::ArgList &Args);
+protected:
+ Tool *buildAssembler() const override;
+ Tool *buildLinker() const override;
+public:
+ bool isPICDefault() const override { return false; }
+ bool isPIEDefault() const override { return false; }
+ bool isPICDefaultForced() const override { return true; }
+ bool HasNativeLLVMSupport() const override;
+
+ bool IsIntegratedAssemblerDefault() const override { return true; }
+ bool SupportsProfiling() const override { return false; }
+ bool hasBlocksRuntime() const override { return false; }
+
+ void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
+ llvm::opt::ArgStringList &CC1Args) const override;
+ void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
+ llvm::opt::ArgStringList &CC1Args) const override;
+};
+
} // end namespace toolchains
} // end namespace driver
} // end namespace clang
Index: lib/Driver/ToolChains.cpp
===================================================================
--- lib/Driver/ToolChains.cpp
+++ lib/Driver/ToolChains.cpp
@@ -2051,6 +2051,7 @@
case llvm::Triple::sparcel:
case llvm::Triple::sparcv9:
case llvm::Triple::systemz:
+ case llvm::Triple::aap:
return true;
default:
return false;
@@ -3831,3 +3832,45 @@
// assembler to the driver, except not the way it expects.
llvm_unreachable("SHAVEToolChain can't buildAssembler");
}
+
+
+/// AAP tool chain
+AAP::AAP(const Driver &D, const llvm::Triple &Triple,
+ const ArgList &Args) : ToolChain(D, Triple, Args) {
+ // Program paths are assumed to be locatable through the 'PATH' env variable
+}
+
+Tool *AAP::buildAssembler() const {
+ return new tools::AAP::Assemble(*this);
+}
+
+Tool *AAP::buildLinker() const {
+ return new tools::AAP::Link(*this);
+}
+
+bool AAP::HasNativeLLVMSupport() const {
+ return true;
+}
+
+void AAP::AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
+ llvm::opt::ArgStringList &CC1Args) const {
+ const Driver &D = getDriver();
+
+ if (DriverArgs.hasArg(options::OPT_nostdinc) ||
+ DriverArgs.hasArg(options::OPT_nostdlibinc)) {
+ return;
+ }
+
+ // standard system includes are disabled, so we add our own
+ const std::string InstallPrefix = D.InstalledDir;
+ const std::string IncludeDir = InstallPrefix + "/../aap/include";
+ StringRef IncludeDirStr(IncludeDir);
+
+ addSystemIncludes(DriverArgs, CC1Args, IncludeDirStr);
+}
+
+void AAP::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
+ llvm::opt::ArgStringList &CC1Args) const {
+ CC1Args.push_back("-nostdsysteminc");
+ CC1Args.push_back("-dwarf-column-info");
+}
Index: lib/Driver/Driver.cpp
===================================================================
--- lib/Driver/Driver.cpp
+++ lib/Driver/Driver.cpp
@@ -2237,6 +2237,9 @@
case llvm::Triple::tce:
TC = new toolchains::TCEToolChain(*this, Target, Args);
break;
+ case llvm::Triple::aap:
+ TC = new toolchains::AAP(*this, Target, Args);
+ break;
case llvm::Triple::hexagon:
TC = new toolchains::HexagonToolChain(*this, Target, Args);
break;
Index: lib/Basic/Targets.cpp
===================================================================
--- lib/Basic/Targets.cpp
+++ lib/Basic/Targets.cpp
@@ -6068,6 +6068,84 @@
NumNames = llvm::array_lengthof(GCCRegNames);
}
+ class AAPTargetInfo : public TargetInfo {
+ static const char * const GCCRegNames[];
+ public:
+ AAPTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
+ BigEndian = false;
+ TLSSupported = false;
+ IntWidth = 16; IntAlign = 16;
+ LongWidth = 32; LongLongWidth = 64;
+ LongAlign = LongLongAlign = 16;
+ PointerWidth = 16; PointerAlign = 16;
+
+ // float/double alignment needed when accessing va_args
+ FloatWidth = 32; FloatAlign = 16;
+ DoubleWidth = 64; DoubleAlign = 16;
+
+ SuitableAlign = 16;
+ SizeType = UnsignedInt;
+ IntMaxType = SignedLongLong;
+ IntPtrType = SignedInt;
+ PtrDiffType = SignedInt;
+ SigAtomicType = SignedLong;
+ DataLayoutString = "e-m:e-p:16:16-i32:16-i64:16-f32:16-f64:16-n16";
+ }
+ void getTargetDefines(const LangOptions &Opts,
+ MacroBuilder &Builder) const override {
+ Builder.defineMacro("AAP");
+ Builder.defineMacro("__AAP__");
+ }
+ void getTargetBuiltins(const Builtin::Info *&Records,
+ unsigned &NumRecords) const override {
+ Records = nullptr;
+ NumRecords = 0;
+ }
+ bool hasFeature(StringRef Feature) const override {
+ return Feature == "AAP";
+ }
+ void getGCCRegNames(const char * const *&Names,
+ unsigned &NumNames) const override;
+ void getGCCRegAliases(const GCCRegAlias *&Aliases,
+ unsigned &NumAliases) const override {
+ // No aliases.
+ Aliases = nullptr;
+ NumAliases = 0;
+ }
+ bool
+ validateAsmConstraint(const char *&Name,
+ TargetInfo::ConstraintInfo &Info) const override {
+ switch (*Name) {
+ default:
+ return false;
+ case 'r': // CPU registers.
+ Info.setAllowsRegister();
+ return true;
+ }
+ }
+ const char *getClobbers() const override {
+ // FIXME: Is this really right?
+ return "";
+ }
+ BuiltinVaListKind getBuiltinVaListKind() const override {
+ // FIXME: implement
+ return TargetInfo::CharPtrBuiltinVaList;
+ }
+ };
+
+ const char * const AAPTargetInfo::GCCRegNames[] = {
+ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
+ "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
+ "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
+ "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
+ };
+
+ void AAPTargetInfo::getGCCRegNames(const char * const *&Names,
+ unsigned &NumNames) const {
+ Names = GCCRegNames;
+ NumNames = llvm::array_lengthof(GCCRegNames);
+ }
+
// LLVM and Clang cannot be used directly to output native binaries for
// target, but is used to compile C code to llvm bitcode with correct
// type and alignment information.
@@ -7221,6 +7299,9 @@
case llvm::Triple::msp430:
return new MSP430TargetInfo(Triple);
+ case llvm::Triple::aap:
+ return new AAPTargetInfo(Triple);
+
case llvm::Triple::mips:
switch (os) {
case llvm::Triple::Linux:
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits