15ffd83dbSDimitry Andric //===- PPCELFStreamer.h - ELF Object Output --------------------*- C++ -*-===// 25ffd83dbSDimitry Andric // 3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric // 75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 85ffd83dbSDimitry Andric // 95ffd83dbSDimitry Andric // This is a custom MCELFStreamer for PowerPC. 105ffd83dbSDimitry Andric // 115ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 125ffd83dbSDimitry Andric 135ffd83dbSDimitry Andric #ifndef LLVM_LIB_TARGET_PPC_MCELFSTREAMER_PPCELFSTREAMER_H 145ffd83dbSDimitry Andric #define LLVM_LIB_TARGET_PPC_MCELFSTREAMER_PPCELFSTREAMER_H 155ffd83dbSDimitry Andric 165ffd83dbSDimitry Andric #include "llvm/MC/MCELFStreamer.h" 175ffd83dbSDimitry Andric #include <memory> 185ffd83dbSDimitry Andric 195ffd83dbSDimitry Andric namespace llvm { 205ffd83dbSDimitry Andric 215ffd83dbSDimitry Andric class MCAsmBackend; 225ffd83dbSDimitry Andric class MCCodeEmitter; 235ffd83dbSDimitry Andric class MCContext; 245ffd83dbSDimitry Andric class MCSubtargetInfo; 255ffd83dbSDimitry Andric 265ffd83dbSDimitry Andric class PPCELFStreamer : public MCELFStreamer { 275ffd83dbSDimitry Andric // We need to keep track of the last label we emitted (only one) because 285ffd83dbSDimitry Andric // depending on whether the label is on the same line as an aligned 295ffd83dbSDimitry Andric // instruction or not, the label may refer to the instruction or the nop. 305ffd83dbSDimitry Andric MCSymbol *LastLabel; 315ffd83dbSDimitry Andric SMLoc LastLabelLoc; 325ffd83dbSDimitry Andric 335ffd83dbSDimitry Andric public: 345ffd83dbSDimitry Andric PPCELFStreamer(MCContext &Context, std::unique_ptr<MCAsmBackend> MAB, 355ffd83dbSDimitry Andric std::unique_ptr<MCObjectWriter> OW, 365ffd83dbSDimitry Andric std::unique_ptr<MCCodeEmitter> Emitter); 375ffd83dbSDimitry Andric 385ffd83dbSDimitry Andric void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override; 395ffd83dbSDimitry Andric 405ffd83dbSDimitry Andric // EmitLabel updates LastLabel and LastLabelLoc when a new label is emitted. 415ffd83dbSDimitry Andric void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override; 425ffd83dbSDimitry Andric private: 435ffd83dbSDimitry Andric void emitPrefixedInstruction(const MCInst &Inst, const MCSubtargetInfo &STI); 44e8d8bef9SDimitry Andric void emitGOTToPCRelReloc(const MCInst &Inst); 45e8d8bef9SDimitry Andric void emitGOTToPCRelLabel(const MCInst &Inst); 465ffd83dbSDimitry Andric }; 475ffd83dbSDimitry Andric 48e8d8bef9SDimitry Andric // Check if the instruction Inst is part of a pair of instructions that make up 49e8d8bef9SDimitry Andric // a link time GOT PC Rel optimization. 50*bdd1243dSDimitry Andric std::optional<bool> isPartOfGOTToPCRelPair(const MCInst &Inst, 51e8d8bef9SDimitry Andric const MCSubtargetInfo &STI); 52e8d8bef9SDimitry Andric 535ffd83dbSDimitry Andric MCELFStreamer *createPPCELFStreamer(MCContext &Context, 545ffd83dbSDimitry Andric std::unique_ptr<MCAsmBackend> MAB, 555ffd83dbSDimitry Andric std::unique_ptr<MCObjectWriter> OW, 565ffd83dbSDimitry Andric std::unique_ptr<MCCodeEmitter> Emitter); 575ffd83dbSDimitry Andric } // end namespace llvm 585ffd83dbSDimitry Andric 595ffd83dbSDimitry Andric #endif // LLVM_LIB_TARGET_PPC_MCELFSTREAMER_PPCELFSTREAMER_H 60