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