Index: src/IceTargetLowering.cpp |
diff --git a/src/IceTargetLowering.cpp b/src/IceTargetLowering.cpp |
index 39d27fe213551d14f26081886882dcd74a5fd2ab..93b48844f41f828673964af1e2164a8fd21a30f4 100644 |
--- a/src/IceTargetLowering.cpp |
+++ b/src/IceTargetLowering.cpp |
@@ -15,12 +15,14 @@ |
// |
//===----------------------------------------------------------------------===// |
+#include "assembler_arm32.h" |
#include "assembler_ia32.h" |
#include "IceCfg.h" // setError() |
#include "IceCfgNode.h" |
#include "IceOperand.h" |
#include "IceRegAlloc.h" |
#include "IceTargetLowering.h" |
+#include "IceTargetLoweringARM32.h" |
#include "IceTargetLoweringX8632.h" |
namespace Ice { |
@@ -62,34 +64,33 @@ Inst *LoweringContext::getLastInserted() const { |
} |
TargetLowering *TargetLowering::createLowering(TargetArch Target, Cfg *Func) { |
- // These statements can be #ifdef'd to specialize the code generator |
- // to a subset of the available targets. TODO: use CRTP. |
- if (Target == Target_X8632) |
- return TargetX8632::create(Func); |
-#if 0 |
- if (Target == Target_X8664) |
- return IceTargetX8664::create(Func); |
- if (Target == Target_ARM32) |
- return IceTargetARM32::create(Func); |
- if (Target == Target_ARM64) |
- return IceTargetARM64::create(Func); |
-#endif |
+#define SUBZERO_TARGET(X) \ |
+ if (Target == Target_##X) \ |
+ return Target##X::create(Func); |
+#include "llvm/Config/SZTargets.def" |
+ |
Func->setError("Unsupported target"); |
return nullptr; |
} |
TargetLowering::TargetLowering(Cfg *Func) |
: Func(Func), Ctx(Func->getContext()), HasComputedFrame(false), |
- CallsReturnsTwice(false), StackAdjustment(0), Context(), |
- SnapshotStackAdjustment(0) {} |
+ CallsReturnsTwice(false), StackAdjustment(0), NextLabelNumber(0), |
+ Context(), SnapshotStackAdjustment(0) {} |
std::unique_ptr<Assembler> TargetLowering::createAssembler(TargetArch Target, |
Cfg *Func) { |
// These statements can be #ifdef'd to specialize the assembler |
// to a subset of the available targets. TODO: use CRTP. |
+ // TODO(jvoung): use SZTargets.def (rename AssemblerX86 -> AssemblerX8632), |
+ // and make the namespaces consistent. |
if (Target == Target_X8632) |
return std::unique_ptr<Assembler>(new x86::AssemblerX86()); |
- Func->setError("Unsupported target"); |
+ |
+ if (Target == Target_ARM32) |
+ return std::unique_ptr<Assembler>(new AssemblerARM32()); |
+ |
+ Func->setError("Unsupported target assembler"); |
return nullptr; |
} |
@@ -229,22 +230,24 @@ void TargetLowering::regAlloc(RegAllocKind Kind) { |
LinearScan.scan(RegMask, Ctx->getFlags().shouldRandomizeRegAlloc()); |
} |
+InstCall *TargetLowering::makeHelperCall(const IceString &Name, Variable *Dest, |
+ SizeT MaxSrcs) { |
+ const bool HasTailCall = false; |
+ Constant *CallTarget = Ctx->getConstantExternSym(Name); |
+ InstCall *Call = |
+ InstCall::create(Func, MaxSrcs, Dest, CallTarget, HasTailCall); |
+ return Call; |
+} |
+ |
std::unique_ptr<TargetDataLowering> |
TargetDataLowering::createLowering(GlobalContext *Ctx) { |
- // These statements can be #ifdef'd to specialize the code generator |
- // to a subset of the available targets. TODO: use CRTP. |
TargetArch Target = Ctx->getFlags().getTargetArch(); |
- if (Target == Target_X8632) |
- return std::unique_ptr<TargetDataLowering>(TargetDataX8632::create(Ctx)); |
-#if 0 |
- if (Target == Target_X8664) |
- return std::unique_ptr<TargetDataLowering>(TargetDataX8664::create(Ctx)); |
- if (Target == Target_ARM32) |
- return std::unique_ptr<TargetDataLowering>(TargetDataARM32::create(Ctx)); |
- if (Target == Target_ARM64) |
- return std::unique_ptr<TargetDataLowering>(TargetDataARM64::create(Ctx)); |
-#endif |
- llvm_unreachable("Unsupported target"); |
+#define SUBZERO_TARGET(X) \ |
+ if (Target == Target_##X) \ |
+ return std::unique_ptr<TargetDataLowering>(TargetData##X::create(Ctx)); |
+#include "llvm/Config/SZTargets.def" |
+ |
+ llvm_unreachable("Unsupported target data lowering"); |
return nullptr; |
} |