[Nios2] final infrastructure to provide compilation of a return from a function
This patch includes all missing functionality needed to provide first
compilation of a simple program that just returns from a function.
I've added a test case that checks for "ret" instruction printed in assembly
output.
Patch by Andrei Grischenko (andrei.l.grischenko@intel.com)
Differential revision: https://reviews.llvm.org/D39688
llvm-svn: 320035
diff --git a/llvm/lib/Target/Nios2/Nios2TargetMachine.cpp b/llvm/lib/Target/Nios2/Nios2TargetMachine.cpp
index 7370dac..b7594dd 100644
--- a/llvm/lib/Target/Nios2/Nios2TargetMachine.cpp
+++ b/llvm/lib/Target/Nios2/Nios2TargetMachine.cpp
@@ -13,6 +13,7 @@
#include "Nios2TargetMachine.h"
#include "Nios2.h"
+#include "Nios2TargetObjectFile.h"
#include "llvm/CodeGen/TargetPassConfig.h"
#include "llvm/Support/TargetRegistry.h"
@@ -36,14 +37,27 @@
return *RM;
}
+static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM,
+ Reloc::Model RM, bool JIT) {
+ if (CM)
+ return *CM;
+ return CodeModel::Small;
+}
+
Nios2TargetMachine::Nios2TargetMachine(const Target &T, const Triple &TT,
StringRef CPU, StringRef FS,
const TargetOptions &Options,
Optional<Reloc::Model> RM,
Optional<CodeModel::Model> CM,
CodeGenOpt::Level OL, bool JIT)
- : LLVMTargetMachine(T, computeDataLayout(), TT, CPU, FS, Options,
- getEffectiveRelocModel(RM), *CM, OL) {}
+ : LLVMTargetMachine(
+ T, computeDataLayout(), TT, CPU, FS, Options,
+ getEffectiveRelocModel(RM),
+ getEffectiveCodeModel(CM, getEffectiveRelocModel(RM), JIT), OL),
+ TLOF(make_unique<Nios2TargetObjectFile>()),
+ Subtarget(TT, CPU, FS, *this) {
+ initAsmInfo();
+}
Nios2TargetMachine::~Nios2TargetMachine() {}
@@ -82,6 +96,7 @@
}
void addCodeGenPrepare() override;
+ bool addInstSelector() override;
void addIRPasses() override;
};
} // namespace
@@ -95,3 +110,10 @@
}
void Nios2PassConfig::addIRPasses() { TargetPassConfig::addIRPasses(); }
+
+// Install an instruction selector pass using
+// the ISelDag to gen Nios2 code.
+bool Nios2PassConfig::addInstSelector() {
+ addPass(createNios2ISelDag(getNios2TargetMachine(), getOptLevel()));
+ return false;
+}