xref: /aosp_15_r20/external/llvm/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-------- MipsELFStreamer.cpp - ELF Object Output ---------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #include "MipsELFStreamer.h"
11*9880d681SAndroid Build Coastguard Worker #include "MipsTargetStreamer.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInst.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSymbolELF.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ELF.h"
15*9880d681SAndroid Build Coastguard Worker 
16*9880d681SAndroid Build Coastguard Worker using namespace llvm;
17*9880d681SAndroid Build Coastguard Worker 
EmitInstruction(const MCInst & Inst,const MCSubtargetInfo & STI)18*9880d681SAndroid Build Coastguard Worker void MipsELFStreamer::EmitInstruction(const MCInst &Inst,
19*9880d681SAndroid Build Coastguard Worker                                       const MCSubtargetInfo &STI) {
20*9880d681SAndroid Build Coastguard Worker   MCELFStreamer::EmitInstruction(Inst, STI);
21*9880d681SAndroid Build Coastguard Worker 
22*9880d681SAndroid Build Coastguard Worker   MCContext &Context = getContext();
23*9880d681SAndroid Build Coastguard Worker   const MCRegisterInfo *MCRegInfo = Context.getRegisterInfo();
24*9880d681SAndroid Build Coastguard Worker 
25*9880d681SAndroid Build Coastguard Worker   for (unsigned OpIndex = 0; OpIndex < Inst.getNumOperands(); ++OpIndex) {
26*9880d681SAndroid Build Coastguard Worker     const MCOperand &Op = Inst.getOperand(OpIndex);
27*9880d681SAndroid Build Coastguard Worker 
28*9880d681SAndroid Build Coastguard Worker     if (!Op.isReg())
29*9880d681SAndroid Build Coastguard Worker       continue;
30*9880d681SAndroid Build Coastguard Worker 
31*9880d681SAndroid Build Coastguard Worker     unsigned Reg = Op.getReg();
32*9880d681SAndroid Build Coastguard Worker     RegInfoRecord->SetPhysRegUsed(Reg, MCRegInfo);
33*9880d681SAndroid Build Coastguard Worker   }
34*9880d681SAndroid Build Coastguard Worker 
35*9880d681SAndroid Build Coastguard Worker   createPendingLabelRelocs();
36*9880d681SAndroid Build Coastguard Worker }
37*9880d681SAndroid Build Coastguard Worker 
createPendingLabelRelocs()38*9880d681SAndroid Build Coastguard Worker void MipsELFStreamer::createPendingLabelRelocs() {
39*9880d681SAndroid Build Coastguard Worker   MipsTargetELFStreamer *ELFTargetStreamer =
40*9880d681SAndroid Build Coastguard Worker       static_cast<MipsTargetELFStreamer *>(getTargetStreamer());
41*9880d681SAndroid Build Coastguard Worker 
42*9880d681SAndroid Build Coastguard Worker   // FIXME: Also mark labels when in MIPS16 mode.
43*9880d681SAndroid Build Coastguard Worker   if (ELFTargetStreamer->isMicroMipsEnabled()) {
44*9880d681SAndroid Build Coastguard Worker     for (auto *L : Labels) {
45*9880d681SAndroid Build Coastguard Worker       auto *Label = cast<MCSymbolELF>(L);
46*9880d681SAndroid Build Coastguard Worker       getAssembler().registerSymbol(*Label);
47*9880d681SAndroid Build Coastguard Worker       Label->setOther(ELF::STO_MIPS_MICROMIPS);
48*9880d681SAndroid Build Coastguard Worker     }
49*9880d681SAndroid Build Coastguard Worker   }
50*9880d681SAndroid Build Coastguard Worker 
51*9880d681SAndroid Build Coastguard Worker   Labels.clear();
52*9880d681SAndroid Build Coastguard Worker }
53*9880d681SAndroid Build Coastguard Worker 
EmitLabel(MCSymbol * Symbol)54*9880d681SAndroid Build Coastguard Worker void MipsELFStreamer::EmitLabel(MCSymbol *Symbol) {
55*9880d681SAndroid Build Coastguard Worker   MCELFStreamer::EmitLabel(Symbol);
56*9880d681SAndroid Build Coastguard Worker   Labels.push_back(Symbol);
57*9880d681SAndroid Build Coastguard Worker }
58*9880d681SAndroid Build Coastguard Worker 
SwitchSection(MCSection * Section,const MCExpr * Subsection)59*9880d681SAndroid Build Coastguard Worker void MipsELFStreamer::SwitchSection(MCSection *Section,
60*9880d681SAndroid Build Coastguard Worker                                     const MCExpr *Subsection) {
61*9880d681SAndroid Build Coastguard Worker   MCELFStreamer::SwitchSection(Section, Subsection);
62*9880d681SAndroid Build Coastguard Worker   Labels.clear();
63*9880d681SAndroid Build Coastguard Worker }
64*9880d681SAndroid Build Coastguard Worker 
EmitValueImpl(const MCExpr * Value,unsigned Size,SMLoc Loc)65*9880d681SAndroid Build Coastguard Worker void MipsELFStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size,
66*9880d681SAndroid Build Coastguard Worker                                     SMLoc Loc) {
67*9880d681SAndroid Build Coastguard Worker   MCELFStreamer::EmitValueImpl(Value, Size, Loc);
68*9880d681SAndroid Build Coastguard Worker   Labels.clear();
69*9880d681SAndroid Build Coastguard Worker }
70*9880d681SAndroid Build Coastguard Worker 
EmitMipsOptionRecords()71*9880d681SAndroid Build Coastguard Worker void MipsELFStreamer::EmitMipsOptionRecords() {
72*9880d681SAndroid Build Coastguard Worker   for (const auto &I : MipsOptionRecords)
73*9880d681SAndroid Build Coastguard Worker     I->EmitMipsOptionRecord();
74*9880d681SAndroid Build Coastguard Worker }
75*9880d681SAndroid Build Coastguard Worker 
createMipsELFStreamer(MCContext & Context,MCAsmBackend & MAB,raw_pwrite_stream & OS,MCCodeEmitter * Emitter,bool RelaxAll)76*9880d681SAndroid Build Coastguard Worker MCELFStreamer *llvm::createMipsELFStreamer(MCContext &Context,
77*9880d681SAndroid Build Coastguard Worker                                            MCAsmBackend &MAB,
78*9880d681SAndroid Build Coastguard Worker                                            raw_pwrite_stream &OS,
79*9880d681SAndroid Build Coastguard Worker                                            MCCodeEmitter *Emitter,
80*9880d681SAndroid Build Coastguard Worker                                            bool RelaxAll) {
81*9880d681SAndroid Build Coastguard Worker   return new MipsELFStreamer(Context, MAB, OS, Emitter);
82*9880d681SAndroid Build Coastguard Worker }
83