LLVM 24.0.0git
MipsTargetStreamer.cpp
Go to the documentation of this file.
1//===-- MipsTargetStreamer.cpp - Mips Target Streamer Methods -------------===//
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-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file provides Mips specific target streamer methods.
10//
11//===----------------------------------------------------------------------===//
12
13#include "MipsTargetStreamer.h"
16#include "MipsBaseInfo.h"
17#include "MipsELFStreamer.h"
18#include "MipsInstPrinter.h"
19#include "MipsMCTargetDesc.h"
21#include "llvm/MC/MCAsmInfo.h"
22#include "llvm/MC/MCAssembler.h"
23#include "llvm/MC/MCContext.h"
28#include "llvm/MC/MCSymbolELF.h"
31
32using namespace llvm;
33
34static bool isMicroMips(const MCSubtargetInfo *STI) {
35 return STI->hasFeature(Mips::FeatureMicroMips);
36}
37
38static bool isMips32r6(const MCSubtargetInfo *STI) {
39 return STI->hasFeature(Mips::FeatureMips32r6);
40}
41
46
87void MipsTargetStreamer::emitFrame(MCRegister StackReg, unsigned StackSize,
89void MipsTargetStreamer::emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) {}
90void MipsTargetStreamer::emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) {
91}
127 // .cplocal $reg
128 // This directive forces to use the alternate register for context pointer.
129 // For example
130 // .cplocal $4
131 // jal foo
132 // expands to
133 // ld $25, %call16(foo)($4)
134 // jalr $25
135
136 if (!getABI().IsN32() && !getABI().IsN64())
137 return;
138
139 GPReg = Reg;
140
142}
144 int Offset, function_ref<MCRegister()> GetATReg, SMLoc IDLoc,
145 const MCSubtargetInfo *STI) {
147 return true;
148}
150 const MCSymbol &Sym, bool IsReg) {
151}
153 bool SaveLocationIsRegister) {}
154
156
158 if (!ABIFlagsSection.OddSPReg && !ABIFlagsSection.Is32BitABI)
159 report_fatal_error("+nooddspreg is only valid for O32");
160}
178
179void MipsTargetStreamer::emitR(unsigned Opcode, MCRegister Reg0, SMLoc IDLoc,
180 const MCSubtargetInfo *STI) {
181 MCInst TmpInst;
182 TmpInst.setOpcode(Opcode);
183 TmpInst.addOperand(MCOperand::createReg(Reg0));
184 TmpInst.setLoc(IDLoc);
185 getStreamer().emitInstruction(TmpInst, *STI);
186}
187
188void MipsTargetStreamer::emitRX(unsigned Opcode, MCRegister Reg0, MCOperand Op1,
189 SMLoc IDLoc, const MCSubtargetInfo *STI) {
190 MCInst TmpInst;
191 TmpInst.setOpcode(Opcode);
192 TmpInst.addOperand(MCOperand::createReg(Reg0));
193 TmpInst.addOperand(Op1);
194 TmpInst.setLoc(IDLoc);
195 getStreamer().emitInstruction(TmpInst, *STI);
196}
197
198void MipsTargetStreamer::emitRI(unsigned Opcode, MCRegister Reg0, int32_t Imm,
199 SMLoc IDLoc, const MCSubtargetInfo *STI) {
200 emitRX(Opcode, Reg0, MCOperand::createImm(Imm), IDLoc, STI);
201}
202
203void MipsTargetStreamer::emitRR(unsigned Opcode, MCRegister Reg0,
204 MCRegister Reg1, SMLoc IDLoc,
205 const MCSubtargetInfo *STI) {
206 emitRX(Opcode, Reg0, MCOperand::createReg(Reg1), IDLoc, STI);
207}
208
209void MipsTargetStreamer::emitII(unsigned Opcode, int16_t Imm1, int16_t Imm2,
210 SMLoc IDLoc, const MCSubtargetInfo *STI) {
211 MCInst TmpInst;
212 TmpInst.setOpcode(Opcode);
213 TmpInst.addOperand(MCOperand::createImm(Imm1));
214 TmpInst.addOperand(MCOperand::createImm(Imm2));
215 TmpInst.setLoc(IDLoc);
216 getStreamer().emitInstruction(TmpInst, *STI);
217}
218
219void MipsTargetStreamer::emitRRX(unsigned Opcode, MCRegister Reg0,
220 MCRegister Reg1, MCOperand Op2, SMLoc IDLoc,
221 const MCSubtargetInfo *STI) {
222 MCInst TmpInst;
223 TmpInst.setOpcode(Opcode);
224 TmpInst.addOperand(MCOperand::createReg(Reg0));
225 TmpInst.addOperand(MCOperand::createReg(Reg1));
226 TmpInst.addOperand(Op2);
227 TmpInst.setLoc(IDLoc);
228 getStreamer().emitInstruction(TmpInst, *STI);
229}
230
231void MipsTargetStreamer::emitRRR(unsigned Opcode, MCRegister Reg0,
232 MCRegister Reg1, MCRegister Reg2, SMLoc IDLoc,
233 const MCSubtargetInfo *STI) {
234 emitRRX(Opcode, Reg0, Reg1, MCOperand::createReg(Reg2), IDLoc, STI);
235}
236
237void MipsTargetStreamer::emitRRRX(unsigned Opcode, MCRegister Reg0,
238 MCRegister Reg1, MCRegister Reg2,
239 MCOperand Op3, SMLoc IDLoc,
240 const MCSubtargetInfo *STI) {
241 MCInst TmpInst;
242 TmpInst.setOpcode(Opcode);
243 TmpInst.addOperand(MCOperand::createReg(Reg0));
244 TmpInst.addOperand(MCOperand::createReg(Reg1));
245 TmpInst.addOperand(MCOperand::createReg(Reg2));
246 TmpInst.addOperand(Op3);
247 TmpInst.setLoc(IDLoc);
248 getStreamer().emitInstruction(TmpInst, *STI);
249}
250
251void MipsTargetStreamer::emitRRI(unsigned Opcode, MCRegister Reg0,
252 MCRegister Reg1, int16_t Imm, SMLoc IDLoc,
253 const MCSubtargetInfo *STI) {
254 emitRRX(Opcode, Reg0, Reg1, MCOperand::createImm(Imm), IDLoc, STI);
255}
256
257void MipsTargetStreamer::emitRRIII(unsigned Opcode, MCRegister Reg0,
258 MCRegister Reg1, int16_t Imm0, int16_t Imm1,
259 int16_t Imm2, SMLoc IDLoc,
260 const MCSubtargetInfo *STI) {
261 MCInst TmpInst;
262 TmpInst.setOpcode(Opcode);
263 TmpInst.addOperand(MCOperand::createReg(Reg0));
264 TmpInst.addOperand(MCOperand::createReg(Reg1));
265 TmpInst.addOperand(MCOperand::createImm(Imm0));
266 TmpInst.addOperand(MCOperand::createImm(Imm1));
267 TmpInst.addOperand(MCOperand::createImm(Imm2));
268 TmpInst.setLoc(IDLoc);
269 getStreamer().emitInstruction(TmpInst, *STI);
270}
271
273 MCRegister TrgReg, bool Is64Bit,
274 const MCSubtargetInfo *STI) {
275 emitRRR(Is64Bit ? Mips::DADDu : Mips::ADDu, DstReg, SrcReg, TrgReg, SMLoc(),
276 STI);
277}
278
280 int16_t ShiftAmount, SMLoc IDLoc,
281 const MCSubtargetInfo *STI) {
282 if (ShiftAmount >= 32) {
283 emitRRI(Mips::DSLL32, DstReg, SrcReg, ShiftAmount - 32, IDLoc, STI);
284 return;
285 }
286
287 emitRRI(Mips::DSLL, DstReg, SrcReg, ShiftAmount, IDLoc, STI);
288}
289
291 const MCSubtargetInfo *STI) {
292 // The default case of `nop` is `sll $zero, $zero, 0`.
293 unsigned Opc = Mips::SLL;
294 if (isMicroMips(STI) && hasShortDelaySlot) {
295 Opc = isMips32r6(STI) ? Mips::MOVE16_MMR6 : Mips::MOVE16_MM;
296 emitRR(Opc, Mips::R0, Mips::R0, IDLoc, STI);
297 return;
298 }
299
300 if (isMicroMips(STI))
301 Opc = isMips32r6(STI) ? Mips::SLL_MMR6 : Mips::SLL_MM;
302
303 emitRRI(Opc, Mips::R0, Mips::R0, 0, IDLoc, STI);
304}
305
307 if (isMicroMips(STI))
308 emitRR(Mips::MOVE16_MM, Mips::R0, Mips::R0, IDLoc, STI);
309 else
310 emitRRI(Mips::SLL, Mips::R0, Mips::R0, 0, IDLoc, STI);
311}
312
313/// Emit the $gp restore operation for .cprestore.
315 const MCSubtargetInfo *STI) {
316 emitLoadWithImmOffset(Mips::LW, GPReg, Mips::SP, Offset, GPReg, IDLoc, STI);
317}
318
319/// Emit a store instruction with an immediate offset.
321 unsigned Opcode, MCRegister SrcReg, MCRegister BaseReg, int64_t Offset,
322 function_ref<MCRegister()> GetATReg, SMLoc IDLoc,
323 const MCSubtargetInfo *STI) {
324 if (isInt<16>(Offset)) {
325 emitRRI(Opcode, SrcReg, BaseReg, Offset, IDLoc, STI);
326 return;
327 }
328
329 // sw $8, offset($8) => lui $at, %hi(offset)
330 // add $at, $at, $8
331 // sw $8, %lo(offset)($at)
332
333 MCRegister ATReg = GetATReg();
334 if (!ATReg)
335 return;
336
337 unsigned LoOffset = Offset & 0x0000ffff;
338 unsigned HiOffset = (Offset & 0xffff0000) >> 16;
339
340 // If msb of LoOffset is 1(negative number) we must increment HiOffset
341 // to account for the sign-extension of the low part.
342 if (LoOffset & 0x8000)
343 HiOffset++;
344
345 // Generate the base address in ATReg.
346 emitRI(Mips::LUi, ATReg, HiOffset, IDLoc, STI);
347 if (BaseReg != Mips::R0)
348 emitRRR(Mips::ADDu, ATReg, ATReg, BaseReg, IDLoc, STI);
349 // Emit the store with the adjusted base and offset.
350 emitRRI(Opcode, SrcReg, ATReg, LoOffset, IDLoc, STI);
351}
352
353/// Emit a load instruction with an immediate offset. DstReg and TmpReg are
354/// permitted to be the same register iff DstReg is distinct from BaseReg and
355/// DstReg is a GPR. It is the callers responsibility to identify such cases
356/// and pass the appropriate register in TmpReg.
358 unsigned Opcode, MCRegister DstReg, MCRegister BaseReg, int64_t Offset,
359 MCRegister TmpReg, SMLoc IDLoc, const MCSubtargetInfo *STI) {
360 if (isInt<16>(Offset)) {
361 emitRRI(Opcode, DstReg, BaseReg, Offset, IDLoc, STI);
362 return;
363 }
364
365 // 1) lw $8, offset($9) => lui $8, %hi(offset)
366 // add $8, $8, $9
367 // lw $8, %lo(offset)($9)
368 // 2) lw $8, offset($8) => lui $at, %hi(offset)
369 // add $at, $at, $8
370 // lw $8, %lo(offset)($at)
371
372 unsigned LoOffset = Offset & 0x0000ffff;
373 unsigned HiOffset = (Offset & 0xffff0000) >> 16;
374
375 // If msb of LoOffset is 1(negative number) we must increment HiOffset
376 // to account for the sign-extension of the low part.
377 if (LoOffset & 0x8000)
378 HiOffset++;
379
380 // Generate the base address in TmpReg.
381 emitRI(Mips::LUi, TmpReg, HiOffset, IDLoc, STI);
382 if (BaseReg != Mips::R0)
383 emitRRR(Mips::ADDu, TmpReg, TmpReg, BaseReg, IDLoc, STI);
384 // Emit the load with the adjusted base and offset.
385 emitRRI(Opcode, DstReg, TmpReg, LoOffset, IDLoc, STI);
386}
387
391
393 auto &MAI = getStreamer().getContext().getAsmInfo();
394 OS << "\t.dtprelword\t";
395 MAI.printExpr(OS, *Value);
396 OS << '\n';
397}
398
400 auto &MAI = getStreamer().getContext().getAsmInfo();
401 OS << "\t.dtpreldword\t";
402 MAI.printExpr(OS, *Value);
403 OS << '\n';
404}
405
407 auto &MAI = getStreamer().getContext().getAsmInfo();
408 OS << "\t.tprelword\t";
409 MAI.printExpr(OS, *Value);
410 OS << '\n';
411}
412
414 auto &MAI = getStreamer().getContext().getAsmInfo();
415 OS << "\t.tpreldword\t";
416 MAI.printExpr(OS, *Value);
417 OS << '\n';
418}
419
421 auto &MAI = getStreamer().getContext().getAsmInfo();
422 OS << "\t.gpword\t";
423 MAI.printExpr(OS, *Value);
424 OS << '\n';
425}
426
428 auto &MAI = getStreamer().getContext().getAsmInfo();
429 OS << "\t.gpdword\t";
430 MAI.printExpr(OS, *Value);
431 OS << '\n';
432}
433
435 OS << "\t.set\tmicromips\n";
437}
438
440 OS << "\t.set\tnomicromips\n";
442}
443
445 OS << "\t.set\tmips16\n";
447}
448
453
458
460 OS << "\t.set\tnoreorder\n";
462}
463
468
473
478
483
488
493
498
503
508
513
518
523
528
533
538
540 OS << "\t.set\tat=$" << Twine(RegNo) << "\n";
542}
543
548
550 OS << "\t.end\t" << Name << '\n';
551}
552
554 OS << "\t.ent\t" << Symbol.getName() << '\n';
555}
556
557void MipsTargetAsmStreamer::emitDirectiveAbiCalls() { OS << "\t.abicalls\n"; }
558
559void MipsTargetAsmStreamer::emitDirectiveNaN2008() { OS << "\t.nan\t2008\n"; }
560
562 OS << "\t.nan\tlegacy\n";
563}
564
566 OS << "\t.option\tpic0\n";
567}
568
570 OS << "\t.option\tpic2\n";
571}
572
577
578void MipsTargetAsmStreamer::emitFrame(MCRegister StackReg, unsigned StackSize,
580 OS << "\t.frame\t$"
582 << StackSize << ",$"
584}
585
587 OS << "\t.set arch=" << Arch << "\n";
589}
590
595
600
605
610
615
620
625
630
635
640
645
650
655
660
665
670
675
680
685
690
695
700
705
710
715
716// Print a 32 bit hex number with all numbers.
717static void printHex32(unsigned Value, raw_ostream &OS) {
718 OS << "0x";
719 for (int i = 7; i >= 0; i--)
720 OS.write_hex((Value & (0xF << (i * 4))) >> (i * 4));
721}
722
723void MipsTargetAsmStreamer::emitMask(unsigned CPUBitmask,
724 int CPUTopSavedRegOff) {
725 OS << "\t.mask \t";
726 printHex32(CPUBitmask, OS);
727 OS << ',' << CPUTopSavedRegOff << '\n';
728}
729
730void MipsTargetAsmStreamer::emitFMask(unsigned FPUBitmask,
731 int FPUTopSavedRegOff) {
732 OS << "\t.fmask\t";
733 printHex32(FPUBitmask, OS);
734 OS << "," << FPUTopSavedRegOff << '\n';
735}
736
742
748
754
756 int Offset, function_ref<MCRegister()> GetATReg, SMLoc IDLoc,
757 const MCSubtargetInfo *STI) {
759 OS << "\t.cprestore\t" << Offset << "\n";
760 return true;
761}
762
764 int RegOrOffset,
765 const MCSymbol &Sym,
766 bool IsReg) {
767 OS << "\t.cpsetup\t$"
769
770 if (IsReg)
771 OS << "$"
773 else
774 OS << RegOrOffset;
775
776 OS << ", ";
777
778 OS << Sym.getName();
780}
781
783 bool SaveLocationIsRegister) {
784 OS << "\t.cpreturn";
786}
787
791 OS << "\t.module\tsoftfloat\n";
792 else
793 OS << "\t.module\tfp=" << ABIFlagsSection.getFpABIString(FpABI) << "\n";
794}
795
803
806
807 OS << "\t.module\t" << (ABIFlagsSection.OddSPReg ? "" : "no") << "oddspreg\n";
808}
809
814
819
821 OS << "\t.module\tsoftfloat\n";
822}
823
825 OS << "\t.module\thardfloat\n";
826}
827
829 OS << "\t.module\tmt\n";
830}
831
833 OS << "\t.module\tcrc\n";
834}
835
837 OS << "\t.module\tnocrc\n";
838}
839
841 OS << "\t.module\tvirt\n";
842}
843
845 OS << "\t.module\tnovirt\n";
846}
847
849 OS << "\t.module\tginv\n";
850}
851
853 OS << "\t.module\tnoginv\n";
854}
855
856// This part is for ELF object output.
857MipsTargetELFStreamer::ISAMode
858MipsTargetELFStreamer::getISAMode(const MCSubtargetInfo &STI) {
859 if (STI.hasFeature(Mips::FeatureMips16))
860 return ISAMode::Mips16;
861 if (STI.hasFeature(Mips::FeatureMicroMips))
862 return ISAMode::MicroMips;
863 return ISAMode::Standard;
864}
865
867 const MCSubtargetInfo &STI)
869 CLOpts(MIPS_MC::getCLOpts(S.getContext().getTargetOptions())),
870 Mode(getISAMode(STI)), STI(STI) {
873
874 // It's possible that MCObjectFileInfo isn't fully initialized at this point
875 // due to an initialization order problem where CodeGenTargetMachineImpl
876 // creates the target streamer before TargetLoweringObjectFile calls
877 // InitializeMCObjectFileInfo. There doesn't seem to be a single place that
878 // covers all cases so this statement covers most cases and direct object
879 // emission must call setPic() once MCObjectFileInfo has been initialized. The
880 // cases we don't handle here are covered by MipsAsmPrinter.
882
883 const FeatureBitset &Features = STI.getFeatureBits();
884
885 // Set the header flags that we can in the constructor.
886 // FIXME: This is a fairly terrible hack. We set the rest
887 // of these in the destructor. The problem here is two-fold:
888 //
889 // a: Some of the eflags can be set/reset by directives.
890 // b: There aren't any usage paths that initialize the ABI
891 // pointer until after we initialize either an assembler
892 // or the target machine.
893 // We can fix this by making the target streamer construct
894 // the ABI, but this is fraught with wide ranging dependency
895 // issues as well.
896 unsigned EFlags = W.getELFHeaderEFlags();
897
898 // FIXME: Fix a dependency issue by instantiating the ABI object to some
899 // default based off the triple. The triple doesn't describe the target
900 // fully, but any external user of the API that uses the MCTargetStreamer
901 // would otherwise crash on assertion failure.
902
903 ABI = MipsABIInfo(STI.getTargetTriple().isMIPS32() ? MipsABIInfo::O32()
904 : MipsABIInfo::N64());
905
906 // Architecture
907 if (Features[Mips::FeatureMips64r6])
908 EFlags |= ELF::EF_MIPS_ARCH_64R6;
909 else if (Features[Mips::FeatureMips64r2] ||
910 Features[Mips::FeatureMips64r3] ||
911 Features[Mips::FeatureMips64r5])
912 EFlags |= ELF::EF_MIPS_ARCH_64R2;
913 else if (Features[Mips::FeatureMips64])
914 EFlags |= ELF::EF_MIPS_ARCH_64;
915 else if (Features[Mips::FeatureMips5])
916 EFlags |= ELF::EF_MIPS_ARCH_5;
917 else if (Features[Mips::FeatureMips4])
918 EFlags |= ELF::EF_MIPS_ARCH_4;
919 else if (Features[Mips::FeatureMips3])
920 EFlags |= ELF::EF_MIPS_ARCH_3;
921 else if (Features[Mips::FeatureMips32r6])
922 EFlags |= ELF::EF_MIPS_ARCH_32R6;
923 else if (Features[Mips::FeatureMips32r2] ||
924 Features[Mips::FeatureMips32r3] ||
925 Features[Mips::FeatureMips32r5])
926 EFlags |= ELF::EF_MIPS_ARCH_32R2;
927 else if (Features[Mips::FeatureMips32])
928 EFlags |= ELF::EF_MIPS_ARCH_32;
929 else if (Features[Mips::FeatureMips2])
930 EFlags |= ELF::EF_MIPS_ARCH_2;
931 else
932 EFlags |= ELF::EF_MIPS_ARCH_1;
933
934 // Machine
935 if (Features[Mips::FeatureCnMips])
936 EFlags |= ELF::EF_MIPS_MACH_OCTEON;
937 else if (Features[Mips::FeatureR5900])
938 EFlags |= ELF::EF_MIPS_MACH_5900;
939
940 // Other options.
941 if (isMips16Enabled())
943 if (Features[Mips::FeatureNaN2008])
944 EFlags |= ELF::EF_MIPS_NAN2008;
945
946 W.setELFHeaderEFlags(EFlags);
947}
948
950 auto *Symbol = static_cast<MCSymbolELF *>(S);
952 uint8_t Type = Symbol->getType();
953 if (Type != ELF::STT_FUNC)
954 return;
955
956 if (isMicroMipsEnabled())
957 Symbol->setOther(ELF::STO_MIPS_MICROMIPS);
958 else if (isMips16Enabled())
959 Symbol->setOther(ELF::STO_MIPS_MIPS16);
960}
961
965 const MCObjectFileInfo &OFI = *MCA.getContext().getObjectFileInfo();
967
968 // .bss, .text and .data are always at least 16-byte aligned.
969 MCSection &TextSection = *OFI.getTextSection();
970 S.switchSection(&TextSection);
971 MCSection &DataSection = *OFI.getDataSection();
972 S.switchSection(&DataSection);
973 MCSection &BSSSection = *OFI.getBSSSection();
974 S.switchSection(&BSSSection);
975
976 TextSection.ensureMinAlignment(Align(16));
977 DataSection.ensureMinAlignment(Align(16));
978 BSSSection.ensureMinAlignment(Align(16));
979
980 if (CLOpts.round_section_sizes) {
981 // Make sections sizes a multiple of the alignment. This is useful for
982 // verifying the output of IAS against the output of other assemblers but
983 // it's not necessary to produce a correct object and increases section
984 // size.
985 for (MCSection &Sec : MCA) {
986 MCSectionELF &Section = static_cast<MCSectionELF &>(Sec);
987
988 Align Alignment = Section.getAlign();
989 S.switchSection(&Section);
990 if (getContext().getAsmInfo().useCodeAlign(Section))
991 S.emitCodeAlignment(Alignment, STI, Alignment.value());
992 else
993 S.emitValueToAlignment(Alignment, 0, 1, Alignment.value());
994 }
995 }
996
997 const FeatureBitset &Features = STI.getFeatureBits();
998
999 // Update e_header flags. See the FIXME and comment above in
1000 // the constructor for a full rundown on this.
1001 unsigned EFlags = W.getELFHeaderEFlags();
1002
1003 // ABI
1004 // N64 does not require any ABI bits.
1005 if (getABI().IsO32())
1006 EFlags |= ELF::EF_MIPS_ABI_O32;
1007 else if (getABI().IsN32())
1008 EFlags |= ELF::EF_MIPS_ABI2;
1009
1010 if (Features[Mips::FeatureGP64Bit]) {
1011 if (getABI().IsO32())
1012 EFlags |= ELF::EF_MIPS_32BITMODE; /* Compatibility Mode */
1013 } else if (Features[Mips::FeatureMips64r2] || Features[Mips::FeatureMips64])
1014 EFlags |= ELF::EF_MIPS_32BITMODE;
1015
1016 // -mplt is not implemented but we should act as if it was
1017 // given.
1018 if (!Features[Mips::FeatureNoABICalls])
1019 EFlags |= ELF::EF_MIPS_CPIC;
1020
1021 if (Pic)
1023
1024 W.setELFHeaderEFlags(EFlags);
1025
1026 // Emit all the option records.
1027 // At the moment we are only emitting .Mips.options (ODK_REGINFO) and
1028 // .reginfo.
1029 MipsELFStreamer &MEF = static_cast<MipsELFStreamer &>(Streamer);
1031
1033}
1034
1036 auto *Symbol = static_cast<MCSymbolELF *>(S);
1037 // Propagate the ISA mode of a symbol to its alias.
1038 if (Value->getKind() != MCExpr::SymbolRef)
1039 return;
1040 auto &RhsSym = static_cast<const MCSymbolELF &>(
1041 static_cast<const MCSymbolRefExpr *>(Value)->getSymbol());
1042
1043 // Copy the target-specific flags directly; visibility is stored separately.
1044 Symbol->setOther(RhsSym.getOther());
1045}
1046
1050
1052 auto &S = getStreamer();
1053 S.ensureHeadroom(4);
1054 S.addFixup(Value, Mips::fixup_Mips_GPREL32);
1055 S.appendContents(4, 0);
1056}
1057
1059 auto &S = getStreamer();
1060 S.ensureHeadroom(8);
1061 // fixup_Mips_GPREL32 desginates R_MIPS_GPREL32+R_MIPS_64 on MIPS64.
1062 S.addFixup(Value, Mips::fixup_Mips_GPREL32);
1063 S.appendContents(8, 0);
1064}
1065
1067 auto &S = getStreamer();
1068 S.ensureHeadroom(4);
1069 S.addFixup(Value, Mips::fixup_Mips_DTPREL32);
1070 S.appendContents(4, 0);
1071}
1072
1074 auto &S = getStreamer();
1075 S.ensureHeadroom(8);
1076 S.addFixup(Value, Mips::fixup_Mips_DTPREL64);
1077 S.appendContents(8, 0);
1078}
1079
1081 auto &S = getStreamer();
1082 S.ensureHeadroom(4);
1083 S.addFixup(Value, Mips::fixup_Mips_TPREL32);
1084 S.appendContents(4, 0);
1085}
1086
1088 auto &S = getStreamer();
1089 S.ensureHeadroom(8);
1090 S.addFixup(Value, Mips::fixup_Mips_TPREL64);
1091 S.appendContents(8, 0);
1092}
1093
1095 Mode = ISAMode::MicroMips;
1097}
1098
1100 if (isMicroMipsEnabled())
1101 Mode = ISAMode::Standard;
1103}
1104
1109
1111 assert(!ModeStack.empty() && "unmatched .set pop");
1112 Mode = ModeStack.pop_back_val();
1114}
1115
1120
1123 unsigned Flags = W.getELFHeaderEFlags();
1124 Flags |= ELF::EF_MIPS_MICROMIPS;
1125 W.setELFHeaderEFlags(Flags);
1126}
1127
1129 Mode = ISAMode::Mips16;
1131 unsigned Flags = W.getELFHeaderEFlags();
1133 W.setELFHeaderEFlags(Flags);
1135}
1136
1142
1145 unsigned Flags = W.getELFHeaderEFlags();
1146 Flags |= ELF::EF_MIPS_NOREORDER;
1147 W.setELFHeaderEFlags(Flags);
1149}
1150
1153 MCContext &Context = MCA.getContext();
1154 MCStreamer &OS = getStreamer();
1155
1156 OS.pushSection();
1157 MCSectionELF *Sec = Context.getELFSection(".pdr", ELF::SHT_PROGBITS, 0);
1158 OS.switchSection(Sec);
1159 Sec->setAlignment(Align(4));
1160
1161 MCSymbol *Sym = Context.getOrCreateSymbol(Name);
1162 const auto *ExprRef = MCSymbolRefExpr::create(Sym, Context);
1163 OS.emitValueImpl(ExprRef, 4);
1164
1165 OS.emitIntValue(GPRInfoSet ? GPRBitMask : 0, 4); // reg_mask
1166 OS.emitIntValue(GPRInfoSet ? GPROffset : 0, 4); // reg_offset
1167
1168 OS.emitIntValue(FPRInfoSet ? FPRBitMask : 0, 4); // fpreg_mask
1169 OS.emitIntValue(FPRInfoSet ? FPROffset : 0, 4); // fpreg_offset
1170
1171 OS.emitIntValue(FrameInfoSet ? FrameOffset : 0, 4); // frame_offset
1172 OS.emitIntValue(FrameInfoSet ? FrameReg : 0, 4); // frame_reg
1173 OS.emitIntValue(FrameInfoSet ? ReturnReg : 0, 4); // return_reg
1174
1175 // The .end directive marks the end of a procedure. Invalidate
1176 // the information gathered up until this point.
1178
1179 OS.popSection();
1180
1181 // .end also implicitly sets the size.
1182 MCSymbol *CurPCSym = Context.createTempSymbol();
1183 OS.emitLabel(CurPCSym);
1185 MCSymbolRefExpr::create(CurPCSym, Context), ExprRef, Context);
1186
1187 // The ELFObjectWriter can determine the absolute size as it has access to
1188 // the layout information of the assembly file, so a size expression rather
1189 // than an absolute value is ok here.
1190 static_cast<MCSymbolELF *>(Sym)->setSize(Size);
1191}
1192
1195
1196 // .ent also acts like an implicit '.type symbol, STT_FUNC'
1197 static_cast<const MCSymbolELF &>(Symbol).setType(ELF::STT_FUNC);
1198}
1199
1202 unsigned Flags = W.getELFHeaderEFlags();
1204 W.setELFHeaderEFlags(Flags);
1205}
1206
1209 unsigned Flags = W.getELFHeaderEFlags();
1210 Flags |= ELF::EF_MIPS_NAN2008;
1211 W.setELFHeaderEFlags(Flags);
1212}
1213
1216 unsigned Flags = W.getELFHeaderEFlags();
1217 Flags &= ~ELF::EF_MIPS_NAN2008;
1218 W.setELFHeaderEFlags(Flags);
1219}
1220
1223 unsigned Flags = W.getELFHeaderEFlags();
1224 // This option overrides other PIC options like -KPIC.
1225 Pic = false;
1226 Flags &= ~ELF::EF_MIPS_PIC;
1227 W.setELFHeaderEFlags(Flags);
1228}
1229
1232 unsigned Flags = W.getELFHeaderEFlags();
1233 Pic = true;
1234 // NOTE: We are following the GAS behaviour here which means the directive
1235 // 'pic2' also sets the CPIC bit in the ELF header. This is different from
1236 // what is stated in the SYSV ABI which consider the bits EF_MIPS_PIC and
1237 // EF_MIPS_CPIC to be mutually exclusive.
1239 W.setELFHeaderEFlags(Flags);
1240}
1241
1247
1248void MipsTargetELFStreamer::emitFrame(MCRegister StackReg, unsigned StackSize,
1249 MCRegister ReturnReg_) {
1251 const MCRegisterInfo *RegInfo = Context.getRegisterInfo();
1252
1253 FrameInfoSet = true;
1254 FrameReg = RegInfo->getEncodingValue(StackReg);
1255 FrameOffset = StackSize;
1256 ReturnReg = RegInfo->getEncodingValue(ReturnReg_);
1257}
1258
1259void MipsTargetELFStreamer::emitMask(unsigned CPUBitmask,
1260 int CPUTopSavedRegOff) {
1261 GPRInfoSet = true;
1262 GPRBitMask = CPUBitmask;
1263 GPROffset = CPUTopSavedRegOff;
1264}
1265
1266void MipsTargetELFStreamer::emitFMask(unsigned FPUBitmask,
1267 int FPUTopSavedRegOff) {
1268 FPRInfoSet = true;
1269 FPRBitMask = FPUBitmask;
1270 FPROffset = FPUTopSavedRegOff;
1271}
1272
1274 // .cpadd $reg
1275 // This directive inserts code to add $gp to the argument's register
1276 // when support for position independent code is enabled.
1277 if (!Pic)
1278 return;
1279
1280 emitAddu(Reg, Reg, GPReg, getABI().IsN64(), &STI);
1282}
1283
1285 // .cpload $reg
1286 // This directive expands to:
1287 // lui $gp, %hi(_gp_disp)
1288 // addui $gp, $gp, %lo(_gp_disp)
1289 // addu $gp, $gp, $reg
1290 // when support for position independent code is enabled.
1291 if (!Pic || (getABI().IsN32() || getABI().IsN64()))
1292 return;
1293
1294 // There's a GNU extension controlled by -mno-shared that allows
1295 // locally-binding symbols to be accessed using absolute addresses.
1296 // This is currently not supported. When supported -mno-shared makes
1297 // .cpload expand to:
1298 // lui $gp, %hi(__gnu_local_gp)
1299 // addiu $gp, $gp, %lo(__gnu_local_gp)
1300
1301 StringRef SymName("_gp_disp");
1303 MCSymbol *GP_Disp = MCA.getContext().getOrCreateSymbol(SymName);
1304 MCA.registerSymbol(*GP_Disp);
1305
1306 MCInst TmpInst;
1307 TmpInst.setOpcode(Mips::LUi);
1309 auto *HiSym = MCSpecifierExpr::create(GP_Disp, Mips::S_HI, MCA.getContext());
1310 TmpInst.addOperand(MCOperand::createExpr(HiSym));
1311 getStreamer().emitInstruction(TmpInst, STI);
1312
1313 TmpInst.clear();
1314
1315 TmpInst.setOpcode(Mips::ADDiu);
1318 auto *LoSym = MCSpecifierExpr::create(GP_Disp, Mips::S_LO, MCA.getContext());
1319 TmpInst.addOperand(MCOperand::createExpr(LoSym));
1320 getStreamer().emitInstruction(TmpInst, STI);
1321
1322 TmpInst.clear();
1323
1324 TmpInst.setOpcode(Mips::ADDu);
1327 TmpInst.addOperand(MCOperand::createReg(Reg));
1328 getStreamer().emitInstruction(TmpInst, STI);
1329
1331}
1332
1337
1339 int Offset, function_ref<MCRegister()> GetATReg, SMLoc IDLoc,
1340 const MCSubtargetInfo *STI) {
1342 // .cprestore offset
1343 // When PIC mode is enabled and the O32 ABI is used, this directive expands
1344 // to:
1345 // sw $gp, offset($sp)
1346 // and adds a corresponding LW after every JAL.
1347
1348 // Note that .cprestore is ignored if used with the N32 and N64 ABIs or if it
1349 // is used in non-PIC mode.
1350 if (!Pic || (getABI().IsN32() || getABI().IsN64()))
1351 return true;
1352
1353 // Store the $gp on the stack.
1354 emitStoreWithImmOffset(Mips::SW, GPReg, Mips::SP, Offset, GetATReg, IDLoc,
1355 STI);
1356 return true;
1357}
1358
1360 int RegOrOffset,
1361 const MCSymbol &Sym,
1362 bool IsReg) {
1363 // Only N32 and N64 emit anything for .cpsetup iff PIC is set.
1364 if (!Pic || !(getABI().IsN32() || getABI().IsN64()))
1365 return;
1366
1368
1370 MCInst Inst;
1371
1372 // Either store the old $gp in a register or on the stack
1373 if (IsReg) {
1374 // move $save, $gpreg
1375 emitRRR(Mips::OR64, RegOrOffset, GPReg, Mips::R0, SMLoc(), &STI);
1376 } else {
1377 // sd $gpreg, offset($sp)
1378 emitRRI(Mips::SD, GPReg, Mips::SP, RegOrOffset, SMLoc(), &STI);
1379 }
1380
1381 auto *HiExpr =
1383 Mips::S_HI, MCA.getContext());
1384 auto *LoExpr =
1386 Mips::S_LO, MCA.getContext());
1387
1388 // lui $gp, %hi(%neg(%gp_rel(funcSym)))
1389 emitRX(Mips::LUi, GPReg, MCOperand::createExpr(HiExpr), SMLoc(), &STI);
1390
1391 // addiu $gp, $gp, %lo(%neg(%gp_rel(funcSym)))
1392 emitRRX(Mips::ADDiu, GPReg, GPReg, MCOperand::createExpr(LoExpr), SMLoc(),
1393 &STI);
1394
1395 // (d)addu $gp, $gp, $funcreg
1396 if (getABI().IsN32())
1397 emitRRR(Mips::ADDu, GPReg, GPReg, Reg, SMLoc(), &STI);
1398 else
1399 emitRRR(Mips::DADDu, GPReg, GPReg, Reg, SMLoc(), &STI);
1400}
1401
1403 bool SaveLocationIsRegister) {
1404 // Only N32 and N64 emit anything for .cpreturn iff PIC is set.
1405 if (!Pic || !(getABI().IsN32() || getABI().IsN64()))
1406 return;
1407
1408 MCInst Inst;
1409 // Either restore the old $gp from a register or on the stack
1410 if (SaveLocationIsRegister) {
1411 Inst.setOpcode(Mips::OR);
1413 Inst.addOperand(MCOperand::createReg(SaveLocation));
1414 Inst.addOperand(MCOperand::createReg(Mips::R0));
1415 } else {
1416 Inst.setOpcode(Mips::LD);
1419 Inst.addOperand(MCOperand::createImm(SaveLocation));
1420 }
1421 getStreamer().emitInstruction(Inst, STI);
1422
1424}
1425
1428 MCContext &Context = MCA.getContext();
1429 MCStreamer &OS = getStreamer();
1430 MCSectionELF *Sec = Context.getELFSection(
1431 ".MIPS.abiflags", ELF::SHT_MIPS_ABIFLAGS, ELF::SHF_ALLOC, 24);
1432 OS.switchSection(Sec);
1433 Sec->setAlignment(Align(8));
1434
1435 OS << ABIFlagsSection;
1436}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned Imm
static bool hasShortDelaySlot(MCInst &Inst)
static bool isMicroMips(const MCSubtargetInfo *STI)
static void printHex32(unsigned Value, raw_ostream &OS)
static bool isMips32r6(const MCSubtargetInfo *STI)
Container class for subtarget features.
void printExpr(raw_ostream &, const MCExpr &) const
MCContext & getContext() const
LLVM_ABI bool registerSymbol(const MCSymbol &Symbol)
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Definition MCExpr.h:427
Context object for machine code objects.
Definition MCContext.h:83
const MCObjectFileInfo * getObjectFileInfo() const
Definition MCContext.h:413
LLVM_ABI MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
const MCAsmInfo & getAsmInfo() const
Definition MCContext.h:409
ELFObjectWriter & getWriter()
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
@ SymbolRef
References to labels and assigned expressions.
Definition MCExpr.h:43
Instances of this class represent a single low-level machine instruction.
Definition MCInst.h:188
void setLoc(SMLoc loc)
Definition MCInst.h:207
void addOperand(const MCOperand Op)
Definition MCInst.h:215
void setOpcode(unsigned Op)
Definition MCInst.h:201
void clear()
Definition MCInst.h:223
MCSection * getBSSSection() const
bool isPositionIndependent() const
MCSection * getTextSection() const
MCSection * getDataSection() const
void emitValueToAlignment(Align Alignment, int64_t Fill=0, uint8_t FillLen=1, unsigned MaxBytesToEmit=0) override
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
MCAssembler & getAssembler()
void emitCodeAlignment(Align ByteAlignment, const MCSubtargetInfo &STI, unsigned MaxBytesToEmit=0) override
Emit nops until the byte alignment ByteAlignment is reached.
void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override
Emit the given Instruction into the current section.
Instances of this class represent operands of the MCInst class.
Definition MCInst.h:40
static MCOperand createExpr(const MCExpr *Val)
Definition MCInst.h:166
static MCOperand createReg(MCRegister Reg)
Definition MCInst.h:138
static MCOperand createImm(int64_t Val)
Definition MCInst.h:145
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
This represents a section on linux, lots of unix variants and some bare metal systems.
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition MCSection.h:580
void setAlignment(Align Value)
Definition MCSection.h:665
void ensureMinAlignment(Align MinAlignment)
Makes sure that Alignment is at least MinAlignment.
Definition MCSection.h:668
static const MCSpecifierExpr * create(const MCExpr *Expr, Spec S, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.cpp:743
Streaming machine code generation interface.
Definition MCStreamer.h:222
virtual bool popSection()
Restore the current and previous section from the section stack.
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
MCContext & getContext() const
Definition MCStreamer.h:326
virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
virtual void emitIntValue(uint64_t Value, unsigned Size)
Special case of EmitValue that avoids the client having to pass in a MCExpr for constant integers.
void pushSection()
Save the current and previous section on the section stack.
Definition MCStreamer.h:460
virtual void switchSection(MCSection *Section, uint32_t Subsec=0)
Set the current section where code is being emitted to Section.
virtual void emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc=SMLoc())
Emit the expression Value into the output as a native integer of the given Size bytes.
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) const
LLVM_ABI void setOther(unsigned Other)
Represent a reference to a symbol from inside an expression.
Definition MCExpr.h:190
const MCSymbol & getSymbol() const
Definition MCExpr.h:226
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.h:213
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
StringRef getName() const
getName - Get the symbol name.
Definition MCSymbol.h:188
MCStreamer & getStreamer()
Definition MCStreamer.h:103
MCContext & getContext()
MCStreamer & Streamer
Definition MCStreamer.h:97
MCTargetStreamer(MCStreamer &S)
static MipsABIInfo O32()
Definition MipsABIInfo.h:33
static MipsABIInfo N64()
Definition MipsABIInfo.h:35
void EmitMipsOptionRecords()
Emits all the option records stored up until the point it's called.
void createPendingLabelRelocs()
Mark labels as microMIPS, if necessary for the subtarget.
static const char * getRegisterName(MCRegister Reg, unsigned AltIdx=Mips::NoRegAltName)
void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value) override
void emitDirectiveSetArch(StringRef Arch) override
void emitDirectiveCpsetup(MCRegister Reg, int RegOrOffset, const MCSymbol &Sym, bool IsReg) override
MipsTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS)
void emitDirectiveCpLocal(MCRegister Reg) override
void emitDirectiveEnt(const MCSymbol &Symbol) override
void emitDTPRel64Value(const MCExpr *) override
void emitTPRel64Value(const MCExpr *) override
bool emitDirectiveCpRestore(int Offset, function_ref< MCRegister()> GetATReg, SMLoc IDLoc, const MCSubtargetInfo *STI) override
Emit a .cprestore directive.
void emitDirectiveCpAdd(MCRegister Reg) override
void emitDirectiveCpLoad(MCRegister Reg) override
void emitFrame(MCRegister StackReg, unsigned StackSize, MCRegister ReturnReg) override
void emitDirectiveEnd(StringRef Name) override
void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override
void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override
void emitDirectiveCpreturn(unsigned SaveLocation, bool SaveLocationIsRegister) override
void emitDTPRel32Value(const MCExpr *) override
void emitTPRel32Value(const MCExpr *) override
void emitDirectiveSetAtWithArg(unsigned RegNo) override
void emitGPRel64Value(const MCExpr *) override
void emitGPRel32Value(const MCExpr *) override
bool emitDirectiveCpRestore(int Offset, function_ref< MCRegister()> GetATReg, SMLoc IDLoc, const MCSubtargetInfo *STI) override
void emitDTPRel32Value(const MCExpr *) override
MipsTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
void emitGPRel64Value(const MCExpr *) override
void emitGPRel32Value(const MCExpr *) override
void emitDirectiveEnd(StringRef Name) override
void emitFrame(MCRegister StackReg, unsigned StackSize, MCRegister ReturnReg) override
void emitDirectiveCpsetup(MCRegister Reg, int RegOrOffset, const MCSymbol &Sym, bool IsReg) override
void emitDirectiveCpAdd(MCRegister Reg) override
void emitDirectiveCpLocal(MCRegister Reg) override
void emitTPRel64Value(const MCExpr *) override
void emitLabel(MCSymbol *Symbol) override
void emitTPRel32Value(const MCExpr *) override
void emitDTPRel64Value(const MCExpr *) override
void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override
void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override
void emitDirectiveCpLoad(MCRegister Reg) override
void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override
void emitDirectiveCpreturn(unsigned SaveLocation, bool SaveLocationIsRegister) override
void emitDirectiveEnt(const MCSymbol &Symbol) override
std::optional< MipsABIInfo > ABI
void emitRRX(unsigned Opcode, MCRegister Reg0, MCRegister Reg1, MCOperand Op2, SMLoc IDLoc, const MCSubtargetInfo *STI)
virtual void emitFrame(MCRegister StackReg, unsigned StackSize, MCRegister ReturnReg)
void emitRRRX(unsigned Opcode, MCRegister Reg0, MCRegister Reg1, MCRegister Reg2, MCOperand Op3, SMLoc IDLoc, const MCSubtargetInfo *STI)
virtual void emitDirectiveCpLoad(MCRegister Reg)
virtual void emitDirectiveCpreturn(unsigned SaveLocation, bool SaveLocationIsRegister)
virtual void emitGPRel32Value(const MCExpr *)
virtual void emitDirectiveSetNoMicroMips()
void emitRX(unsigned Opcode, MCRegister Reg0, MCOperand Op1, SMLoc IDLoc, const MCSubtargetInfo *STI)
virtual void emitDirectiveEnd(StringRef Name)
virtual void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value)
virtual void emitTPRel64Value(const MCExpr *)
void emitR(unsigned Opcode, MCRegister Reg0, SMLoc IDLoc, const MCSubtargetInfo *STI)
void emitRRI(unsigned Opcode, MCRegister Reg0, MCRegister Reg1, int16_t Imm, SMLoc IDLoc, const MCSubtargetInfo *STI)
virtual void emitDirectiveEnt(const MCSymbol &Symbol)
void emitLoadWithImmOffset(unsigned Opcode, MCRegister DstReg, MCRegister BaseReg, int64_t Offset, MCRegister TmpReg, SMLoc IDLoc, const MCSubtargetInfo *STI)
Emit a load instruction with an immediate offset.
void emitEmptyDelaySlot(bool hasShortDelaySlot, SMLoc IDLoc, const MCSubtargetInfo *STI)
void emitAddu(MCRegister DstReg, MCRegister SrcReg, MCRegister TrgReg, bool Is64Bit, const MCSubtargetInfo *STI)
void emitRI(unsigned Opcode, MCRegister Reg0, int32_t Imm, SMLoc IDLoc, const MCSubtargetInfo *STI)
virtual void emitTPRel32Value(const MCExpr *)
virtual void emitDirectiveSetNoMips16()
virtual void emitDirectiveSetNoOddSPReg()
virtual void emitGPRel64Value(const MCExpr *)
void emitII(unsigned Opcode, int16_t Imm1, int16_t Imm2, SMLoc IDLoc, const MCSubtargetInfo *STI)
void emitRR(unsigned Opcode, MCRegister Reg0, MCRegister Reg1, SMLoc IDLoc, const MCSubtargetInfo *STI)
virtual bool emitDirectiveCpRestore(int Offset, function_ref< MCRegister()> GetATReg, SMLoc IDLoc, const MCSubtargetInfo *STI)
virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff)
virtual void emitDirectiveCpsetup(MCRegister Reg, int RegOrOffset, const MCSymbol &Sym, bool IsReg)
void emitRRIII(unsigned Opcode, MCRegister Reg0, MCRegister Reg1, int16_t Imm0, int16_t Imm1, int16_t Imm2, SMLoc IDLoc, const MCSubtargetInfo *STI)
virtual void emitDirectiveSetMicroMips()
virtual void emitDTPRel64Value(const MCExpr *)
virtual void emitDirectiveModuleSoftFloat()
virtual void emitDirectiveSetArch(StringRef Arch)
virtual void emitDTPRel32Value(const MCExpr *)
virtual void emitDirectiveCpAdd(MCRegister Reg)
virtual void emitDirectiveSetAtWithArg(unsigned RegNo)
void emitDSLL(MCRegister DstReg, MCRegister SrcReg, int16_t ShiftAmount, SMLoc IDLoc, const MCSubtargetInfo *STI)
const MipsABIInfo & getABI() const
virtual void emitDirectiveModuleOddSPReg()
void emitGPRestore(int Offset, SMLoc IDLoc, const MCSubtargetInfo *STI)
Emit the $gp restore operation for .cprestore.
virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff)
void emitNop(SMLoc IDLoc, const MCSubtargetInfo *STI)
void emitRRR(unsigned Opcode, MCRegister Reg0, MCRegister Reg1, MCRegister Reg2, SMLoc IDLoc, const MCSubtargetInfo *STI)
virtual void emitDirectiveSetNoReorder()
void emitStoreWithImmOffset(unsigned Opcode, MCRegister SrcReg, MCRegister BaseReg, int64_t Offset, function_ref< MCRegister()> GetATReg, SMLoc IDLoc, const MCSubtargetInfo *STI)
Emit a store instruction with an offset.
virtual void emitDirectiveModuleHardFloat()
virtual void emitDirectiveCpLocal(MCRegister Reg)
MipsABIFlagsSection ABIFlagsSection
Represents a location in source code.
Definition SMLoc.h:22
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
LLVM_ABI std::string lower() const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM Value Representation.
Definition Value.h:75
formatted_raw_ostream - A raw_ostream that wraps another one and keeps track of line and column posit...
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
raw_ostream & write_hex(unsigned long long N)
Output N in hexadecimal, without any prefix or padding.
@ SHF_ALLOC
Definition ELF.h:1259
@ STO_MIPS_MICROMIPS
Definition ELF.h:602
@ STO_MIPS_MIPS16
Definition ELF.h:603
@ SHT_PROGBITS
Definition ELF.h:1157
@ SHT_MIPS_ABIFLAGS
Definition ELF.h:1238
@ EF_MIPS_MACH_5900
Definition ELF.h:554
@ EF_MIPS_MICROMIPS
Definition ELF.h:563
@ EF_MIPS_ARCH_32R6
Definition ELF.h:578
@ EF_MIPS_ABI_O32
Definition ELF.h:534
@ EF_MIPS_ARCH_64
Definition ELF.h:575
@ EF_MIPS_ARCH_32
Definition ELF.h:574
@ EF_MIPS_MACH_OCTEON
Definition ELF.h:549
@ EF_MIPS_ARCH_4
Definition ELF.h:572
@ EF_MIPS_ARCH_5
Definition ELF.h:573
@ EF_MIPS_NAN2008
Definition ELF.h:531
@ EF_MIPS_PIC
Definition ELF.h:524
@ EF_MIPS_ARCH_2
Definition ELF.h:570
@ EF_MIPS_32BITMODE
Definition ELF.h:527
@ EF_MIPS_ARCH_32R2
Definition ELF.h:576
@ EF_MIPS_ARCH_64R2
Definition ELF.h:577
@ EF_MIPS_ARCH_ASE_M16
Definition ELF.h:564
@ EF_MIPS_NOREORDER
Definition ELF.h:523
@ EF_MIPS_ARCH_1
Definition ELF.h:569
@ EF_MIPS_CPIC
Definition ELF.h:525
@ EF_MIPS_ARCH_64R6
Definition ELF.h:579
@ EF_MIPS_ABI2
Definition ELF.h:526
@ EF_MIPS_ARCH_3
Definition ELF.h:571
@ STT_FUNC
Definition ELF.h:1435
const MCSpecifierExpr * createGpOff(const MCExpr *Expr, Specifier S, MCContext &Ctx)
constexpr MCPhysReg SP
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
Definition MathExtras.h:166
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39