brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 2b80395 Raw
60 lines · c
1//===- PPCELFStreamer.h - ELF Object Output --------------------*- 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// This is a custom MCELFStreamer for PowerPC.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_LIB_TARGET_PPC_MCELFSTREAMER_PPCELFSTREAMER_H14#define LLVM_LIB_TARGET_PPC_MCELFSTREAMER_PPCELFSTREAMER_H15 16#include "llvm/MC/MCELFStreamer.h"17#include <memory>18 19namespace llvm {20 21class MCAsmBackend;22class MCCodeEmitter;23class MCContext;24class MCSubtargetInfo;25 26class PPCELFStreamer : public MCELFStreamer {27  // We need to keep track of the last label we emitted (only one) because28  // depending on whether the label is on the same line as an aligned29  // instruction or not, the label may refer to the instruction or the nop.30  MCSymbol *LastLabel;31  SMLoc LastLabelLoc;32 33public:34  PPCELFStreamer(MCContext &Context, std::unique_ptr<MCAsmBackend> MAB,35                 std::unique_ptr<MCObjectWriter> OW,36                 std::unique_ptr<MCCodeEmitter> Emitter);37 38  void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override;39 40  // EmitLabel updates LastLabel and LastLabelLoc when a new label is emitted.41  void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;42private:43  void emitPrefixedInstruction(const MCInst &Inst, const MCSubtargetInfo &STI);44  void emitGOTToPCRelReloc(const MCInst &Inst);45  void emitGOTToPCRelLabel(const MCInst &Inst);46};47 48// Check if the instruction Inst is part of a pair of instructions that make up49// a link time GOT PC Rel optimization.50std::optional<bool> isPartOfGOTToPCRelPair(const MCInst &Inst,51                                           const MCSubtargetInfo &STI);52 53MCStreamer *createPPCELFStreamer(const Triple &, MCContext &,54                                 std::unique_ptr<MCAsmBackend> &&MAB,55                                 std::unique_ptr<MCObjectWriter> &&OW,56                                 std::unique_ptr<MCCodeEmitter> &&Emitter);57} // end namespace llvm58 59#endif // LLVM_LIB_TARGET_PPC_MCELFSTREAMER_PPCELFSTREAMER_H60