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::ZERO, Mips::ZERO, 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::ZERO, Mips::ZERO, 0, IDLoc, STI);
304}
305
307 if (isMicroMips(STI))
308 emitRR(Mips::MOVE16_MM, Mips::ZERO, Mips::ZERO, IDLoc, STI);
309 else
310 emitRRI(Mips::SLL, Mips::ZERO, Mips::ZERO, 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::ZERO)
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::ZERO)
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)
868 : MipsTargetStreamer(S), CLOpts(MipsMCOptions::Global),
869 Mode(getISAMode(STI)), STI(STI) {
872
873 // It's possible that MCObjectFileInfo isn't fully initialized at this point
874 // due to an initialization order problem where CodeGenTargetMachineImpl
875 // creates the target streamer before TargetLoweringObjectFile calls
876 // InitializeMCObjectFileInfo. There doesn't seem to be a single place that
877 // covers all cases so this statement covers most cases and direct object
878 // emission must call setPic() once MCObjectFileInfo has been initialized. The
879 // cases we don't handle here are covered by MipsAsmPrinter.
881
882 const FeatureBitset &Features = STI.getFeatureBits();
883
884 // Set the header flags that we can in the constructor.
885 // FIXME: This is a fairly terrible hack. We set the rest
886 // of these in the destructor. The problem here is two-fold:
887 //
888 // a: Some of the eflags can be set/reset by directives.
889 // b: There aren't any usage paths that initialize the ABI
890 // pointer until after we initialize either an assembler
891 // or the target machine.
892 // We can fix this by making the target streamer construct
893 // the ABI, but this is fraught with wide ranging dependency
894 // issues as well.
895 unsigned EFlags = W.getELFHeaderEFlags();
896
897 // FIXME: Fix a dependency issue by instantiating the ABI object to some
898 // default based off the triple. The triple doesn't describe the target
899 // fully, but any external user of the API that uses the MCTargetStreamer
900 // would otherwise crash on assertion failure.
901
902 ABI = MipsABIInfo(STI.getTargetTriple().isMIPS32() ? MipsABIInfo::O32()
903 : MipsABIInfo::N64());
904
905 // Architecture
906 if (Features[Mips::FeatureMips64r6])
907 EFlags |= ELF::EF_MIPS_ARCH_64R6;
908 else if (Features[Mips::FeatureMips64r2] ||
909 Features[Mips::FeatureMips64r3] ||
910 Features[Mips::FeatureMips64r5])
911 EFlags |= ELF::EF_MIPS_ARCH_64R2;
912 else if (Features[Mips::FeatureMips64])
913 EFlags |= ELF::EF_MIPS_ARCH_64;
914 else if (Features[Mips::FeatureMips5])
915 EFlags |= ELF::EF_MIPS_ARCH_5;
916 else if (Features[Mips::FeatureMips4])
917 EFlags |= ELF::EF_MIPS_ARCH_4;
918 else if (Features[Mips::FeatureMips3])
919 EFlags |= ELF::EF_MIPS_ARCH_3;
920 else if (Features[Mips::FeatureMips32r6])
921 EFlags |= ELF::EF_MIPS_ARCH_32R6;
922 else if (Features[Mips::FeatureMips32r2] ||
923 Features[Mips::FeatureMips32r3] ||
924 Features[Mips::FeatureMips32r5])
925 EFlags |= ELF::EF_MIPS_ARCH_32R2;
926 else if (Features[Mips::FeatureMips32])
927 EFlags |= ELF::EF_MIPS_ARCH_32;
928 else if (Features[Mips::FeatureMips2])
929 EFlags |= ELF::EF_MIPS_ARCH_2;
930 else
931 EFlags |= ELF::EF_MIPS_ARCH_1;
932
933 // Machine
934 if (Features[Mips::FeatureCnMips])
935 EFlags |= ELF::EF_MIPS_MACH_OCTEON;
936 else if (Features[Mips::FeatureR5900])
937 EFlags |= ELF::EF_MIPS_MACH_5900;
938
939 // Other options.
940 if (isMips16Enabled())
942 if (Features[Mips::FeatureNaN2008])
943 EFlags |= ELF::EF_MIPS_NAN2008;
944
945 W.setELFHeaderEFlags(EFlags);
946}
947
949 auto *Symbol = static_cast<MCSymbolELF *>(S);
951 uint8_t Type = Symbol->getType();
952 if (Type != ELF::STT_FUNC)
953 return;
954
955 if (isMicroMipsEnabled())
956 Symbol->setOther(ELF::STO_MIPS_MICROMIPS);
957 else if (isMips16Enabled())
958 Symbol->setOther(ELF::STO_MIPS_MIPS16);
959}
960
964 const MCObjectFileInfo &OFI = *MCA.getContext().getObjectFileInfo();
966
967 // .bss, .text and .data are always at least 16-byte aligned.
968 MCSection &TextSection = *OFI.getTextSection();
969 S.switchSection(&TextSection);
970 MCSection &DataSection = *OFI.getDataSection();
971 S.switchSection(&DataSection);
972 MCSection &BSSSection = *OFI.getBSSSection();
973 S.switchSection(&BSSSection);
974
975 TextSection.ensureMinAlignment(Align(16));
976 DataSection.ensureMinAlignment(Align(16));
977 BSSSection.ensureMinAlignment(Align(16));
978
979 if (CLOpts.round_section_sizes) {
980 // Make sections sizes a multiple of the alignment. This is useful for
981 // verifying the output of IAS against the output of other assemblers but
982 // it's not necessary to produce a correct object and increases section
983 // size.
984 for (MCSection &Sec : MCA) {
985 MCSectionELF &Section = static_cast<MCSectionELF &>(Sec);
986
987 Align Alignment = Section.getAlign();
988 S.switchSection(&Section);
989 if (getContext().getAsmInfo().useCodeAlign(Section))
990 S.emitCodeAlignment(Alignment, STI, Alignment.value());
991 else
992 S.emitValueToAlignment(Alignment, 0, 1, Alignment.value());
993 }
994 }
995
996 const FeatureBitset &Features = STI.getFeatureBits();
997
998 // Update e_header flags. See the FIXME and comment above in
999 // the constructor for a full rundown on this.
1000 unsigned EFlags = W.getELFHeaderEFlags();
1001
1002 // ABI
1003 // N64 does not require any ABI bits.
1004 if (getABI().IsO32())
1005 EFlags |= ELF::EF_MIPS_ABI_O32;
1006 else if (getABI().IsN32())
1007 EFlags |= ELF::EF_MIPS_ABI2;
1008
1009 if (Features[Mips::FeatureGP64Bit]) {
1010 if (getABI().IsO32())
1011 EFlags |= ELF::EF_MIPS_32BITMODE; /* Compatibility Mode */
1012 } else if (Features[Mips::FeatureMips64r2] || Features[Mips::FeatureMips64])
1013 EFlags |= ELF::EF_MIPS_32BITMODE;
1014
1015 // -mplt is not implemented but we should act as if it was
1016 // given.
1017 if (!Features[Mips::FeatureNoABICalls])
1018 EFlags |= ELF::EF_MIPS_CPIC;
1019
1020 if (Pic)
1022
1023 W.setELFHeaderEFlags(EFlags);
1024
1025 // Emit all the option records.
1026 // At the moment we are only emitting .Mips.options (ODK_REGINFO) and
1027 // .reginfo.
1028 MipsELFStreamer &MEF = static_cast<MipsELFStreamer &>(Streamer);
1030
1032}
1033
1035 auto *Symbol = static_cast<MCSymbolELF *>(S);
1036 // Propagate the ISA mode of a symbol to its alias.
1037 if (Value->getKind() != MCExpr::SymbolRef)
1038 return;
1039 auto &RhsSym = static_cast<const MCSymbolELF &>(
1040 static_cast<const MCSymbolRefExpr *>(Value)->getSymbol());
1041
1042 // Copy the target-specific flags directly; visibility is stored separately.
1043 Symbol->setOther(RhsSym.getOther());
1044}
1045
1049
1051 auto &S = getStreamer();
1052 S.ensureHeadroom(4);
1053 S.addFixup(Value, Mips::fixup_Mips_GPREL32);
1054 S.appendContents(4, 0);
1055}
1056
1058 auto &S = getStreamer();
1059 S.ensureHeadroom(8);
1060 // fixup_Mips_GPREL32 desginates R_MIPS_GPREL32+R_MIPS_64 on MIPS64.
1061 S.addFixup(Value, Mips::fixup_Mips_GPREL32);
1062 S.appendContents(8, 0);
1063}
1064
1066 auto &S = getStreamer();
1067 S.ensureHeadroom(4);
1068 S.addFixup(Value, Mips::fixup_Mips_DTPREL32);
1069 S.appendContents(4, 0);
1070}
1071
1073 auto &S = getStreamer();
1074 S.ensureHeadroom(8);
1075 S.addFixup(Value, Mips::fixup_Mips_DTPREL64);
1076 S.appendContents(8, 0);
1077}
1078
1080 auto &S = getStreamer();
1081 S.ensureHeadroom(4);
1082 S.addFixup(Value, Mips::fixup_Mips_TPREL32);
1083 S.appendContents(4, 0);
1084}
1085
1087 auto &S = getStreamer();
1088 S.ensureHeadroom(8);
1089 S.addFixup(Value, Mips::fixup_Mips_TPREL64);
1090 S.appendContents(8, 0);
1091}
1092
1094 Mode = ISAMode::MicroMips;
1096}
1097
1099 if (isMicroMipsEnabled())
1100 Mode = ISAMode::Standard;
1102}
1103
1108
1110 assert(!ModeStack.empty() && "unmatched .set pop");
1111 Mode = ModeStack.pop_back_val();
1113}
1114
1119
1122 unsigned Flags = W.getELFHeaderEFlags();
1123 Flags |= ELF::EF_MIPS_MICROMIPS;
1124 W.setELFHeaderEFlags(Flags);
1125}
1126
1128 Mode = ISAMode::Mips16;
1130 unsigned Flags = W.getELFHeaderEFlags();
1132 W.setELFHeaderEFlags(Flags);
1134}
1135
1141
1144 unsigned Flags = W.getELFHeaderEFlags();
1145 Flags |= ELF::EF_MIPS_NOREORDER;
1146 W.setELFHeaderEFlags(Flags);
1148}
1149
1152 MCContext &Context = MCA.getContext();
1153 MCStreamer &OS = getStreamer();
1154
1155 OS.pushSection();
1156 MCSectionELF *Sec = Context.getELFSection(".pdr", ELF::SHT_PROGBITS, 0);
1157 OS.switchSection(Sec);
1158 Sec->setAlignment(Align(4));
1159
1160 MCSymbol *Sym = Context.getOrCreateSymbol(Name);
1161 const auto *ExprRef = MCSymbolRefExpr::create(Sym, Context);
1162 OS.emitValueImpl(ExprRef, 4);
1163
1164 OS.emitIntValue(GPRInfoSet ? GPRBitMask : 0, 4); // reg_mask
1165 OS.emitIntValue(GPRInfoSet ? GPROffset : 0, 4); // reg_offset
1166
1167 OS.emitIntValue(FPRInfoSet ? FPRBitMask : 0, 4); // fpreg_mask
1168 OS.emitIntValue(FPRInfoSet ? FPROffset : 0, 4); // fpreg_offset
1169
1170 OS.emitIntValue(FrameInfoSet ? FrameOffset : 0, 4); // frame_offset
1171 OS.emitIntValue(FrameInfoSet ? FrameReg : 0, 4); // frame_reg
1172 OS.emitIntValue(FrameInfoSet ? ReturnReg : 0, 4); // return_reg
1173
1174 // The .end directive marks the end of a procedure. Invalidate
1175 // the information gathered up until this point.
1177
1178 OS.popSection();
1179
1180 // .end also implicitly sets the size.
1181 MCSymbol *CurPCSym = Context.createTempSymbol();
1182 OS.emitLabel(CurPCSym);
1184 MCSymbolRefExpr::create(CurPCSym, Context), ExprRef, Context);
1185
1186 // The ELFObjectWriter can determine the absolute size as it has access to
1187 // the layout information of the assembly file, so a size expression rather
1188 // than an absolute value is ok here.
1189 static_cast<MCSymbolELF *>(Sym)->setSize(Size);
1190}
1191
1194
1195 // .ent also acts like an implicit '.type symbol, STT_FUNC'
1196 static_cast<const MCSymbolELF &>(Symbol).setType(ELF::STT_FUNC);
1197}
1198
1201 unsigned Flags = W.getELFHeaderEFlags();
1203 W.setELFHeaderEFlags(Flags);
1204}
1205
1208 unsigned Flags = W.getELFHeaderEFlags();
1209 Flags |= ELF::EF_MIPS_NAN2008;
1210 W.setELFHeaderEFlags(Flags);
1211}
1212
1215 unsigned Flags = W.getELFHeaderEFlags();
1216 Flags &= ~ELF::EF_MIPS_NAN2008;
1217 W.setELFHeaderEFlags(Flags);
1218}
1219
1222 unsigned Flags = W.getELFHeaderEFlags();
1223 // This option overrides other PIC options like -KPIC.
1224 Pic = false;
1225 Flags &= ~ELF::EF_MIPS_PIC;
1226 W.setELFHeaderEFlags(Flags);
1227}
1228
1231 unsigned Flags = W.getELFHeaderEFlags();
1232 Pic = true;
1233 // NOTE: We are following the GAS behaviour here which means the directive
1234 // 'pic2' also sets the CPIC bit in the ELF header. This is different from
1235 // what is stated in the SYSV ABI which consider the bits EF_MIPS_PIC and
1236 // EF_MIPS_CPIC to be mutually exclusive.
1238 W.setELFHeaderEFlags(Flags);
1239}
1240
1246
1247void MipsTargetELFStreamer::emitFrame(MCRegister StackReg, unsigned StackSize,
1248 MCRegister ReturnReg_) {
1250 const MCRegisterInfo *RegInfo = Context.getRegisterInfo();
1251
1252 FrameInfoSet = true;
1253 FrameReg = RegInfo->getEncodingValue(StackReg);
1254 FrameOffset = StackSize;
1255 ReturnReg = RegInfo->getEncodingValue(ReturnReg_);
1256}
1257
1258void MipsTargetELFStreamer::emitMask(unsigned CPUBitmask,
1259 int CPUTopSavedRegOff) {
1260 GPRInfoSet = true;
1261 GPRBitMask = CPUBitmask;
1262 GPROffset = CPUTopSavedRegOff;
1263}
1264
1265void MipsTargetELFStreamer::emitFMask(unsigned FPUBitmask,
1266 int FPUTopSavedRegOff) {
1267 FPRInfoSet = true;
1268 FPRBitMask = FPUBitmask;
1269 FPROffset = FPUTopSavedRegOff;
1270}
1271
1273 // .cpadd $reg
1274 // This directive inserts code to add $gp to the argument's register
1275 // when support for position independent code is enabled.
1276 if (!Pic)
1277 return;
1278
1279 emitAddu(Reg, Reg, GPReg, getABI().IsN64(), &STI);
1281}
1282
1284 // .cpload $reg
1285 // This directive expands to:
1286 // lui $gp, %hi(_gp_disp)
1287 // addui $gp, $gp, %lo(_gp_disp)
1288 // addu $gp, $gp, $reg
1289 // when support for position independent code is enabled.
1290 if (!Pic || (getABI().IsN32() || getABI().IsN64()))
1291 return;
1292
1293 // There's a GNU extension controlled by -mno-shared that allows
1294 // locally-binding symbols to be accessed using absolute addresses.
1295 // This is currently not supported. When supported -mno-shared makes
1296 // .cpload expand to:
1297 // lui $gp, %hi(__gnu_local_gp)
1298 // addiu $gp, $gp, %lo(__gnu_local_gp)
1299
1300 StringRef SymName("_gp_disp");
1302 MCSymbol *GP_Disp = MCA.getContext().getOrCreateSymbol(SymName);
1303 MCA.registerSymbol(*GP_Disp);
1304
1305 MCInst TmpInst;
1306 TmpInst.setOpcode(Mips::LUi);
1308 auto *HiSym = MCSpecifierExpr::create(GP_Disp, Mips::S_HI, MCA.getContext());
1309 TmpInst.addOperand(MCOperand::createExpr(HiSym));
1310 getStreamer().emitInstruction(TmpInst, STI);
1311
1312 TmpInst.clear();
1313
1314 TmpInst.setOpcode(Mips::ADDiu);
1317 auto *LoSym = MCSpecifierExpr::create(GP_Disp, Mips::S_LO, MCA.getContext());
1318 TmpInst.addOperand(MCOperand::createExpr(LoSym));
1319 getStreamer().emitInstruction(TmpInst, STI);
1320
1321 TmpInst.clear();
1322
1323 TmpInst.setOpcode(Mips::ADDu);
1326 TmpInst.addOperand(MCOperand::createReg(Reg));
1327 getStreamer().emitInstruction(TmpInst, STI);
1328
1330}
1331
1336
1338 int Offset, function_ref<MCRegister()> GetATReg, SMLoc IDLoc,
1339 const MCSubtargetInfo *STI) {
1341 // .cprestore offset
1342 // When PIC mode is enabled and the O32 ABI is used, this directive expands
1343 // to:
1344 // sw $gp, offset($sp)
1345 // and adds a corresponding LW after every JAL.
1346
1347 // Note that .cprestore is ignored if used with the N32 and N64 ABIs or if it
1348 // is used in non-PIC mode.
1349 if (!Pic || (getABI().IsN32() || getABI().IsN64()))
1350 return true;
1351
1352 // Store the $gp on the stack.
1353 emitStoreWithImmOffset(Mips::SW, GPReg, Mips::SP, Offset, GetATReg, IDLoc,
1354 STI);
1355 return true;
1356}
1357
1359 int RegOrOffset,
1360 const MCSymbol &Sym,
1361 bool IsReg) {
1362 // Only N32 and N64 emit anything for .cpsetup iff PIC is set.
1363 if (!Pic || !(getABI().IsN32() || getABI().IsN64()))
1364 return;
1365
1367
1369 MCInst Inst;
1370
1371 // Either store the old $gp in a register or on the stack
1372 if (IsReg) {
1373 // move $save, $gpreg
1374 emitRRR(Mips::OR64, RegOrOffset, GPReg, Mips::ZERO, SMLoc(), &STI);
1375 } else {
1376 // sd $gpreg, offset($sp)
1377 emitRRI(Mips::SD, GPReg, Mips::SP, RegOrOffset, SMLoc(), &STI);
1378 }
1379
1380 auto *HiExpr =
1382 Mips::S_HI, MCA.getContext());
1383 auto *LoExpr =
1385 Mips::S_LO, MCA.getContext());
1386
1387 // lui $gp, %hi(%neg(%gp_rel(funcSym)))
1388 emitRX(Mips::LUi, GPReg, MCOperand::createExpr(HiExpr), SMLoc(), &STI);
1389
1390 // addiu $gp, $gp, %lo(%neg(%gp_rel(funcSym)))
1391 emitRRX(Mips::ADDiu, GPReg, GPReg, MCOperand::createExpr(LoExpr), SMLoc(),
1392 &STI);
1393
1394 // (d)addu $gp, $gp, $funcreg
1395 if (getABI().IsN32())
1396 emitRRR(Mips::ADDu, GPReg, GPReg, Reg, SMLoc(), &STI);
1397 else
1398 emitRRR(Mips::DADDu, GPReg, GPReg, Reg, SMLoc(), &STI);
1399}
1400
1402 bool SaveLocationIsRegister) {
1403 // Only N32 and N64 emit anything for .cpreturn iff PIC is set.
1404 if (!Pic || !(getABI().IsN32() || getABI().IsN64()))
1405 return;
1406
1407 MCInst Inst;
1408 // Either restore the old $gp from a register or on the stack
1409 if (SaveLocationIsRegister) {
1410 Inst.setOpcode(Mips::OR);
1412 Inst.addOperand(MCOperand::createReg(SaveLocation));
1413 Inst.addOperand(MCOperand::createReg(Mips::ZERO));
1414 } else {
1415 Inst.setOpcode(Mips::LD);
1417 Inst.addOperand(MCOperand::createReg(Mips::SP));
1418 Inst.addOperand(MCOperand::createImm(SaveLocation));
1419 }
1420 getStreamer().emitInstruction(Inst, STI);
1421
1423}
1424
1427 MCContext &Context = MCA.getContext();
1428 MCStreamer &OS = getStreamer();
1429 MCSectionELF *Sec = Context.getELFSection(
1430 ".MIPS.abiflags", ELF::SHT_MIPS_ABIFLAGS, ELF::SHF_ALLOC, 24);
1431 OS.switchSection(Sec);
1432 Sec->setAlignment(Align(8));
1433
1434 OS << ABIFlagsSection;
1435}
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)
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
@ Global
Append to llvm.global_dtors.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39