1 //===-- PPCAsmPrinter.cpp - Print machine instrs to PowerPC assembly ------===//
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
7 //===----------------------------------------------------------------------===//
9 // This file contains a printer that converts from our internal representation
10 // of machine-dependent LLVM code to PowerPC assembly language. This printer is
11 // the output mechanism used by `llc'.
13 // Documentation at http://developer.apple.com/documentation/DeveloperTools/
14 // Reference/Assembler/ASMIntroduction/chapter_1_section_1.html
16 //===----------------------------------------------------------------------===//
18 #include "MCTargetDesc/PPCInstPrinter.h"
19 #include "MCTargetDesc/PPCMCExpr.h"
20 #include "MCTargetDesc/PPCMCTargetDesc.h"
21 #include "MCTargetDesc/PPCPredicates.h"
23 #include "PPCInstrInfo.h"
24 #include "PPCMachineFunctionInfo.h"
25 #include "PPCSubtarget.h"
26 #include "PPCTargetMachine.h"
27 #include "PPCTargetStreamer.h"
28 #include "TargetInfo/PowerPCTargetInfo.h"
29 #include "llvm/ADT/MapVector.h"
30 #include "llvm/ADT/StringRef.h"
31 #include "llvm/ADT/Triple.h"
32 #include "llvm/ADT/Twine.h"
33 #include "llvm/BinaryFormat/ELF.h"
34 #include "llvm/BinaryFormat/MachO.h"
35 #include "llvm/CodeGen/AsmPrinter.h"
36 #include "llvm/CodeGen/MachineBasicBlock.h"
37 #include "llvm/CodeGen/MachineFunction.h"
38 #include "llvm/CodeGen/MachineInstr.h"
39 #include "llvm/CodeGen/MachineModuleInfoImpls.h"
40 #include "llvm/CodeGen/MachineOperand.h"
41 #include "llvm/CodeGen/MachineRegisterInfo.h"
42 #include "llvm/CodeGen/StackMaps.h"
43 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
44 #include "llvm/IR/DataLayout.h"
45 #include "llvm/IR/GlobalValue.h"
46 #include "llvm/IR/Module.h"
47 #include "llvm/MC/MCAsmInfo.h"
48 #include "llvm/MC/MCContext.h"
49 #include "llvm/MC/MCExpr.h"
50 #include "llvm/MC/MCInst.h"
51 #include "llvm/MC/MCInstBuilder.h"
52 #include "llvm/MC/MCSectionELF.h"
53 #include "llvm/MC/MCSectionMachO.h"
54 #include "llvm/MC/MCSectionXCOFF.h"
55 #include "llvm/MC/MCStreamer.h"
56 #include "llvm/MC/MCSymbol.h"
57 #include "llvm/MC/MCSymbolELF.h"
58 #include "llvm/MC/MCSymbolXCOFF.h"
59 #include "llvm/MC/SectionKind.h"
60 #include "llvm/Support/Casting.h"
61 #include "llvm/Support/CodeGen.h"
62 #include "llvm/Support/Debug.h"
63 #include "llvm/Support/ErrorHandling.h"
64 #include "llvm/Support/TargetRegistry.h"
65 #include "llvm/Support/raw_ostream.h"
66 #include "llvm/Target/TargetMachine.h"
75 #define DEBUG_TYPE "asmprinter"
79 class PPCAsmPrinter
: public AsmPrinter
{
81 MapVector
<const MCSymbol
*, MCSymbol
*> TOC
;
82 const PPCSubtarget
*Subtarget
;
86 explicit PPCAsmPrinter(TargetMachine
&TM
,
87 std::unique_ptr
<MCStreamer
> Streamer
)
88 : AsmPrinter(TM
, std::move(Streamer
)), SM(*this) {}
90 StringRef
getPassName() const override
{ return "PowerPC Assembly Printer"; }
92 MCSymbol
*lookUpOrCreateTOCEntry(const MCSymbol
*Sym
);
94 bool doInitialization(Module
&M
) override
{
97 return AsmPrinter::doInitialization(M
);
100 void EmitInstruction(const MachineInstr
*MI
) override
;
102 /// This function is for PrintAsmOperand and PrintAsmMemoryOperand,
103 /// invoked by EmitMSInlineAsmStr and EmitGCCInlineAsmStr only.
104 /// The \p MI would be INLINEASM ONLY.
105 void printOperand(const MachineInstr
*MI
, unsigned OpNo
, raw_ostream
&O
);
107 void PrintSymbolOperand(const MachineOperand
&MO
, raw_ostream
&O
) override
;
108 bool PrintAsmOperand(const MachineInstr
*MI
, unsigned OpNo
,
109 const char *ExtraCode
, raw_ostream
&O
) override
;
110 bool PrintAsmMemoryOperand(const MachineInstr
*MI
, unsigned OpNo
,
111 const char *ExtraCode
, raw_ostream
&O
) override
;
113 void EmitEndOfAsmFile(Module
&M
) override
;
115 void LowerSTACKMAP(StackMaps
&SM
, const MachineInstr
&MI
);
116 void LowerPATCHPOINT(StackMaps
&SM
, const MachineInstr
&MI
);
117 void EmitTlsCall(const MachineInstr
*MI
, MCSymbolRefExpr::VariantKind VK
);
118 bool runOnMachineFunction(MachineFunction
&MF
) override
{
119 Subtarget
= &MF
.getSubtarget
<PPCSubtarget
>();
120 bool Changed
= AsmPrinter::runOnMachineFunction(MF
);
126 /// PPCLinuxAsmPrinter - PowerPC assembly printer, customized for Linux
127 class PPCLinuxAsmPrinter
: public PPCAsmPrinter
{
129 explicit PPCLinuxAsmPrinter(TargetMachine
&TM
,
130 std::unique_ptr
<MCStreamer
> Streamer
)
131 : PPCAsmPrinter(TM
, std::move(Streamer
)) {}
133 StringRef
getPassName() const override
{
134 return "Linux PPC Assembly Printer";
137 bool doFinalization(Module
&M
) override
;
138 void EmitStartOfAsmFile(Module
&M
) override
;
140 void EmitFunctionEntryLabel() override
;
142 void EmitFunctionBodyStart() override
;
143 void EmitFunctionBodyEnd() override
;
144 void EmitInstruction(const MachineInstr
*MI
) override
;
147 /// PPCDarwinAsmPrinter - PowerPC assembly printer, customized for Darwin/Mac
149 class PPCDarwinAsmPrinter
: public PPCAsmPrinter
{
151 explicit PPCDarwinAsmPrinter(TargetMachine
&TM
,
152 std::unique_ptr
<MCStreamer
> Streamer
)
153 : PPCAsmPrinter(TM
, std::move(Streamer
)) {}
155 StringRef
getPassName() const override
{
156 return "Darwin PPC Assembly Printer";
159 bool doFinalization(Module
&M
) override
;
160 void EmitStartOfAsmFile(Module
&M
) override
;
163 class PPCAIXAsmPrinter
: public PPCAsmPrinter
{
165 PPCAIXAsmPrinter(TargetMachine
&TM
, std::unique_ptr
<MCStreamer
> Streamer
)
166 : PPCAsmPrinter(TM
, std::move(Streamer
)) {}
168 StringRef
getPassName() const override
{ return "AIX PPC Assembly Printer"; }
170 void SetupMachineFunction(MachineFunction
&MF
) override
;
172 void EmitGlobalVariable(const GlobalVariable
*GV
) override
;
174 void EmitFunctionDescriptor() override
;
176 void EmitEndOfAsmFile(Module
&) override
;
179 } // end anonymous namespace
181 void PPCAsmPrinter::PrintSymbolOperand(const MachineOperand
&MO
,
183 // Computing the address of a global symbol, not calling it.
184 const GlobalValue
*GV
= MO
.getGlobal();
185 MCSymbol
*SymToPrint
;
187 // External or weakly linked global variables need non-lazily-resolved stubs
188 if (Subtarget
->hasLazyResolverStub(GV
)) {
189 SymToPrint
= getSymbolWithGlobalValueBase(GV
, "$non_lazy_ptr");
190 MachineModuleInfoImpl::StubValueTy
&StubSym
=
191 MMI
->getObjFileInfo
<MachineModuleInfoMachO
>().getGVStubEntry(
193 if (!StubSym
.getPointer())
194 StubSym
= MachineModuleInfoImpl::StubValueTy(getSymbol(GV
),
195 !GV
->hasInternalLinkage());
197 SymToPrint
= getSymbol(GV
);
200 SymToPrint
->print(O
, MAI
);
202 printOffset(MO
.getOffset(), O
);
205 void PPCAsmPrinter::printOperand(const MachineInstr
*MI
, unsigned OpNo
,
207 const DataLayout
&DL
= getDataLayout();
208 const MachineOperand
&MO
= MI
->getOperand(OpNo
);
210 switch (MO
.getType()) {
211 case MachineOperand::MO_Register
: {
212 // The MI is INLINEASM ONLY and UseVSXReg is always false.
213 const char *RegName
= PPCInstPrinter::getRegisterName(MO
.getReg());
215 // Linux assembler (Others?) does not take register mnemonics.
216 // FIXME - What about special registers used in mfspr/mtspr?
217 if (!Subtarget
->isDarwin())
218 RegName
= PPCRegisterInfo::stripRegisterPrefix(RegName
);
222 case MachineOperand::MO_Immediate
:
226 case MachineOperand::MO_MachineBasicBlock
:
227 MO
.getMBB()->getSymbol()->print(O
, MAI
);
229 case MachineOperand::MO_ConstantPoolIndex
:
230 O
<< DL
.getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
233 case MachineOperand::MO_BlockAddress
:
234 GetBlockAddressSymbol(MO
.getBlockAddress())->print(O
, MAI
);
236 case MachineOperand::MO_GlobalAddress
: {
237 PrintSymbolOperand(MO
, O
);
242 O
<< "<unknown operand type: " << (unsigned)MO
.getType() << ">";
247 /// PrintAsmOperand - Print out an operand for an inline asm expression.
249 bool PPCAsmPrinter::PrintAsmOperand(const MachineInstr
*MI
, unsigned OpNo
,
250 const char *ExtraCode
, raw_ostream
&O
) {
251 // Does this asm operand have a single letter operand modifier?
252 if (ExtraCode
&& ExtraCode
[0]) {
253 if (ExtraCode
[1] != 0) return true; // Unknown modifier.
255 switch (ExtraCode
[0]) {
257 // See if this is a generic print operand
258 return AsmPrinter::PrintAsmOperand(MI
, OpNo
, ExtraCode
, O
);
259 case 'L': // Write second word of DImode reference.
260 // Verify that this operand has two consecutive registers.
261 if (!MI
->getOperand(OpNo
).isReg() ||
262 OpNo
+1 == MI
->getNumOperands() ||
263 !MI
->getOperand(OpNo
+1).isReg())
265 ++OpNo
; // Return the high-part.
268 // Write 'i' if an integer constant, otherwise nothing. Used to print
270 if (MI
->getOperand(OpNo
).isImm())
274 if(!MI
->getOperand(OpNo
).isReg())
276 // This operand uses VSX numbering.
277 // If the operand is a VMX register, convert it to a VSX register.
278 Register Reg
= MI
->getOperand(OpNo
).getReg();
279 if (PPCInstrInfo::isVRRegister(Reg
))
280 Reg
= PPC::VSX32
+ (Reg
- PPC::V0
);
281 else if (PPCInstrInfo::isVFRegister(Reg
))
282 Reg
= PPC::VSX32
+ (Reg
- PPC::VF0
);
284 RegName
= PPCInstPrinter::getRegisterName(Reg
);
285 RegName
= PPCRegisterInfo::stripRegisterPrefix(RegName
);
291 printOperand(MI
, OpNo
, O
);
295 // At the moment, all inline asm memory operands are a single register.
296 // In any case, the output of this routine should always be just one
297 // assembler operand.
299 bool PPCAsmPrinter::PrintAsmMemoryOperand(const MachineInstr
*MI
, unsigned OpNo
,
300 const char *ExtraCode
,
302 if (ExtraCode
&& ExtraCode
[0]) {
303 if (ExtraCode
[1] != 0) return true; // Unknown modifier.
305 switch (ExtraCode
[0]) {
306 default: return true; // Unknown modifier.
307 case 'y': // A memory reference for an X-form instruction
309 const char *RegName
= "r0";
310 if (!Subtarget
->isDarwin())
311 RegName
= PPCRegisterInfo::stripRegisterPrefix(RegName
);
312 O
<< RegName
<< ", ";
313 printOperand(MI
, OpNo
, O
);
316 case 'U': // Print 'u' for update form.
317 case 'X': // Print 'x' for indexed form.
319 // FIXME: Currently for PowerPC memory operands are always loaded
320 // into a register, so we never get an update or indexed form.
321 // This is bad even for offset forms, since even if we know we
322 // have a value in -16(r1), we will generate a load into r<n>
323 // and then load from 0(r<n>). Until that issue is fixed,
324 // tolerate 'U' and 'X' but don't output anything.
325 assert(MI
->getOperand(OpNo
).isReg());
331 assert(MI
->getOperand(OpNo
).isReg());
333 printOperand(MI
, OpNo
, O
);
338 /// lookUpOrCreateTOCEntry -- Given a symbol, look up whether a TOC entry
339 /// exists for it. If not, create one. Then return a symbol that references
341 MCSymbol
*PPCAsmPrinter::lookUpOrCreateTOCEntry(const MCSymbol
*Sym
) {
342 MCSymbol
*&TOCEntry
= TOC
[Sym
];
344 TOCEntry
= createTempSymbol("C");
348 void PPCAsmPrinter::EmitEndOfAsmFile(Module
&M
) {
352 void PPCAsmPrinter::LowerSTACKMAP(StackMaps
&SM
, const MachineInstr
&MI
) {
353 unsigned NumNOPBytes
= MI
.getOperand(1).getImm();
355 SM
.recordStackMap(MI
);
356 assert(NumNOPBytes
% 4 == 0 && "Invalid number of NOP bytes requested!");
358 // Scan ahead to trim the shadow.
359 const MachineBasicBlock
&MBB
= *MI
.getParent();
360 MachineBasicBlock::const_iterator
MII(MI
);
362 while (NumNOPBytes
> 0) {
363 if (MII
== MBB
.end() || MII
->isCall() ||
364 MII
->getOpcode() == PPC::DBG_VALUE
||
365 MII
->getOpcode() == TargetOpcode::PATCHPOINT
||
366 MII
->getOpcode() == TargetOpcode::STACKMAP
)
373 for (unsigned i
= 0; i
< NumNOPBytes
; i
+= 4)
374 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::NOP
));
377 // Lower a patchpoint of the form:
378 // [<def>], <id>, <numBytes>, <target>, <numArgs>
379 void PPCAsmPrinter::LowerPATCHPOINT(StackMaps
&SM
, const MachineInstr
&MI
) {
380 SM
.recordPatchPoint(MI
);
381 PatchPointOpers
Opers(&MI
);
383 unsigned EncodedBytes
= 0;
384 const MachineOperand
&CalleeMO
= Opers
.getCallTarget();
386 if (CalleeMO
.isImm()) {
387 int64_t CallTarget
= CalleeMO
.getImm();
389 assert((CallTarget
& 0xFFFFFFFFFFFF) == CallTarget
&&
390 "High 16 bits of call target should be zero.");
391 Register ScratchReg
= MI
.getOperand(Opers
.getNextScratchIdx()).getReg();
393 // Materialize the jump address:
394 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::LI8
)
396 .addImm((CallTarget
>> 32) & 0xFFFF));
398 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::RLDIC
)
401 .addImm(32).addImm(16));
403 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::ORIS8
)
406 .addImm((CallTarget
>> 16) & 0xFFFF));
408 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::ORI8
)
411 .addImm(CallTarget
& 0xFFFF));
413 // Save the current TOC pointer before the remote call.
414 int TOCSaveOffset
= Subtarget
->getFrameLowering()->getTOCSaveOffset();
415 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::STD
)
417 .addImm(TOCSaveOffset
)
421 // If we're on ELFv1, then we need to load the actual function pointer
422 // from the function descriptor.
423 if (!Subtarget
->isELFv2ABI()) {
424 // Load the new TOC pointer and the function address, but not r11
425 // (needing this is rare, and loading it here would prevent passing it
426 // via a 'nest' parameter.
427 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::LD
)
430 .addReg(ScratchReg
));
432 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::LD
)
435 .addReg(ScratchReg
));
439 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::MTCTR8
)
440 .addReg(ScratchReg
));
442 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::BCTRL8
));
445 // Restore the TOC pointer after the call.
446 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::LD
)
448 .addImm(TOCSaveOffset
)
452 } else if (CalleeMO
.isGlobal()) {
453 const GlobalValue
*GValue
= CalleeMO
.getGlobal();
454 MCSymbol
*MOSymbol
= getSymbol(GValue
);
455 const MCExpr
*SymVar
= MCSymbolRefExpr::create(MOSymbol
, OutContext
);
457 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::BL8_NOP
)
462 // Each instruction is 4 bytes.
466 unsigned NumBytes
= Opers
.getNumPatchBytes();
467 assert(NumBytes
>= EncodedBytes
&&
468 "Patchpoint can't request size less than the length of a call.");
469 assert((NumBytes
- EncodedBytes
) % 4 == 0 &&
470 "Invalid number of NOP bytes requested!");
471 for (unsigned i
= EncodedBytes
; i
< NumBytes
; i
+= 4)
472 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::NOP
));
475 /// EmitTlsCall -- Given a GETtls[ld]ADDR[32] instruction, print a
476 /// call to __tls_get_addr to the current output stream.
477 void PPCAsmPrinter::EmitTlsCall(const MachineInstr
*MI
,
478 MCSymbolRefExpr::VariantKind VK
) {
479 StringRef Name
= "__tls_get_addr";
480 MCSymbol
*TlsGetAddr
= OutContext
.getOrCreateSymbol(Name
);
481 MCSymbolRefExpr::VariantKind Kind
= MCSymbolRefExpr::VK_None
;
482 const Module
*M
= MF
->getFunction().getParent();
484 assert(MI
->getOperand(0).isReg() &&
485 ((Subtarget
->isPPC64() && MI
->getOperand(0).getReg() == PPC::X3
) ||
486 (!Subtarget
->isPPC64() && MI
->getOperand(0).getReg() == PPC::R3
)) &&
487 "GETtls[ld]ADDR[32] must define GPR3");
488 assert(MI
->getOperand(1).isReg() &&
489 ((Subtarget
->isPPC64() && MI
->getOperand(1).getReg() == PPC::X3
) ||
490 (!Subtarget
->isPPC64() && MI
->getOperand(1).getReg() == PPC::R3
)) &&
491 "GETtls[ld]ADDR[32] must read GPR3");
493 if (!Subtarget
->isPPC64() && !Subtarget
->isDarwin() &&
494 isPositionIndependent())
495 Kind
= MCSymbolRefExpr::VK_PLT
;
496 const MCExpr
*TlsRef
=
497 MCSymbolRefExpr::create(TlsGetAddr
, Kind
, OutContext
);
499 // Add 32768 offset to the symbol so we follow up the latest GOT/PLT ABI.
500 if (Kind
== MCSymbolRefExpr::VK_PLT
&& Subtarget
->isSecurePlt() &&
501 M
->getPICLevel() == PICLevel::BigPIC
)
502 TlsRef
= MCBinaryExpr::createAdd(
503 TlsRef
, MCConstantExpr::create(32768, OutContext
), OutContext
);
504 const MachineOperand
&MO
= MI
->getOperand(2);
505 const GlobalValue
*GValue
= MO
.getGlobal();
506 MCSymbol
*MOSymbol
= getSymbol(GValue
);
507 const MCExpr
*SymVar
= MCSymbolRefExpr::create(MOSymbol
, VK
, OutContext
);
508 EmitToStreamer(*OutStreamer
,
509 MCInstBuilder(Subtarget
->isPPC64() ?
510 PPC::BL8_NOP_TLS
: PPC::BL_TLS
)
515 /// Map a machine operand for a TOC pseudo-machine instruction to its
516 /// corresponding MCSymbol.
517 static MCSymbol
*getMCSymbolForTOCPseudoMO(const MachineOperand
&MO
,
519 switch (MO
.getType()) {
520 case MachineOperand::MO_GlobalAddress
:
521 return AP
.getSymbol(MO
.getGlobal());
522 case MachineOperand::MO_ConstantPoolIndex
:
523 return AP
.GetCPISymbol(MO
.getIndex());
524 case MachineOperand::MO_JumpTableIndex
:
525 return AP
.GetJTISymbol(MO
.getIndex());
526 case MachineOperand::MO_BlockAddress
:
527 return AP
.GetBlockAddressSymbol(MO
.getBlockAddress());
529 llvm_unreachable("Unexpected operand type to get symbol.");
533 /// EmitInstruction -- Print out a single PowerPC MI in Darwin syntax to
534 /// the current output stream.
536 void PPCAsmPrinter::EmitInstruction(const MachineInstr
*MI
) {
538 const bool IsDarwin
= TM
.getTargetTriple().isOSDarwin();
539 const bool IsPPC64
= Subtarget
->isPPC64();
540 const bool IsAIX
= Subtarget
->isAIXABI();
541 const Module
*M
= MF
->getFunction().getParent();
542 PICLevel::Level PL
= M
->getPICLevel();
545 // Validate that SPE and FPU are mutually exclusive in codegen
546 if (!MI
->isInlineAsm()) {
547 for (const MachineOperand
&MO
: MI
->operands()) {
549 Register Reg
= MO
.getReg();
550 if (Subtarget
->hasSPE()) {
551 if (PPC::F4RCRegClass
.contains(Reg
) ||
552 PPC::F8RCRegClass
.contains(Reg
) ||
553 PPC::QBRCRegClass
.contains(Reg
) ||
554 PPC::QFRCRegClass
.contains(Reg
) ||
555 PPC::QSRCRegClass
.contains(Reg
) ||
556 PPC::VFRCRegClass
.contains(Reg
) ||
557 PPC::VRRCRegClass
.contains(Reg
) ||
558 PPC::VSFRCRegClass
.contains(Reg
) ||
559 PPC::VSSRCRegClass
.contains(Reg
)
561 llvm_unreachable("SPE targets cannot have FPRegs!");
563 if (PPC::SPERCRegClass
.contains(Reg
))
564 llvm_unreachable("SPE register found in FPU-targeted code!");
570 // Lower multi-instruction pseudo operations.
571 switch (MI
->getOpcode()) {
573 case TargetOpcode::DBG_VALUE
:
574 llvm_unreachable("Should be handled target independently");
575 case TargetOpcode::STACKMAP
:
576 return LowerSTACKMAP(SM
, *MI
);
577 case TargetOpcode::PATCHPOINT
:
578 return LowerPATCHPOINT(SM
, *MI
);
580 case PPC::MoveGOTtoLR
: {
581 // Transform %lr = MoveGOTtoLR
582 // Into this: bl _GLOBAL_OFFSET_TABLE_@local-4
583 // _GLOBAL_OFFSET_TABLE_@local-4 (instruction preceding
584 // _GLOBAL_OFFSET_TABLE_) has exactly one instruction:
586 // This will return the pointer to _GLOBAL_OFFSET_TABLE_@local
587 MCSymbol
*GOTSymbol
=
588 OutContext
.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_"));
589 const MCExpr
*OffsExpr
=
590 MCBinaryExpr::createSub(MCSymbolRefExpr::create(GOTSymbol
,
591 MCSymbolRefExpr::VK_PPC_LOCAL
,
593 MCConstantExpr::create(4, OutContext
),
597 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::BL
).addExpr(OffsExpr
));
600 case PPC::MovePCtoLR
:
601 case PPC::MovePCtoLR8
: {
602 // Transform %lr = MovePCtoLR
603 // Into this, where the label is the PIC base:
606 MCSymbol
*PICBase
= MF
->getPICBaseSymbol();
609 EmitToStreamer(*OutStreamer
,
610 MCInstBuilder(PPC::BL
)
611 // FIXME: We would like an efficient form for this, so we
612 // don't have to do a lot of extra uniquing.
613 .addExpr(MCSymbolRefExpr::create(PICBase
, OutContext
)));
616 OutStreamer
->EmitLabel(PICBase
);
619 case PPC::UpdateGBR
: {
620 // Transform %rd = UpdateGBR(%rt, %ri)
621 // Into: lwz %rt, .L0$poff - .L0$pb(%ri)
623 // or into (if secure plt mode is on):
624 // addis r30, r30, {.LTOC,_GLOBAL_OFFSET_TABLE} - .L0$pb@ha
625 // addi r30, r30, {.LTOC,_GLOBAL_OFFSET_TABLE} - .L0$pb@l
626 // Get the offset from the GOT Base Register to the GOT
627 LowerPPCMachineInstrToMCInst(MI
, TmpInst
, *this, IsDarwin
);
628 if (Subtarget
->isSecurePlt() && isPositionIndependent() ) {
629 unsigned PICR
= TmpInst
.getOperand(0).getReg();
630 MCSymbol
*BaseSymbol
= OutContext
.getOrCreateSymbol(
631 M
->getPICLevel() == PICLevel::SmallPIC
? "_GLOBAL_OFFSET_TABLE_"
634 MCSymbolRefExpr::create(MF
->getPICBaseSymbol(), OutContext
);
636 const MCExpr
*DeltaExpr
= MCBinaryExpr::createSub(
637 MCSymbolRefExpr::create(BaseSymbol
, OutContext
), PB
, OutContext
);
639 const MCExpr
*DeltaHi
= PPCMCExpr::createHa(DeltaExpr
, false, OutContext
);
642 MCInstBuilder(PPC::ADDIS
).addReg(PICR
).addReg(PICR
).addExpr(DeltaHi
));
644 const MCExpr
*DeltaLo
= PPCMCExpr::createLo(DeltaExpr
, false, OutContext
);
647 MCInstBuilder(PPC::ADDI
).addReg(PICR
).addReg(PICR
).addExpr(DeltaLo
));
650 MCSymbol
*PICOffset
=
651 MF
->getInfo
<PPCFunctionInfo
>()->getPICOffsetSymbol();
652 TmpInst
.setOpcode(PPC::LWZ
);
654 MCSymbolRefExpr::create(PICOffset
, MCSymbolRefExpr::VK_None
, OutContext
);
656 MCSymbolRefExpr::create(MF
->getPICBaseSymbol(),
657 MCSymbolRefExpr::VK_None
,
659 const MCOperand TR
= TmpInst
.getOperand(1);
660 const MCOperand PICR
= TmpInst
.getOperand(0);
662 // Step 1: lwz %rt, .L$poff - .L$pb(%ri)
663 TmpInst
.getOperand(1) =
664 MCOperand::createExpr(MCBinaryExpr::createSub(Exp
, PB
, OutContext
));
665 TmpInst
.getOperand(0) = TR
;
666 TmpInst
.getOperand(2) = PICR
;
667 EmitToStreamer(*OutStreamer
, TmpInst
);
669 TmpInst
.setOpcode(PPC::ADD4
);
670 TmpInst
.getOperand(0) = PICR
;
671 TmpInst
.getOperand(1) = TR
;
672 TmpInst
.getOperand(2) = PICR
;
673 EmitToStreamer(*OutStreamer
, TmpInst
);
678 assert(!IsDarwin
&& "TOC is an ELF/XCOFF construct.");
680 // Transform %rN = LWZtoc @op1, %r2
681 LowerPPCMachineInstrToMCInst(MI
, TmpInst
, *this, IsDarwin
);
683 // Change the opcode to LWZ.
684 TmpInst
.setOpcode(PPC::LWZ
);
686 const MachineOperand
&MO
= MI
->getOperand(1);
687 assert((MO
.isGlobal() || MO
.isCPI() || MO
.isJTI() || MO
.isBlockAddress()) &&
688 "Invalid operand for LWZtoc.");
690 // Map the operand to its corresponding MCSymbol.
691 const MCSymbol
*const MOSymbol
= getMCSymbolForTOCPseudoMO(MO
, *this);
693 // Create a reference to the GOT entry for the symbol. The GOT entry will be
694 // synthesized later.
695 if (PL
== PICLevel::SmallPIC
&& !IsAIX
) {
697 MCSymbolRefExpr::create(MOSymbol
, MCSymbolRefExpr::VK_GOT
,
699 TmpInst
.getOperand(1) = MCOperand::createExpr(Exp
);
700 EmitToStreamer(*OutStreamer
, TmpInst
);
704 // Otherwise, use the TOC. 'TOCEntry' is a label used to reference the
705 // storage allocated in the TOC which contains the address of
706 // 'MOSymbol'. Said TOC entry will be synthesized later.
707 MCSymbol
*TOCEntry
= lookUpOrCreateTOCEntry(MOSymbol
);
709 MCSymbolRefExpr::create(TOCEntry
, MCSymbolRefExpr::VK_None
, OutContext
);
711 // AIX uses the label directly as the lwz displacement operand for
712 // references into the toc section. The displacement value will be generated
713 // relative to the toc-base.
716 TM
.getCodeModel() == CodeModel::Small
&&
717 "This pseudo should only be selected for 32-bit small code model.");
718 TmpInst
.getOperand(1) = MCOperand::createExpr(Exp
);
719 EmitToStreamer(*OutStreamer
, TmpInst
);
723 // Create an explicit subtract expression between the local symbol and
724 // '.LTOC' to manifest the toc-relative offset.
725 const MCExpr
*PB
= MCSymbolRefExpr::create(
726 OutContext
.getOrCreateSymbol(Twine(".LTOC")), OutContext
);
727 Exp
= MCBinaryExpr::createSub(Exp
, PB
, OutContext
);
728 TmpInst
.getOperand(1) = MCOperand::createExpr(Exp
);
729 EmitToStreamer(*OutStreamer
, TmpInst
);
736 assert(!IsDarwin
&& "TOC is an ELF/XCOFF construct");
738 // Transform %x3 = LDtoc @min1, %x2
739 LowerPPCMachineInstrToMCInst(MI
, TmpInst
, *this, IsDarwin
);
741 // Change the opcode to LD.
742 TmpInst
.setOpcode(PPC::LD
);
744 const MachineOperand
&MO
= MI
->getOperand(1);
745 assert((MO
.isGlobal() || MO
.isCPI() || MO
.isJTI() || MO
.isBlockAddress()) &&
748 // Map the machine operand to its corresponding MCSymbol, then map the
749 // global address operand to be a reference to the TOC entry we will
752 lookUpOrCreateTOCEntry(getMCSymbolForTOCPseudoMO(MO
, *this));
754 const MCSymbolRefExpr::VariantKind VK
=
755 IsAIX
? MCSymbolRefExpr::VK_None
: MCSymbolRefExpr::VK_PPC_TOC
;
757 MCSymbolRefExpr::create(TOCEntry
, VK
, OutContext
);
758 TmpInst
.getOperand(1) = MCOperand::createExpr(Exp
);
759 EmitToStreamer(*OutStreamer
, TmpInst
);
762 case PPC::ADDIStocHA
: {
763 assert((IsAIX
&& !IsPPC64
&& TM
.getCodeModel() == CodeModel::Large
) &&
764 "This pseudo should only be selected for 32-bit large code model on"
767 // Transform %rd = ADDIStocHA %rA, @sym(%r2)
768 LowerPPCMachineInstrToMCInst(MI
, TmpInst
, *this, IsDarwin
);
770 // Change the opcode to ADDIS.
771 TmpInst
.setOpcode(PPC::ADDIS
);
773 const MachineOperand
&MO
= MI
->getOperand(2);
774 assert((MO
.isGlobal() || MO
.isCPI() || MO
.isJTI() || MO
.isBlockAddress()) &&
775 "Invalid operand for ADDIStocHA.");
777 // Map the machine operand to its corresponding MCSymbol.
778 MCSymbol
*MOSymbol
= getMCSymbolForTOCPseudoMO(MO
, *this);
780 // Always use TOC on AIX. Map the global address operand to be a reference
781 // to the TOC entry we will synthesize later. 'TOCEntry' is a label used to
782 // reference the storage allocated in the TOC which contains the address of
784 MCSymbol
*TOCEntry
= lookUpOrCreateTOCEntry(MOSymbol
);
785 const MCExpr
*Exp
= MCSymbolRefExpr::create(TOCEntry
,
786 MCSymbolRefExpr::VK_PPC_U
,
788 TmpInst
.getOperand(2) = MCOperand::createExpr(Exp
);
789 EmitToStreamer(*OutStreamer
, TmpInst
);
793 assert(IsAIX
&& !IsPPC64
&& TM
.getCodeModel() == CodeModel::Large
&&
794 "This pseudo should only be selected for 32-bit large code model on"
797 // Transform %rd = LWZtocL @sym, %rs.
798 LowerPPCMachineInstrToMCInst(MI
, TmpInst
, *this, IsDarwin
);
800 // Change the opcode to lwz.
801 TmpInst
.setOpcode(PPC::LWZ
);
803 const MachineOperand
&MO
= MI
->getOperand(1);
804 assert((MO
.isGlobal() || MO
.isCPI() || MO
.isJTI() || MO
.isBlockAddress()) &&
805 "Invalid operand for LWZtocL.");
807 // Map the machine operand to its corresponding MCSymbol.
808 MCSymbol
*MOSymbol
= getMCSymbolForTOCPseudoMO(MO
, *this);
810 // Always use TOC on AIX. Map the global address operand to be a reference
811 // to the TOC entry we will synthesize later. 'TOCEntry' is a label used to
812 // reference the storage allocated in the TOC which contains the address of
814 MCSymbol
*TOCEntry
= lookUpOrCreateTOCEntry(MOSymbol
);
815 const MCExpr
*Exp
= MCSymbolRefExpr::create(TOCEntry
,
816 MCSymbolRefExpr::VK_PPC_L
,
818 TmpInst
.getOperand(1) = MCOperand::createExpr(Exp
);
819 EmitToStreamer(*OutStreamer
, TmpInst
);
822 case PPC::ADDIStocHA8
: {
823 assert(!IsDarwin
&& "TOC is an ELF/XCOFF construct");
825 // Transform %xd = ADDIStocHA8 %x2, @sym
826 LowerPPCMachineInstrToMCInst(MI
, TmpInst
, *this, IsDarwin
);
828 // Change the opcode to ADDIS8. If the global address is the address of
829 // an external symbol, is a jump table address, is a block address, or is a
830 // constant pool index with large code model enabled, then generate a TOC
831 // entry and reference that. Otherwise, reference the symbol directly.
832 TmpInst
.setOpcode(PPC::ADDIS8
);
834 const MachineOperand
&MO
= MI
->getOperand(2);
835 assert((MO
.isGlobal() || MO
.isCPI() || MO
.isJTI() || MO
.isBlockAddress()) &&
836 "Invalid operand for ADDIStocHA8!");
838 const MCSymbol
*MOSymbol
= getMCSymbolForTOCPseudoMO(MO
, *this);
840 const bool GlobalToc
=
841 MO
.isGlobal() && Subtarget
->isGVIndirectSymbol(MO
.getGlobal());
842 if (GlobalToc
|| MO
.isJTI() || MO
.isBlockAddress() ||
843 (MO
.isCPI() && TM
.getCodeModel() == CodeModel::Large
))
844 MOSymbol
= lookUpOrCreateTOCEntry(MOSymbol
);
846 const MCSymbolRefExpr::VariantKind VK
=
847 IsAIX
? MCSymbolRefExpr::VK_PPC_U
: MCSymbolRefExpr::VK_PPC_TOC_HA
;
850 MCSymbolRefExpr::create(MOSymbol
, VK
, OutContext
);
852 if (!MO
.isJTI() && MO
.getOffset())
853 Exp
= MCBinaryExpr::createAdd(Exp
,
854 MCConstantExpr::create(MO
.getOffset(),
858 TmpInst
.getOperand(2) = MCOperand::createExpr(Exp
);
859 EmitToStreamer(*OutStreamer
, TmpInst
);
863 assert(!IsDarwin
&& "TOC is an ELF/XCOFF construct");
865 // Transform %xd = LDtocL @sym, %xs
866 LowerPPCMachineInstrToMCInst(MI
, TmpInst
, *this, IsDarwin
);
868 // Change the opcode to LD. If the global address is the address of
869 // an external symbol, is a jump table address, is a block address, or is
870 // a constant pool index with large code model enabled, then generate a
871 // TOC entry and reference that. Otherwise, reference the symbol directly.
872 TmpInst
.setOpcode(PPC::LD
);
874 const MachineOperand
&MO
= MI
->getOperand(1);
875 assert((MO
.isGlobal() || MO
.isCPI() || MO
.isJTI() ||
876 MO
.isBlockAddress()) &&
877 "Invalid operand for LDtocL!");
880 (!MO
.isGlobal() || Subtarget
->isGVIndirectSymbol(MO
.getGlobal())) &&
881 "LDtocL used on symbol that could be accessed directly is "
882 "invalid. Must match ADDIStocHA8."));
884 const MCSymbol
*MOSymbol
= getMCSymbolForTOCPseudoMO(MO
, *this);
886 if (!MO
.isCPI() || TM
.getCodeModel() == CodeModel::Large
)
887 MOSymbol
= lookUpOrCreateTOCEntry(MOSymbol
);
889 const MCSymbolRefExpr::VariantKind VK
=
890 IsAIX
? MCSymbolRefExpr::VK_PPC_L
: MCSymbolRefExpr::VK_PPC_TOC_LO
;
892 MCSymbolRefExpr::create(MOSymbol
, VK
, OutContext
);
893 TmpInst
.getOperand(1) = MCOperand::createExpr(Exp
);
894 EmitToStreamer(*OutStreamer
, TmpInst
);
897 case PPC::ADDItocL
: {
898 // Transform %xd = ADDItocL %xs, @sym
899 LowerPPCMachineInstrToMCInst(MI
, TmpInst
, *this, IsDarwin
);
901 // Change the opcode to ADDI8. If the global address is external, then
902 // generate a TOC entry and reference that. Otherwise, reference the
904 TmpInst
.setOpcode(PPC::ADDI8
);
906 const MachineOperand
&MO
= MI
->getOperand(2);
907 assert((MO
.isGlobal() || MO
.isCPI()) && "Invalid operand for ADDItocL.");
910 !(MO
.isGlobal() && Subtarget
->isGVIndirectSymbol(MO
.getGlobal())) &&
911 "Interposable definitions must use indirect access."));
914 MCSymbolRefExpr::create(getMCSymbolForTOCPseudoMO(MO
, *this),
915 MCSymbolRefExpr::VK_PPC_TOC_LO
, OutContext
);
916 TmpInst
.getOperand(2) = MCOperand::createExpr(Exp
);
917 EmitToStreamer(*OutStreamer
, TmpInst
);
920 case PPC::ADDISgotTprelHA
: {
921 // Transform: %xd = ADDISgotTprelHA %x2, @sym
922 // Into: %xd = ADDIS8 %x2, sym@got@tlsgd@ha
923 assert(IsPPC64
&& "Not supported for 32-bit PowerPC");
924 const MachineOperand
&MO
= MI
->getOperand(2);
925 const GlobalValue
*GValue
= MO
.getGlobal();
926 MCSymbol
*MOSymbol
= getSymbol(GValue
);
927 const MCExpr
*SymGotTprel
=
928 MCSymbolRefExpr::create(MOSymbol
, MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA
,
930 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::ADDIS8
)
931 .addReg(MI
->getOperand(0).getReg())
932 .addReg(MI
->getOperand(1).getReg())
933 .addExpr(SymGotTprel
));
936 case PPC::LDgotTprelL
:
937 case PPC::LDgotTprelL32
: {
938 // Transform %xd = LDgotTprelL @sym, %xs
939 LowerPPCMachineInstrToMCInst(MI
, TmpInst
, *this, IsDarwin
);
941 // Change the opcode to LD.
942 TmpInst
.setOpcode(IsPPC64
? PPC::LD
: PPC::LWZ
);
943 const MachineOperand
&MO
= MI
->getOperand(1);
944 const GlobalValue
*GValue
= MO
.getGlobal();
945 MCSymbol
*MOSymbol
= getSymbol(GValue
);
946 const MCExpr
*Exp
= MCSymbolRefExpr::create(
947 MOSymbol
, IsPPC64
? MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO
948 : MCSymbolRefExpr::VK_PPC_GOT_TPREL
,
950 TmpInst
.getOperand(1) = MCOperand::createExpr(Exp
);
951 EmitToStreamer(*OutStreamer
, TmpInst
);
955 case PPC::PPC32PICGOT
: {
956 MCSymbol
*GOTSymbol
= OutContext
.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_"));
957 MCSymbol
*GOTRef
= OutContext
.createTempSymbol();
958 MCSymbol
*NextInstr
= OutContext
.createTempSymbol();
960 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::BL
)
961 // FIXME: We would like an efficient form for this, so we don't have to do
962 // a lot of extra uniquing.
963 .addExpr(MCSymbolRefExpr::create(NextInstr
, OutContext
)));
964 const MCExpr
*OffsExpr
=
965 MCBinaryExpr::createSub(MCSymbolRefExpr::create(GOTSymbol
, OutContext
),
966 MCSymbolRefExpr::create(GOTRef
, OutContext
),
968 OutStreamer
->EmitLabel(GOTRef
);
969 OutStreamer
->EmitValue(OffsExpr
, 4);
970 OutStreamer
->EmitLabel(NextInstr
);
971 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::MFLR
)
972 .addReg(MI
->getOperand(0).getReg()));
973 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::LWZ
)
974 .addReg(MI
->getOperand(1).getReg())
976 .addReg(MI
->getOperand(0).getReg()));
977 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::ADD4
)
978 .addReg(MI
->getOperand(0).getReg())
979 .addReg(MI
->getOperand(1).getReg())
980 .addReg(MI
->getOperand(0).getReg()));
983 case PPC::PPC32GOT
: {
984 MCSymbol
*GOTSymbol
=
985 OutContext
.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_"));
986 const MCExpr
*SymGotTlsL
= MCSymbolRefExpr::create(
987 GOTSymbol
, MCSymbolRefExpr::VK_PPC_LO
, OutContext
);
988 const MCExpr
*SymGotTlsHA
= MCSymbolRefExpr::create(
989 GOTSymbol
, MCSymbolRefExpr::VK_PPC_HA
, OutContext
);
990 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::LI
)
991 .addReg(MI
->getOperand(0).getReg())
992 .addExpr(SymGotTlsL
));
993 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::ADDIS
)
994 .addReg(MI
->getOperand(0).getReg())
995 .addReg(MI
->getOperand(0).getReg())
996 .addExpr(SymGotTlsHA
));
999 case PPC::ADDIStlsgdHA
: {
1000 // Transform: %xd = ADDIStlsgdHA %x2, @sym
1001 // Into: %xd = ADDIS8 %x2, sym@got@tlsgd@ha
1002 assert(IsPPC64
&& "Not supported for 32-bit PowerPC");
1003 const MachineOperand
&MO
= MI
->getOperand(2);
1004 const GlobalValue
*GValue
= MO
.getGlobal();
1005 MCSymbol
*MOSymbol
= getSymbol(GValue
);
1006 const MCExpr
*SymGotTlsGD
=
1007 MCSymbolRefExpr::create(MOSymbol
, MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA
,
1009 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::ADDIS8
)
1010 .addReg(MI
->getOperand(0).getReg())
1011 .addReg(MI
->getOperand(1).getReg())
1012 .addExpr(SymGotTlsGD
));
1015 case PPC::ADDItlsgdL
:
1016 // Transform: %xd = ADDItlsgdL %xs, @sym
1017 // Into: %xd = ADDI8 %xs, sym@got@tlsgd@l
1018 case PPC::ADDItlsgdL32
: {
1019 // Transform: %rd = ADDItlsgdL32 %rs, @sym
1020 // Into: %rd = ADDI %rs, sym@got@tlsgd
1021 const MachineOperand
&MO
= MI
->getOperand(2);
1022 const GlobalValue
*GValue
= MO
.getGlobal();
1023 MCSymbol
*MOSymbol
= getSymbol(GValue
);
1024 const MCExpr
*SymGotTlsGD
= MCSymbolRefExpr::create(
1025 MOSymbol
, IsPPC64
? MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO
1026 : MCSymbolRefExpr::VK_PPC_GOT_TLSGD
,
1028 EmitToStreamer(*OutStreamer
,
1029 MCInstBuilder(IsPPC64
? PPC::ADDI8
: PPC::ADDI
)
1030 .addReg(MI
->getOperand(0).getReg())
1031 .addReg(MI
->getOperand(1).getReg())
1032 .addExpr(SymGotTlsGD
));
1035 case PPC::GETtlsADDR
:
1036 // Transform: %x3 = GETtlsADDR %x3, @sym
1037 // Into: BL8_NOP_TLS __tls_get_addr(sym at tlsgd)
1038 case PPC::GETtlsADDR32
: {
1039 // Transform: %r3 = GETtlsADDR32 %r3, @sym
1040 // Into: BL_TLS __tls_get_addr(sym at tlsgd)@PLT
1041 EmitTlsCall(MI
, MCSymbolRefExpr::VK_PPC_TLSGD
);
1044 case PPC::ADDIStlsldHA
: {
1045 // Transform: %xd = ADDIStlsldHA %x2, @sym
1046 // Into: %xd = ADDIS8 %x2, sym@got@tlsld@ha
1047 assert(IsPPC64
&& "Not supported for 32-bit PowerPC");
1048 const MachineOperand
&MO
= MI
->getOperand(2);
1049 const GlobalValue
*GValue
= MO
.getGlobal();
1050 MCSymbol
*MOSymbol
= getSymbol(GValue
);
1051 const MCExpr
*SymGotTlsLD
=
1052 MCSymbolRefExpr::create(MOSymbol
, MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA
,
1054 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::ADDIS8
)
1055 .addReg(MI
->getOperand(0).getReg())
1056 .addReg(MI
->getOperand(1).getReg())
1057 .addExpr(SymGotTlsLD
));
1060 case PPC::ADDItlsldL
:
1061 // Transform: %xd = ADDItlsldL %xs, @sym
1062 // Into: %xd = ADDI8 %xs, sym@got@tlsld@l
1063 case PPC::ADDItlsldL32
: {
1064 // Transform: %rd = ADDItlsldL32 %rs, @sym
1065 // Into: %rd = ADDI %rs, sym@got@tlsld
1066 const MachineOperand
&MO
= MI
->getOperand(2);
1067 const GlobalValue
*GValue
= MO
.getGlobal();
1068 MCSymbol
*MOSymbol
= getSymbol(GValue
);
1069 const MCExpr
*SymGotTlsLD
= MCSymbolRefExpr::create(
1070 MOSymbol
, IsPPC64
? MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO
1071 : MCSymbolRefExpr::VK_PPC_GOT_TLSLD
,
1073 EmitToStreamer(*OutStreamer
,
1074 MCInstBuilder(IsPPC64
? PPC::ADDI8
: PPC::ADDI
)
1075 .addReg(MI
->getOperand(0).getReg())
1076 .addReg(MI
->getOperand(1).getReg())
1077 .addExpr(SymGotTlsLD
));
1080 case PPC::GETtlsldADDR
:
1081 // Transform: %x3 = GETtlsldADDR %x3, @sym
1082 // Into: BL8_NOP_TLS __tls_get_addr(sym at tlsld)
1083 case PPC::GETtlsldADDR32
: {
1084 // Transform: %r3 = GETtlsldADDR32 %r3, @sym
1085 // Into: BL_TLS __tls_get_addr(sym at tlsld)@PLT
1086 EmitTlsCall(MI
, MCSymbolRefExpr::VK_PPC_TLSLD
);
1089 case PPC::ADDISdtprelHA
:
1090 // Transform: %xd = ADDISdtprelHA %xs, @sym
1091 // Into: %xd = ADDIS8 %xs, sym@dtprel@ha
1092 case PPC::ADDISdtprelHA32
: {
1093 // Transform: %rd = ADDISdtprelHA32 %rs, @sym
1094 // Into: %rd = ADDIS %rs, sym@dtprel@ha
1095 const MachineOperand
&MO
= MI
->getOperand(2);
1096 const GlobalValue
*GValue
= MO
.getGlobal();
1097 MCSymbol
*MOSymbol
= getSymbol(GValue
);
1098 const MCExpr
*SymDtprel
=
1099 MCSymbolRefExpr::create(MOSymbol
, MCSymbolRefExpr::VK_PPC_DTPREL_HA
,
1103 MCInstBuilder(IsPPC64
? PPC::ADDIS8
: PPC::ADDIS
)
1104 .addReg(MI
->getOperand(0).getReg())
1105 .addReg(MI
->getOperand(1).getReg())
1106 .addExpr(SymDtprel
));
1109 case PPC::ADDIdtprelL
:
1110 // Transform: %xd = ADDIdtprelL %xs, @sym
1111 // Into: %xd = ADDI8 %xs, sym@dtprel@l
1112 case PPC::ADDIdtprelL32
: {
1113 // Transform: %rd = ADDIdtprelL32 %rs, @sym
1114 // Into: %rd = ADDI %rs, sym@dtprel@l
1115 const MachineOperand
&MO
= MI
->getOperand(2);
1116 const GlobalValue
*GValue
= MO
.getGlobal();
1117 MCSymbol
*MOSymbol
= getSymbol(GValue
);
1118 const MCExpr
*SymDtprel
=
1119 MCSymbolRefExpr::create(MOSymbol
, MCSymbolRefExpr::VK_PPC_DTPREL_LO
,
1121 EmitToStreamer(*OutStreamer
,
1122 MCInstBuilder(IsPPC64
? PPC::ADDI8
: PPC::ADDI
)
1123 .addReg(MI
->getOperand(0).getReg())
1124 .addReg(MI
->getOperand(1).getReg())
1125 .addExpr(SymDtprel
));
1130 if (!Subtarget
->hasMFOCRF()) {
1131 // Transform: %r3 = MFOCRF %cr7
1132 // Into: %r3 = MFCR ;; cr7
1133 unsigned NewOpcode
=
1134 MI
->getOpcode() == PPC::MFOCRF
? PPC::MFCR
: PPC::MFCR8
;
1135 OutStreamer
->AddComment(PPCInstPrinter::
1136 getRegisterName(MI
->getOperand(1).getReg()));
1137 EmitToStreamer(*OutStreamer
, MCInstBuilder(NewOpcode
)
1138 .addReg(MI
->getOperand(0).getReg()));
1144 if (!Subtarget
->hasMFOCRF()) {
1145 // Transform: %cr7 = MTOCRF %r3
1146 // Into: MTCRF mask, %r3 ;; cr7
1147 unsigned NewOpcode
=
1148 MI
->getOpcode() == PPC::MTOCRF
? PPC::MTCRF
: PPC::MTCRF8
;
1149 unsigned Mask
= 0x80 >> OutContext
.getRegisterInfo()
1150 ->getEncodingValue(MI
->getOperand(0).getReg());
1151 OutStreamer
->AddComment(PPCInstPrinter::
1152 getRegisterName(MI
->getOperand(0).getReg()));
1153 EmitToStreamer(*OutStreamer
, MCInstBuilder(NewOpcode
)
1155 .addReg(MI
->getOperand(1).getReg()));
1163 // Verify alignment is legal, so we don't create relocations
1164 // that can't be supported.
1165 // FIXME: This test is currently disabled for Darwin. The test
1166 // suite shows a handful of test cases that fail this check for
1167 // Darwin. Those need to be investigated before this sanity test
1168 // can be enabled for those subtargets.
1170 unsigned OpNum
= (MI
->getOpcode() == PPC::STD
) ? 2 : 1;
1171 const MachineOperand
&MO
= MI
->getOperand(OpNum
);
1172 if (MO
.isGlobal() && MO
.getGlobal()->getAlignment() < 4)
1173 llvm_unreachable("Global must be word-aligned for LD, STD, LWA!");
1175 // Now process the instruction normally.
1180 LowerPPCMachineInstrToMCInst(MI
, TmpInst
, *this, IsDarwin
);
1181 EmitToStreamer(*OutStreamer
, TmpInst
);
1184 void PPCLinuxAsmPrinter::EmitInstruction(const MachineInstr
*MI
) {
1185 if (!Subtarget
->isPPC64())
1186 return PPCAsmPrinter::EmitInstruction(MI
);
1188 switch (MI
->getOpcode()) {
1190 return PPCAsmPrinter::EmitInstruction(MI
);
1191 case TargetOpcode::PATCHABLE_FUNCTION_ENTER
: {
1193 // b .end # lis 0, FuncId[16..32]
1194 // nop # li 0, FuncId[0..15]
1197 // bl __xray_FunctionEntry
1201 // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number
1202 // of instructions change.
1203 MCSymbol
*BeginOfSled
= OutContext
.createTempSymbol();
1204 MCSymbol
*EndOfSled
= OutContext
.createTempSymbol();
1205 OutStreamer
->EmitLabel(BeginOfSled
);
1206 EmitToStreamer(*OutStreamer
,
1207 MCInstBuilder(PPC::B
).addExpr(
1208 MCSymbolRefExpr::create(EndOfSled
, OutContext
)));
1209 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::NOP
));
1212 MCInstBuilder(PPC::STD
).addReg(PPC::X0
).addImm(-8).addReg(PPC::X1
));
1213 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::MFLR8
).addReg(PPC::X0
));
1214 EmitToStreamer(*OutStreamer
,
1215 MCInstBuilder(PPC::BL8_NOP
)
1216 .addExpr(MCSymbolRefExpr::create(
1217 OutContext
.getOrCreateSymbol("__xray_FunctionEntry"),
1219 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::MTLR8
).addReg(PPC::X0
));
1220 OutStreamer
->EmitLabel(EndOfSled
);
1221 recordSled(BeginOfSled
, *MI
, SledKind::FUNCTION_ENTER
);
1224 case TargetOpcode::PATCHABLE_RET
: {
1225 unsigned RetOpcode
= MI
->getOperand(0).getImm();
1227 RetInst
.setOpcode(RetOpcode
);
1228 for (const auto &MO
:
1229 make_range(std::next(MI
->operands_begin()), MI
->operands_end())) {
1231 if (LowerPPCMachineOperandToMCOperand(MO
, MCOp
, *this, false))
1232 RetInst
.addOperand(MCOp
);
1236 if (RetOpcode
== PPC::BCCLR
) {
1237 IsConditional
= true;
1238 } else if (RetOpcode
== PPC::TCRETURNdi8
|| RetOpcode
== PPC::TCRETURNri8
||
1239 RetOpcode
== PPC::TCRETURNai8
) {
1241 } else if (RetOpcode
== PPC::BLR8
|| RetOpcode
== PPC::TAILB8
) {
1242 IsConditional
= false;
1244 EmitToStreamer(*OutStreamer
, RetInst
);
1248 MCSymbol
*FallthroughLabel
;
1249 if (IsConditional
) {
1257 // blr # lis 0, FuncId[16..32]
1258 // nop # li 0, FuncId[0..15]
1261 // bl __xray_FunctionExit
1266 // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number
1267 // of instructions change.
1268 FallthroughLabel
= OutContext
.createTempSymbol();
1271 MCInstBuilder(PPC::BCC
)
1272 .addImm(PPC::InvertPredicate(
1273 static_cast<PPC::Predicate
>(MI
->getOperand(1).getImm())))
1274 .addReg(MI
->getOperand(2).getReg())
1275 .addExpr(MCSymbolRefExpr::create(FallthroughLabel
, OutContext
)));
1277 RetInst
.setOpcode(PPC::BLR8
);
1281 // b(lr)? # lis 0, FuncId[16..32]
1282 // nop # li 0, FuncId[0..15]
1285 // bl __xray_FunctionExit
1289 // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number
1290 // of instructions change.
1291 OutStreamer
->EmitCodeAlignment(8);
1292 MCSymbol
*BeginOfSled
= OutContext
.createTempSymbol();
1293 OutStreamer
->EmitLabel(BeginOfSled
);
1294 EmitToStreamer(*OutStreamer
, RetInst
);
1295 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::NOP
));
1298 MCInstBuilder(PPC::STD
).addReg(PPC::X0
).addImm(-8).addReg(PPC::X1
));
1299 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::MFLR8
).addReg(PPC::X0
));
1300 EmitToStreamer(*OutStreamer
,
1301 MCInstBuilder(PPC::BL8_NOP
)
1302 .addExpr(MCSymbolRefExpr::create(
1303 OutContext
.getOrCreateSymbol("__xray_FunctionExit"),
1305 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::MTLR8
).addReg(PPC::X0
));
1306 EmitToStreamer(*OutStreamer
, RetInst
);
1308 OutStreamer
->EmitLabel(FallthroughLabel
);
1309 recordSled(BeginOfSled
, *MI
, SledKind::FUNCTION_EXIT
);
1312 case TargetOpcode::PATCHABLE_FUNCTION_EXIT
:
1313 llvm_unreachable("PATCHABLE_FUNCTION_EXIT should never be emitted");
1314 case TargetOpcode::PATCHABLE_TAIL_CALL
:
1315 // TODO: Define a trampoline `__xray_FunctionTailExit` and differentiate a
1316 // normal function exit from a tail exit.
1317 llvm_unreachable("Tail call is handled in the normal case. See comments "
1318 "around this assert.");
1322 void PPCLinuxAsmPrinter::EmitStartOfAsmFile(Module
&M
) {
1323 if (static_cast<const PPCTargetMachine
&>(TM
).isELFv2ABI()) {
1324 PPCTargetStreamer
*TS
=
1325 static_cast<PPCTargetStreamer
*>(OutStreamer
->getTargetStreamer());
1328 TS
->emitAbiVersion(2);
1331 if (static_cast<const PPCTargetMachine
&>(TM
).isPPC64() ||
1332 !isPositionIndependent())
1333 return AsmPrinter::EmitStartOfAsmFile(M
);
1335 if (M
.getPICLevel() == PICLevel::SmallPIC
)
1336 return AsmPrinter::EmitStartOfAsmFile(M
);
1338 OutStreamer
->SwitchSection(OutContext
.getELFSection(
1339 ".got2", ELF::SHT_PROGBITS
, ELF::SHF_WRITE
| ELF::SHF_ALLOC
));
1341 MCSymbol
*TOCSym
= OutContext
.getOrCreateSymbol(Twine(".LTOC"));
1342 MCSymbol
*CurrentPos
= OutContext
.createTempSymbol();
1344 OutStreamer
->EmitLabel(CurrentPos
);
1346 // The GOT pointer points to the middle of the GOT, in order to reference the
1347 // entire 64kB range. 0x8000 is the midpoint.
1348 const MCExpr
*tocExpr
=
1349 MCBinaryExpr::createAdd(MCSymbolRefExpr::create(CurrentPos
, OutContext
),
1350 MCConstantExpr::create(0x8000, OutContext
),
1353 OutStreamer
->EmitAssignment(TOCSym
, tocExpr
);
1355 OutStreamer
->SwitchSection(getObjFileLowering().getTextSection());
1358 void PPCLinuxAsmPrinter::EmitFunctionEntryLabel() {
1359 // linux/ppc32 - Normal entry label.
1360 if (!Subtarget
->isPPC64() &&
1361 (!isPositionIndependent() ||
1362 MF
->getFunction().getParent()->getPICLevel() == PICLevel::SmallPIC
))
1363 return AsmPrinter::EmitFunctionEntryLabel();
1365 if (!Subtarget
->isPPC64()) {
1366 const PPCFunctionInfo
*PPCFI
= MF
->getInfo
<PPCFunctionInfo
>();
1367 if (PPCFI
->usesPICBase() && !Subtarget
->isSecurePlt()) {
1368 MCSymbol
*RelocSymbol
= PPCFI
->getPICOffsetSymbol();
1369 MCSymbol
*PICBase
= MF
->getPICBaseSymbol();
1370 OutStreamer
->EmitLabel(RelocSymbol
);
1372 const MCExpr
*OffsExpr
=
1373 MCBinaryExpr::createSub(
1374 MCSymbolRefExpr::create(OutContext
.getOrCreateSymbol(Twine(".LTOC")),
1376 MCSymbolRefExpr::create(PICBase
, OutContext
),
1378 OutStreamer
->EmitValue(OffsExpr
, 4);
1379 OutStreamer
->EmitLabel(CurrentFnSym
);
1382 return AsmPrinter::EmitFunctionEntryLabel();
1385 // ELFv2 ABI - Normal entry label.
1386 if (Subtarget
->isELFv2ABI()) {
1387 // In the Large code model, we allow arbitrary displacements between
1388 // the text section and its associated TOC section. We place the
1389 // full 8-byte offset to the TOC in memory immediately preceding
1390 // the function global entry point.
1391 if (TM
.getCodeModel() == CodeModel::Large
1392 && !MF
->getRegInfo().use_empty(PPC::X2
)) {
1393 const PPCFunctionInfo
*PPCFI
= MF
->getInfo
<PPCFunctionInfo
>();
1395 MCSymbol
*TOCSymbol
= OutContext
.getOrCreateSymbol(StringRef(".TOC."));
1396 MCSymbol
*GlobalEPSymbol
= PPCFI
->getGlobalEPSymbol();
1397 const MCExpr
*TOCDeltaExpr
=
1398 MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCSymbol
, OutContext
),
1399 MCSymbolRefExpr::create(GlobalEPSymbol
,
1403 OutStreamer
->EmitLabel(PPCFI
->getTOCOffsetSymbol());
1404 OutStreamer
->EmitValue(TOCDeltaExpr
, 8);
1406 return AsmPrinter::EmitFunctionEntryLabel();
1409 // Emit an official procedure descriptor.
1410 MCSectionSubPair Current
= OutStreamer
->getCurrentSection();
1411 MCSectionELF
*Section
= OutStreamer
->getContext().getELFSection(
1412 ".opd", ELF::SHT_PROGBITS
, ELF::SHF_WRITE
| ELF::SHF_ALLOC
);
1413 OutStreamer
->SwitchSection(Section
);
1414 OutStreamer
->EmitLabel(CurrentFnSym
);
1415 OutStreamer
->EmitValueToAlignment(8);
1416 MCSymbol
*Symbol1
= CurrentFnSymForSize
;
1417 // Generates a R_PPC64_ADDR64 (from FK_DATA_8) relocation for the function
1419 OutStreamer
->EmitValue(MCSymbolRefExpr::create(Symbol1
, OutContext
),
1421 MCSymbol
*Symbol2
= OutContext
.getOrCreateSymbol(StringRef(".TOC."));
1422 // Generates a R_PPC64_TOC relocation for TOC base insertion.
1423 OutStreamer
->EmitValue(
1424 MCSymbolRefExpr::create(Symbol2
, MCSymbolRefExpr::VK_PPC_TOCBASE
, OutContext
),
1426 // Emit a null environment pointer.
1427 OutStreamer
->EmitIntValue(0, 8 /* size */);
1428 OutStreamer
->SwitchSection(Current
.first
, Current
.second
);
1431 bool PPCLinuxAsmPrinter::doFinalization(Module
&M
) {
1432 const DataLayout
&DL
= getDataLayout();
1434 bool isPPC64
= DL
.getPointerSizeInBits() == 64;
1436 PPCTargetStreamer
&TS
=
1437 static_cast<PPCTargetStreamer
&>(*OutStreamer
->getTargetStreamer());
1440 MCSectionELF
*Section
;
1443 Section
= OutStreamer
->getContext().getELFSection(
1444 ".toc", ELF::SHT_PROGBITS
, ELF::SHF_WRITE
| ELF::SHF_ALLOC
);
1446 Section
= OutStreamer
->getContext().getELFSection(
1447 ".got2", ELF::SHT_PROGBITS
, ELF::SHF_WRITE
| ELF::SHF_ALLOC
);
1448 OutStreamer
->SwitchSection(Section
);
1450 for (const auto &TOCMapPair
: TOC
) {
1451 const MCSymbol
*const TOCEntryTarget
= TOCMapPair
.first
;
1452 MCSymbol
*const TOCEntryLabel
= TOCMapPair
.second
;
1454 OutStreamer
->EmitLabel(TOCEntryLabel
);
1456 TS
.emitTCEntry(*TOCEntryTarget
);
1458 OutStreamer
->EmitValueToAlignment(4);
1459 OutStreamer
->EmitSymbolValue(TOCEntryTarget
, 4);
1464 return AsmPrinter::doFinalization(M
);
1467 /// EmitFunctionBodyStart - Emit a global entry point prefix for ELFv2.
1468 void PPCLinuxAsmPrinter::EmitFunctionBodyStart() {
1469 // In the ELFv2 ABI, in functions that use the TOC register, we need to
1470 // provide two entry points. The ABI guarantees that when calling the
1471 // local entry point, r2 is set up by the caller to contain the TOC base
1472 // for this function, and when calling the global entry point, r12 is set
1473 // up by the caller to hold the address of the global entry point. We
1474 // thus emit a prefix sequence along the following lines:
1478 // # global entry point
1479 // addis r2,r12,(.TOC.-.Lfunc_gepNN)@ha
1480 // addi r2,r2,(.TOC.-.Lfunc_gepNN)@l
1482 // .localentry func, .Lfunc_lepNN-.Lfunc_gepNN
1483 // # local entry point, followed by function body
1485 // For the Large code model, we create
1488 // .quad .TOC.-.Lfunc_gepNN # done by EmitFunctionEntryLabel
1491 // # global entry point
1492 // ld r2,.Lfunc_tocNN-.Lfunc_gepNN(r12)
1495 // .localentry func, .Lfunc_lepNN-.Lfunc_gepNN
1496 // # local entry point, followed by function body
1498 // This ensures we have r2 set up correctly while executing the function
1499 // body, no matter which entry point is called.
1500 if (Subtarget
->isELFv2ABI()
1501 // Only do all that if the function uses r2 in the first place.
1502 && !MF
->getRegInfo().use_empty(PPC::X2
)) {
1503 // Note: The logic here must be synchronized with the code in the
1504 // branch-selection pass which sets the offset of the first block in the
1505 // function. This matters because it affects the alignment.
1506 const PPCFunctionInfo
*PPCFI
= MF
->getInfo
<PPCFunctionInfo
>();
1508 MCSymbol
*GlobalEntryLabel
= PPCFI
->getGlobalEPSymbol();
1509 OutStreamer
->EmitLabel(GlobalEntryLabel
);
1510 const MCSymbolRefExpr
*GlobalEntryLabelExp
=
1511 MCSymbolRefExpr::create(GlobalEntryLabel
, OutContext
);
1513 if (TM
.getCodeModel() != CodeModel::Large
) {
1514 MCSymbol
*TOCSymbol
= OutContext
.getOrCreateSymbol(StringRef(".TOC."));
1515 const MCExpr
*TOCDeltaExpr
=
1516 MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCSymbol
, OutContext
),
1517 GlobalEntryLabelExp
, OutContext
);
1519 const MCExpr
*TOCDeltaHi
=
1520 PPCMCExpr::createHa(TOCDeltaExpr
, false, OutContext
);
1521 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::ADDIS
)
1524 .addExpr(TOCDeltaHi
));
1526 const MCExpr
*TOCDeltaLo
=
1527 PPCMCExpr::createLo(TOCDeltaExpr
, false, OutContext
);
1528 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::ADDI
)
1531 .addExpr(TOCDeltaLo
));
1533 MCSymbol
*TOCOffset
= PPCFI
->getTOCOffsetSymbol();
1534 const MCExpr
*TOCOffsetDeltaExpr
=
1535 MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCOffset
, OutContext
),
1536 GlobalEntryLabelExp
, OutContext
);
1538 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::LD
)
1540 .addExpr(TOCOffsetDeltaExpr
)
1542 EmitToStreamer(*OutStreamer
, MCInstBuilder(PPC::ADD8
)
1548 MCSymbol
*LocalEntryLabel
= PPCFI
->getLocalEPSymbol();
1549 OutStreamer
->EmitLabel(LocalEntryLabel
);
1550 const MCSymbolRefExpr
*LocalEntryLabelExp
=
1551 MCSymbolRefExpr::create(LocalEntryLabel
, OutContext
);
1552 const MCExpr
*LocalOffsetExp
=
1553 MCBinaryExpr::createSub(LocalEntryLabelExp
,
1554 GlobalEntryLabelExp
, OutContext
);
1556 PPCTargetStreamer
*TS
=
1557 static_cast<PPCTargetStreamer
*>(OutStreamer
->getTargetStreamer());
1560 TS
->emitLocalEntry(cast
<MCSymbolELF
>(CurrentFnSym
), LocalOffsetExp
);
1564 /// EmitFunctionBodyEnd - Print the traceback table before the .size
1567 void PPCLinuxAsmPrinter::EmitFunctionBodyEnd() {
1568 // Only the 64-bit target requires a traceback table. For now,
1569 // we only emit the word of zeroes that GDB requires to find
1570 // the end of the function, and zeroes for the eight-byte
1571 // mandatory fields.
1572 // FIXME: We should fill in the eight-byte mandatory fields as described in
1573 // the PPC64 ELF ABI (this is a low-priority item because GDB does not
1574 // currently make use of these fields).
1575 if (Subtarget
->isPPC64()) {
1576 OutStreamer
->EmitIntValue(0, 4/*size*/);
1577 OutStreamer
->EmitIntValue(0, 8/*size*/);
1581 void PPCDarwinAsmPrinter::EmitStartOfAsmFile(Module
&M
) {
1582 static const char *const CPUDirectives
[] = {
1603 // FIXME: why is power8 missing here?
1609 // Get the numerically largest directive.
1610 // FIXME: How should we merge darwin directives?
1611 unsigned Directive
= PPC::DIR_NONE
;
1612 for (const Function
&F
: M
) {
1613 const PPCSubtarget
&STI
= TM
.getSubtarget
<PPCSubtarget
>(F
);
1614 unsigned FDir
= STI
.getDarwinDirective();
1615 Directive
= Directive
> FDir
? FDir
: STI
.getDarwinDirective();
1616 if (STI
.hasMFOCRF() && Directive
< PPC::DIR_970
)
1617 Directive
= PPC::DIR_970
;
1618 if (STI
.hasAltivec() && Directive
< PPC::DIR_7400
)
1619 Directive
= PPC::DIR_7400
;
1620 if (STI
.isPPC64() && Directive
< PPC::DIR_64
)
1621 Directive
= PPC::DIR_64
;
1624 assert(Directive
<= PPC::DIR_64
&& "Directive out of range.");
1626 assert(Directive
< array_lengthof(CPUDirectives
) &&
1627 "CPUDirectives[] might not be up-to-date!");
1628 PPCTargetStreamer
&TStreamer
=
1629 *static_cast<PPCTargetStreamer
*>(OutStreamer
->getTargetStreamer());
1630 TStreamer
.emitMachine(CPUDirectives
[Directive
]);
1632 // Prime text sections so they are adjacent. This reduces the likelihood a
1633 // large data or debug section causes a branch to exceed 16M limit.
1634 const TargetLoweringObjectFileMachO
&TLOFMacho
=
1635 static_cast<const TargetLoweringObjectFileMachO
&>(getObjFileLowering());
1636 OutStreamer
->SwitchSection(TLOFMacho
.getTextCoalSection());
1637 if (TM
.getRelocationModel() == Reloc::PIC_
) {
1638 OutStreamer
->SwitchSection(
1639 OutContext
.getMachOSection("__TEXT", "__picsymbolstub1",
1640 MachO::S_SYMBOL_STUBS
|
1641 MachO::S_ATTR_PURE_INSTRUCTIONS
,
1642 32, SectionKind::getText()));
1643 } else if (TM
.getRelocationModel() == Reloc::DynamicNoPIC
) {
1644 OutStreamer
->SwitchSection(
1645 OutContext
.getMachOSection("__TEXT","__symbol_stub1",
1646 MachO::S_SYMBOL_STUBS
|
1647 MachO::S_ATTR_PURE_INSTRUCTIONS
,
1648 16, SectionKind::getText()));
1650 OutStreamer
->SwitchSection(getObjFileLowering().getTextSection());
1653 bool PPCDarwinAsmPrinter::doFinalization(Module
&M
) {
1654 bool isPPC64
= getDataLayout().getPointerSizeInBits() == 64;
1656 // Darwin/PPC always uses mach-o.
1657 const TargetLoweringObjectFileMachO
&TLOFMacho
=
1658 static_cast<const TargetLoweringObjectFileMachO
&>(getObjFileLowering());
1660 MachineModuleInfoMachO
&MMIMacho
=
1661 MMI
->getObjFileInfo
<MachineModuleInfoMachO
>();
1663 if (MAI
->doesSupportExceptionHandling()) {
1664 // Add the (possibly multiple) personalities to the set of global values.
1665 // Only referenced functions get into the Personalities list.
1666 for (const Function
*Personality
: MMI
->getPersonalities()) {
1669 getSymbolWithGlobalValueBase(Personality
, "$non_lazy_ptr");
1670 MachineModuleInfoImpl::StubValueTy
&StubSym
=
1671 MMIMacho
.getGVStubEntry(NLPSym
);
1673 MachineModuleInfoImpl::StubValueTy(getSymbol(Personality
), true);
1678 // Output stubs for dynamically-linked functions.
1679 MachineModuleInfoMachO::SymbolListTy Stubs
= MMIMacho
.GetGVStubList();
1681 // Output macho stubs for external and common global variables.
1682 if (!Stubs
.empty()) {
1683 // Switch with ".non_lazy_symbol_pointer" directive.
1684 OutStreamer
->SwitchSection(TLOFMacho
.getNonLazySymbolPointerSection());
1685 EmitAlignment(isPPC64
? Align(8) : Align(4));
1687 for (unsigned i
= 0, e
= Stubs
.size(); i
!= e
; ++i
) {
1689 OutStreamer
->EmitLabel(Stubs
[i
].first
);
1690 // .indirect_symbol _foo
1691 MachineModuleInfoImpl::StubValueTy
&MCSym
= Stubs
[i
].second
;
1692 OutStreamer
->EmitSymbolAttribute(MCSym
.getPointer(),
1693 MCSA_IndirectSymbol
);
1696 // External to current translation unit.
1697 OutStreamer
->EmitIntValue(0, isPPC64
? 8 : 4 /*size*/);
1699 // Internal to current translation unit.
1701 // When we place the LSDA into the TEXT section, the type info
1703 // need to be indirect and pc-rel. We accomplish this by using NLPs.
1704 // However, sometimes the types are local to the file. So we need to
1705 // fill in the value for the NLP in those cases.
1706 OutStreamer
->EmitValue(
1707 MCSymbolRefExpr::create(MCSym
.getPointer(), OutContext
),
1708 isPPC64
? 8 : 4 /*size*/);
1712 OutStreamer
->AddBlankLine();
1716 // Funny Darwin hack: This flag tells the linker that no global symbols
1717 // contain code that falls through to other global symbols (e.g. the obvious
1718 // implementation of multiple entry points). If this doesn't occur, the
1719 // linker can safely perform dead code stripping. Since LLVM never generates
1720 // code that does this, it is always safe to set.
1721 OutStreamer
->EmitAssemblerFlag(MCAF_SubsectionsViaSymbols
);
1723 return AsmPrinter::doFinalization(M
);
1726 void PPCAIXAsmPrinter::SetupMachineFunction(MachineFunction
&MF
) {
1727 // Get the function descriptor symbol.
1728 CurrentFnDescSym
= getSymbol(&MF
.getFunction());
1729 // Set the containing csect.
1730 MCSectionXCOFF
*FnDescSec
= OutStreamer
->getContext().getXCOFFSection(
1731 CurrentFnDescSym
->getName(), XCOFF::XMC_DS
, XCOFF::XTY_SD
,
1732 XCOFF::C_HIDEXT
, SectionKind::getData());
1733 cast
<MCSymbolXCOFF
>(CurrentFnDescSym
)->setContainingCsect(FnDescSec
);
1735 return AsmPrinter::SetupMachineFunction(MF
);
1738 void PPCAIXAsmPrinter::EmitGlobalVariable(const GlobalVariable
*GV
) {
1739 // Early error checking limiting what is supported.
1740 if (GV
->isThreadLocal())
1741 report_fatal_error("Thread local not yet supported on AIX.");
1743 if (GV
->hasSection())
1744 report_fatal_error("Custom section for Data not yet supported.");
1746 if (GV
->hasComdat())
1747 report_fatal_error("COMDAT not yet supported by AIX.");
1749 SectionKind GVKind
= getObjFileLowering().getKindForGlobal(GV
, TM
);
1750 if (!GVKind
.isCommon() && !GVKind
.isBSSLocal() && !GVKind
.isData())
1751 report_fatal_error("Encountered a global variable kind that is "
1752 "not supported yet.");
1754 // Create the containing csect and switch to it.
1755 MCSectionXCOFF
*CSect
= cast
<MCSectionXCOFF
>(
1756 getObjFileLowering().SectionForGlobal(GV
, GVKind
, TM
));
1757 OutStreamer
->SwitchSection(CSect
);
1759 // Create the symbol, set its storage class, and emit it.
1760 MCSymbolXCOFF
*GVSym
= cast
<MCSymbolXCOFF
>(getSymbol(GV
));
1761 GVSym
->setStorageClass(
1762 TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(GV
));
1763 GVSym
->setContainingCsect(CSect
);
1765 const DataLayout
&DL
= GV
->getParent()->getDataLayout();
1767 // Handle common symbols.
1768 if (GVKind
.isCommon() || GVKind
.isBSSLocal()) {
1770 GV
->getAlignment() ? GV
->getAlignment() : DL
.getPreferredAlignment(GV
);
1771 uint64_t Size
= DL
.getTypeAllocSize(GV
->getType()->getElementType());
1773 if (GVKind
.isBSSLocal())
1774 OutStreamer
->EmitXCOFFLocalCommonSymbol(GVSym
, Size
, Align
);
1776 OutStreamer
->EmitCommonSymbol(GVSym
, Size
, Align
);
1780 MCSymbol
*EmittedInitSym
= GVSym
;
1781 EmitLinkage(GV
, EmittedInitSym
);
1782 EmitAlignment(getGVAlignment(GV
, DL
), GV
);
1783 OutStreamer
->EmitLabel(EmittedInitSym
);
1784 EmitGlobalConstant(GV
->getParent()->getDataLayout(), GV
->getInitializer());
1787 void PPCAIXAsmPrinter::EmitFunctionDescriptor() {
1788 const DataLayout
&DL
= getDataLayout();
1789 const unsigned PointerSize
= DL
.getPointerSizeInBits() == 64 ? 8 : 4;
1791 MCSectionSubPair Current
= OutStreamer
->getCurrentSection();
1792 // Emit function descriptor.
1793 OutStreamer
->SwitchSection(
1794 cast
<MCSymbolXCOFF
>(CurrentFnDescSym
)->getContainingCsect());
1795 OutStreamer
->EmitLabel(CurrentFnDescSym
);
1796 // Emit function entry point address.
1797 OutStreamer
->EmitValue(MCSymbolRefExpr::create(CurrentFnSym
, OutContext
),
1799 // Emit TOC base address.
1800 MCSymbol
*TOCBaseSym
= OutContext
.getOrCreateSymbol(StringRef("TOC[TC0]"));
1801 OutStreamer
->EmitValue(MCSymbolRefExpr::create(TOCBaseSym
, OutContext
),
1803 // Emit a null environment pointer.
1804 OutStreamer
->EmitIntValue(0, PointerSize
);
1806 OutStreamer
->SwitchSection(Current
.first
, Current
.second
);
1809 void PPCAIXAsmPrinter::EmitEndOfAsmFile(Module
&M
) {
1810 // If there are no functions in this module, we will never need to reference
1816 MCSymbol
*TOCBaseSym
= OutContext
.getOrCreateSymbol(StringRef("TOC[TC0]"));
1817 MCSectionXCOFF
*TOCBaseSection
= OutStreamer
->getContext().getXCOFFSection(
1818 StringRef("TOC"), XCOFF::XMC_TC0
, XCOFF::XTY_SD
, XCOFF::C_HIDEXT
,
1819 SectionKind::getData());
1820 cast
<MCSymbolXCOFF
>(TOCBaseSym
)->setContainingCsect(TOCBaseSection
);
1821 // Switch to section to emit TOC base.
1822 OutStreamer
->SwitchSection(TOCBaseSection
);
1826 /// createPPCAsmPrinterPass - Returns a pass that prints the PPC assembly code
1827 /// for a MachineFunction to the given output stream, in a format that the
1828 /// Darwin assembler can deal with.
1831 createPPCAsmPrinterPass(TargetMachine
&tm
,
1832 std::unique_ptr
<MCStreamer
> &&Streamer
) {
1833 if (tm
.getTargetTriple().isMacOSX())
1834 return new PPCDarwinAsmPrinter(tm
, std::move(Streamer
));
1835 if (tm
.getTargetTriple().isOSAIX())
1836 return new PPCAIXAsmPrinter(tm
, std::move(Streamer
));
1838 return new PPCLinuxAsmPrinter(tm
, std::move(Streamer
));
1841 // Force static initialization.
1842 extern "C" void LLVMInitializePowerPCAsmPrinter() {
1843 TargetRegistry::RegisterAsmPrinter(getThePPC32Target(),
1844 createPPCAsmPrinterPass
);
1845 TargetRegistry::RegisterAsmPrinter(getThePPC64Target(),
1846 createPPCAsmPrinterPass
);
1847 TargetRegistry::RegisterAsmPrinter(getThePPC64LETarget(),
1848 createPPCAsmPrinterPass
);