void MipsELFStreamer::EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) { MCELFStreamer::EmitInstruction(Inst, STI); MCContext &Context = getContext(); const MCRegisterInfo *MCRegInfo = Context.getRegisterInfo(); MipsTargetELFStreamer *ELFTargetStreamer = static_cast<MipsTargetELFStreamer *>(getTargetStreamer()); for (unsigned OpIndex = 0; OpIndex < Inst.getNumOperands(); ++OpIndex) { const MCOperand &Op = Inst.getOperand(OpIndex); if (!Op.isReg()) continue; unsigned Reg = Op.getReg(); RegInfoRecord->SetPhysRegUsed(Reg, MCRegInfo); } if (ELFTargetStreamer->isMicroMipsEnabled()) { for (auto Label : Labels) { MCSymbolData &Data = getOrCreateSymbolData(Label); // The "other" values are stored in the last 6 bits of the second byte. // The traditional defines for STO values assume the full byte and thus // the shift to pack it. MCELF::setOther(Data, ELF::STO_MIPS_MICROMIPS >> 2); } } Labels.clear(); }
void MipsELFStreamer::createPendingLabelRelocs() { MipsTargetELFStreamer *ELFTargetStreamer = static_cast<MipsTargetELFStreamer *>(getTargetStreamer()); // FIXME: Also mark labels when in MIPS16 mode. if (ELFTargetStreamer->isMicroMipsEnabled()) { for (auto *L : Labels) { auto *Label = cast<MCSymbolELF>(L); getAssembler().registerSymbol(*Label); Label->setOther(ELF::STO_MIPS_MICROMIPS); } } Labels.clear(); }