summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/VE/VEAsmPrinter.cpp
diff options
context:
space:
mode:
authorKazushi (Jam) Marukawa <marukawa@nec.com>2020-01-14 09:58:39 +0100
committerSimon Moll <simon.moll@emea.nec.com>2020-01-15 09:55:16 +0100
commit064859bde79ccd221fd5196fd2d889014c5435c4 (patch)
tree5a98439120d344e7b1649c0fd2cda0b26fbbaa65 /llvm/lib/Target/VE/VEAsmPrinter.cpp
parentbe8f217b180e134d568ff491b045d05c137b6234 (diff)
downloadbcm5719-llvm-064859bde79ccd221fd5196fd2d889014c5435c4.tar.gz
bcm5719-llvm-064859bde79ccd221fd5196fd2d889014c5435c4.zip
[VE] Minimal codegen for empty functions
Summary: This patch implements minimal VE code generation for empty function bodies (no args, no value return). Contents * empty function code generation test. * Minimal function prologue & epilogue emission * Instruction formats and instruction definitions as far as required for the empty function prologue & epilogue. * I64 register class definitions. Reviewed By: arsenm Differential Revision: https://reviews.llvm.org/D72598
Diffstat (limited to 'llvm/lib/Target/VE/VEAsmPrinter.cpp')
-rw-r--r--llvm/lib/Target/VE/VEAsmPrinter.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/llvm/lib/Target/VE/VEAsmPrinter.cpp b/llvm/lib/Target/VE/VEAsmPrinter.cpp
new file mode 100644
index 00000000000..918f2a1acda
--- /dev/null
+++ b/llvm/lib/Target/VE/VEAsmPrinter.cpp
@@ -0,0 +1,78 @@
+//===-- VEAsmPrinter.cpp - VE LLVM assembly writer ------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file contains a printer that converts from our internal representation
+// of machine-dependent LLVM code to GAS-format VE assembly language.
+//
+//===----------------------------------------------------------------------===//
+
+#include "InstPrinter/VEInstPrinter.h"
+#include "MCTargetDesc/VETargetStreamer.h"
+#include "VE.h"
+#include "VEInstrInfo.h"
+#include "VETargetMachine.h"
+#include "llvm/CodeGen/AsmPrinter.h"
+#include "llvm/CodeGen/MachineInstr.h"
+#include "llvm/CodeGen/MachineModuleInfoImpls.h"
+#include "llvm/CodeGen/MachineRegisterInfo.h"
+#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
+#include "llvm/IR/Mangler.h"
+#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCInst.h"
+#include "llvm/MC/MCInstBuilder.h"
+#include "llvm/MC/MCStreamer.h"
+#include "llvm/MC/MCSymbol.h"
+#include "llvm/Support/TargetRegistry.h"
+#include "llvm/Support/raw_ostream.h"
+using namespace llvm;
+
+#define DEBUG_TYPE "ve-asmprinter"
+
+namespace {
+class VEAsmPrinter : public AsmPrinter {
+ VETargetStreamer &getTargetStreamer() {
+ return static_cast<VETargetStreamer &>(*OutStreamer->getTargetStreamer());
+ }
+
+public:
+ explicit VEAsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer)
+ : AsmPrinter(TM, std::move(Streamer)) {}
+
+ StringRef getPassName() const override { return "VE Assembly Printer"; }
+
+ void EmitInstruction(const MachineInstr *MI) override;
+
+ static const char *getRegisterName(unsigned RegNo) {
+ return VEInstPrinter::getRegisterName(RegNo);
+ }
+};
+} // end of anonymous namespace
+
+void VEAsmPrinter::EmitInstruction(const MachineInstr *MI) {
+
+ switch (MI->getOpcode()) {
+ default:
+ break;
+ case TargetOpcode::DBG_VALUE:
+ // FIXME: Debug Value.
+ return;
+ }
+ MachineBasicBlock::const_instr_iterator I = MI->getIterator();
+ MachineBasicBlock::const_instr_iterator E = MI->getParent()->instr_end();
+ do {
+ MCInst TmpInst;
+ LowerVEMachineInstrToMCInst(&*I, TmpInst, *this);
+ EmitToStreamer(*OutStreamer, TmpInst);
+ } while ((++I != E) && I->isInsideBundle()); // Delay slot check.
+}
+
+// Force static initialization.
+extern "C" void LLVMInitializeVEAsmPrinter() {
+ RegisterAsmPrinter<VEAsmPrinter> X(getTheVETarget());
+}
OpenPOWER on IntegriCloud