1 | //===- ARCAsmPrinter.cpp - ARC LLVM assembly writer -------------*- C++ -*-===// |
---|---|
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file contains a printer that converts from our internal representation |
10 | // of machine-dependent LLVM code to GNU format ARC assembly language. |
11 | // |
12 | //===----------------------------------------------------------------------===// |
13 | |
14 | #include "ARC.h" |
15 | #include "ARCMCInstLower.h" |
16 | #include "ARCSubtarget.h" |
17 | #include "ARCTargetMachine.h" |
18 | #include "MCTargetDesc/ARCInstPrinter.h" |
19 | #include "TargetInfo/ARCTargetInfo.h" |
20 | #include "llvm/CodeGen/AsmPrinter.h" |
21 | #include "llvm/CodeGen/MachineInstr.h" |
22 | #include "llvm/MC/MCAsmInfo.h" |
23 | #include "llvm/MC/MCInst.h" |
24 | #include "llvm/MC/MCStreamer.h" |
25 | #include "llvm/MC/TargetRegistry.h" |
26 | #include "llvm/Support/raw_ostream.h" |
27 | |
28 | using namespace llvm; |
29 | |
30 | #define DEBUG_TYPE "asm-printer" |
31 | |
32 | namespace { |
33 | |
34 | class ARCAsmPrinter : public AsmPrinter { |
35 | ARCMCInstLower MCInstLowering; |
36 | |
37 | public: |
38 | explicit ARCAsmPrinter(TargetMachine &TM, |
39 | std::unique_ptr<MCStreamer> Streamer) |
40 | : AsmPrinter(TM, std::move(Streamer)), |
41 | MCInstLowering(&OutContext, *this) {} |
42 | |
43 | StringRef getPassName() const override { return "ARC Assembly Printer"; } |
44 | void emitInstruction(const MachineInstr *MI) override; |
45 | |
46 | bool runOnMachineFunction(MachineFunction &MF) override; |
47 | }; |
48 | |
49 | } // end anonymous namespace |
50 | |
51 | void ARCAsmPrinter::emitInstruction(const MachineInstr *MI) { |
52 | ARC_MC::verifyInstructionPredicates(MI->getOpcode(), |
53 | getSubtargetInfo().getFeatureBits()); |
54 | |
55 | SmallString<128> Str; |
56 | raw_svector_ostream O(Str); |
57 | |
58 | switch (MI->getOpcode()) { |
59 | case ARC::DBG_VALUE: |
60 | llvm_unreachable("Should be handled target independently"); |
61 | break; |
62 | } |
63 | |
64 | MCInst TmpInst; |
65 | MCInstLowering.Lower(MI, OutMI&: TmpInst); |
66 | EmitToStreamer(S&: *OutStreamer, Inst: TmpInst); |
67 | } |
68 | |
69 | bool ARCAsmPrinter::runOnMachineFunction(MachineFunction &MF) { |
70 | // Functions are 4-byte aligned. |
71 | MF.ensureAlignment(A: Align(4)); |
72 | return AsmPrinter::runOnMachineFunction(MF); |
73 | } |
74 | |
75 | // Force static initialization. |
76 | extern "C"LLVM_EXTERNAL_VISIBILITY void LLVMInitializeARCAsmPrinter() { |
77 | RegisterAsmPrinter<ARCAsmPrinter> X(getTheARCTarget()); |
78 | } |
79 |