brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.1 KiB · cb101e4 Raw
147 lines · c
1//===-- SystemZAsmPrinter.h - SystemZ LLVM assembly printer ----*- 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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZASMPRINTER_H10#define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZASMPRINTER_H11 12#include "MCTargetDesc/SystemZTargetStreamer.h"13#include "SystemZMCInstLower.h"14#include "SystemZTargetMachine.h"15#include "llvm/CodeGen/AsmPrinter.h"16#include "llvm/CodeGen/StackMaps.h"17#include "llvm/MC/MCInstBuilder.h"18#include "llvm/Support/Compiler.h"19 20namespace llvm {21class MCStreamer;22class MachineInstr;23class Module;24class raw_ostream;25 26class LLVM_LIBRARY_VISIBILITY SystemZAsmPrinter : public AsmPrinter {27public:28  static char ID;29 30private:31  MCSymbol *CurrentFnPPA1Sym;     // PPA1 Symbol.32  MCSymbol *CurrentFnEPMarkerSym; // Entry Point Marker.33  MCSymbol *PPA2Sym;34 35  SystemZTargetStreamer *getTargetStreamer() {36    MCTargetStreamer *TS = OutStreamer->getTargetStreamer();37    assert(TS && "do not have a target streamer");38    return static_cast<SystemZTargetStreamer *>(TS);39  }40 41  /// Call type information for XPLINK.42  enum class CallType {43    BASR76 = 0,   // b'x000' == BASR  r7,r644    BRAS7 = 1,    // b'x001' == BRAS  r7,ep45    RESVD_2 = 2,  // b'x010'46    BRASL7 = 3,   // b'x011' == BRASL r7,ep47    RESVD_4 = 4,  // b'x100'48    RESVD_5 = 5,  // b'x101'49    BALR1415 = 6, // b'x110' == BALR  r14,r1550    BASR33 = 7,   // b'x111' == BASR  r3,r351  };52 53  // The Associated Data Area (ADA) contains descriptors which help locating54  // external symbols. For each symbol and type, the displacement into the ADA55  // is stored.56  class AssociatedDataAreaTable {57  public:58    using DisplacementTable =59        MapVector<std::pair<const MCSymbol *, unsigned>, uint32_t>;60 61  private:62    const uint64_t PointerSize;63 64    /// The mapping of name/slot type pairs to displacements.65    DisplacementTable Displacements;66 67    /// The next available displacement value. Incremented when new entries into68    /// the ADA are created.69    uint32_t NextDisplacement = 0;70 71  public:72    AssociatedDataAreaTable(uint64_t PointerSize) : PointerSize(PointerSize) {}73 74    /// @brief Add a function descriptor to the ADA.75    /// @param MI Pointer to an ADA_ENTRY instruction.76    /// @return The displacement of the descriptor into the ADA.77    uint32_t insert(const MachineOperand MO);78 79    /// @brief Get the displacement into associated data area (ADA) for a name.80    /// If no  displacement is already associated with the name, assign one and81    /// return it.82    /// @param Sym The symbol for which the displacement should be returned.83    /// @param SlotKind The ADA type.84    /// @return The displacement of the descriptor into the ADA.85    uint32_t insert(const MCSymbol *Sym, unsigned SlotKind);86 87    /// Get the table of GOFF displacements.  This is 'const' since it should88    /// never be modified by anything except the APIs on this class.89    const DisplacementTable &getTable() const { return Displacements; }90 91    uint32_t getNextDisplacement() const { return NextDisplacement; }92  };93 94  AssociatedDataAreaTable ADATable;95 96  void emitPPA1(MCSymbol *FnEndSym);97  void emitPPA2(Module &M);98  void emitADASection();99  void emitIDRLSection(Module &M);100 101public:102  SystemZAsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer)103      : AsmPrinter(TM, std::move(Streamer), ID), CurrentFnPPA1Sym(nullptr),104        CurrentFnEPMarkerSym(nullptr), PPA2Sym(nullptr),105        ADATable(TM.getPointerSize(0)) {}106 107  // Override AsmPrinter.108  StringRef getPassName() const override { return "SystemZ Assembly Printer"; }109  void emitInstruction(const MachineInstr *MI) override;110  void emitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) override;111  void emitEndOfAsmFile(Module &M) override;112  bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,113                       const char *ExtraCode, raw_ostream &OS) override;114  bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,115                             const char *ExtraCode, raw_ostream &OS) override;116 117  bool runOnMachineFunction(MachineFunction &MF) override {118    AsmPrinter::runOnMachineFunction(MF);119 120    // Emit the XRay table for this function.121    emitXRayTable();122 123    return false;124  }125 126  bool doInitialization(Module &M) override {127    SM.reset();128    return AsmPrinter::doInitialization(M);129  }130  void emitFunctionEntryLabel() override;131  void emitFunctionBodyEnd() override;132  void emitStartOfAsmFile(Module &M) override;133 134private:135  void emitCallInformation(CallType CT);136  void LowerFENTRY_CALL(const MachineInstr &MI, SystemZMCInstLower &MCIL);137  void LowerSTACKMAP(const MachineInstr &MI);138  void LowerPATCHPOINT(const MachineInstr &MI, SystemZMCInstLower &Lower);139  void LowerPATCHABLE_FUNCTION_ENTER(const MachineInstr &MI,140                                     SystemZMCInstLower &Lower);141  void LowerPATCHABLE_RET(const MachineInstr &MI, SystemZMCInstLower &Lower);142  void emitAttributes(Module &M);143};144} // end namespace llvm145 146#endif147