PPCAsmPrinter.cpp 91 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388
  1. //===-- PPCAsmPrinter.cpp - Print machine instrs to PowerPC assembly ------===//
  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 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'.
  12. //
  13. // Documentation at http://developer.apple.com/documentation/DeveloperTools/
  14. // Reference/Assembler/ASMIntroduction/chapter_1_section_1.html
  15. //
  16. //===----------------------------------------------------------------------===//
  17. #include "MCTargetDesc/PPCInstPrinter.h"
  18. #include "MCTargetDesc/PPCMCExpr.h"
  19. #include "MCTargetDesc/PPCMCTargetDesc.h"
  20. #include "MCTargetDesc/PPCPredicates.h"
  21. #include "PPC.h"
  22. #include "PPCInstrInfo.h"
  23. #include "PPCMachineFunctionInfo.h"
  24. #include "PPCSubtarget.h"
  25. #include "PPCTargetMachine.h"
  26. #include "PPCTargetStreamer.h"
  27. #include "TargetInfo/PowerPCTargetInfo.h"
  28. #include "llvm/ADT/MapVector.h"
  29. #include "llvm/ADT/SmallPtrSet.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/CodeGen/AsmPrinter.h"
  35. #include "llvm/CodeGen/MachineBasicBlock.h"
  36. #include "llvm/CodeGen/MachineFunction.h"
  37. #include "llvm/CodeGen/MachineInstr.h"
  38. #include "llvm/CodeGen/MachineModuleInfoImpls.h"
  39. #include "llvm/CodeGen/MachineOperand.h"
  40. #include "llvm/CodeGen/MachineRegisterInfo.h"
  41. #include "llvm/CodeGen/StackMaps.h"
  42. #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
  43. #include "llvm/IR/DataLayout.h"
  44. #include "llvm/IR/GlobalValue.h"
  45. #include "llvm/IR/GlobalVariable.h"
  46. #include "llvm/IR/Module.h"
  47. #include "llvm/MC/MCAsmInfo.h"
  48. #include "llvm/MC/MCContext.h"
  49. #include "llvm/MC/MCDirectives.h"
  50. #include "llvm/MC/MCExpr.h"
  51. #include "llvm/MC/MCInst.h"
  52. #include "llvm/MC/MCInstBuilder.h"
  53. #include "llvm/MC/MCSectionELF.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/Process.h"
  65. #include "llvm/Support/TargetRegistry.h"
  66. #include "llvm/Support/raw_ostream.h"
  67. #include "llvm/Target/TargetMachine.h"
  68. #include "llvm/Transforms/Utils/ModuleUtils.h"
  69. #include <algorithm>
  70. #include <cassert>
  71. #include <cstdint>
  72. #include <memory>
  73. #include <new>
  74. using namespace llvm;
  75. using namespace llvm::XCOFF;
  76. #define DEBUG_TYPE "asmprinter"
  77. namespace {
  78. class PPCAsmPrinter : public AsmPrinter {
  79. protected:
  80. MapVector<const MCSymbol *, MCSymbol *> TOC;
  81. const PPCSubtarget *Subtarget = nullptr;
  82. StackMaps SM;
  83. public:
  84. explicit PPCAsmPrinter(TargetMachine &TM,
  85. std::unique_ptr<MCStreamer> Streamer)
  86. : AsmPrinter(TM, std::move(Streamer)), SM(*this) {}
  87. StringRef getPassName() const override { return "PowerPC Assembly Printer"; }
  88. MCSymbol *lookUpOrCreateTOCEntry(const MCSymbol *Sym);
  89. bool doInitialization(Module &M) override {
  90. if (!TOC.empty())
  91. TOC.clear();
  92. return AsmPrinter::doInitialization(M);
  93. }
  94. void emitInstruction(const MachineInstr *MI) override;
  95. /// This function is for PrintAsmOperand and PrintAsmMemoryOperand,
  96. /// invoked by EmitMSInlineAsmStr and EmitGCCInlineAsmStr only.
  97. /// The \p MI would be INLINEASM ONLY.
  98. void printOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O);
  99. void PrintSymbolOperand(const MachineOperand &MO, raw_ostream &O) override;
  100. bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
  101. const char *ExtraCode, raw_ostream &O) override;
  102. bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
  103. const char *ExtraCode, raw_ostream &O) override;
  104. void emitEndOfAsmFile(Module &M) override;
  105. void LowerSTACKMAP(StackMaps &SM, const MachineInstr &MI);
  106. void LowerPATCHPOINT(StackMaps &SM, const MachineInstr &MI);
  107. void EmitTlsCall(const MachineInstr *MI, MCSymbolRefExpr::VariantKind VK);
  108. bool runOnMachineFunction(MachineFunction &MF) override {
  109. Subtarget = &MF.getSubtarget<PPCSubtarget>();
  110. bool Changed = AsmPrinter::runOnMachineFunction(MF);
  111. emitXRayTable();
  112. return Changed;
  113. }
  114. };
  115. /// PPCLinuxAsmPrinter - PowerPC assembly printer, customized for Linux
  116. class PPCLinuxAsmPrinter : public PPCAsmPrinter {
  117. public:
  118. explicit PPCLinuxAsmPrinter(TargetMachine &TM,
  119. std::unique_ptr<MCStreamer> Streamer)
  120. : PPCAsmPrinter(TM, std::move(Streamer)) {}
  121. StringRef getPassName() const override {
  122. return "Linux PPC Assembly Printer";
  123. }
  124. void emitStartOfAsmFile(Module &M) override;
  125. void emitEndOfAsmFile(Module &) override;
  126. void emitFunctionEntryLabel() override;
  127. void emitFunctionBodyStart() override;
  128. void emitFunctionBodyEnd() override;
  129. void emitInstruction(const MachineInstr *MI) override;
  130. };
  131. class PPCAIXAsmPrinter : public PPCAsmPrinter {
  132. private:
  133. /// Symbols lowered from ExternalSymbolSDNodes, we will need to emit extern
  134. /// linkage for them in AIX.
  135. SmallPtrSet<MCSymbol *, 8> ExtSymSDNodeSymbols;
  136. /// A format indicator and unique trailing identifier to form part of the
  137. /// sinit/sterm function names.
  138. std::string FormatIndicatorAndUniqueModId;
  139. static void ValidateGV(const GlobalVariable *GV);
  140. // Record a list of GlobalAlias associated with a GlobalObject.
  141. // This is used for AIX's extra-label-at-definition aliasing strategy.
  142. DenseMap<const GlobalObject *, SmallVector<const GlobalAlias *, 1>>
  143. GOAliasMap;
  144. void emitTracebackTable();
  145. public:
  146. PPCAIXAsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer)
  147. : PPCAsmPrinter(TM, std::move(Streamer)) {
  148. if (MAI->isLittleEndian())
  149. report_fatal_error(
  150. "cannot create AIX PPC Assembly Printer for a little-endian target");
  151. }
  152. StringRef getPassName() const override { return "AIX PPC Assembly Printer"; }
  153. bool doInitialization(Module &M) override;
  154. void emitXXStructorList(const DataLayout &DL, const Constant *List,
  155. bool IsCtor) override;
  156. void SetupMachineFunction(MachineFunction &MF) override;
  157. void emitGlobalVariable(const GlobalVariable *GV) override;
  158. void emitFunctionDescriptor() override;
  159. void emitFunctionEntryLabel() override;
  160. void emitFunctionBodyEnd() override;
  161. void emitEndOfAsmFile(Module &) override;
  162. void emitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const override;
  163. void emitInstruction(const MachineInstr *MI) override;
  164. bool doFinalization(Module &M) override;
  165. void emitTTypeReference(const GlobalValue *GV, unsigned Encoding) override;
  166. };
  167. } // end anonymous namespace
  168. void PPCAsmPrinter::PrintSymbolOperand(const MachineOperand &MO,
  169. raw_ostream &O) {
  170. // Computing the address of a global symbol, not calling it.
  171. const GlobalValue *GV = MO.getGlobal();
  172. getSymbol(GV)->print(O, MAI);
  173. printOffset(MO.getOffset(), O);
  174. }
  175. void PPCAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,
  176. raw_ostream &O) {
  177. const DataLayout &DL = getDataLayout();
  178. const MachineOperand &MO = MI->getOperand(OpNo);
  179. switch (MO.getType()) {
  180. case MachineOperand::MO_Register: {
  181. // The MI is INLINEASM ONLY and UseVSXReg is always false.
  182. const char *RegName = PPCInstPrinter::getRegisterName(MO.getReg());
  183. // Linux assembler (Others?) does not take register mnemonics.
  184. // FIXME - What about special registers used in mfspr/mtspr?
  185. O << PPCRegisterInfo::stripRegisterPrefix(RegName);
  186. return;
  187. }
  188. case MachineOperand::MO_Immediate:
  189. O << MO.getImm();
  190. return;
  191. case MachineOperand::MO_MachineBasicBlock:
  192. MO.getMBB()->getSymbol()->print(O, MAI);
  193. return;
  194. case MachineOperand::MO_ConstantPoolIndex:
  195. O << DL.getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
  196. << MO.getIndex();
  197. return;
  198. case MachineOperand::MO_BlockAddress:
  199. GetBlockAddressSymbol(MO.getBlockAddress())->print(O, MAI);
  200. return;
  201. case MachineOperand::MO_GlobalAddress: {
  202. PrintSymbolOperand(MO, O);
  203. return;
  204. }
  205. default:
  206. O << "<unknown operand type: " << (unsigned)MO.getType() << ">";
  207. return;
  208. }
  209. }
  210. /// PrintAsmOperand - Print out an operand for an inline asm expression.
  211. ///
  212. bool PPCAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
  213. const char *ExtraCode, raw_ostream &O) {
  214. // Does this asm operand have a single letter operand modifier?
  215. if (ExtraCode && ExtraCode[0]) {
  216. if (ExtraCode[1] != 0) return true; // Unknown modifier.
  217. switch (ExtraCode[0]) {
  218. default:
  219. // See if this is a generic print operand
  220. return AsmPrinter::PrintAsmOperand(MI, OpNo, ExtraCode, O);
  221. case 'L': // Write second word of DImode reference.
  222. // Verify that this operand has two consecutive registers.
  223. if (!MI->getOperand(OpNo).isReg() ||
  224. OpNo+1 == MI->getNumOperands() ||
  225. !MI->getOperand(OpNo+1).isReg())
  226. return true;
  227. ++OpNo; // Return the high-part.
  228. break;
  229. case 'I':
  230. // Write 'i' if an integer constant, otherwise nothing. Used to print
  231. // addi vs add, etc.
  232. if (MI->getOperand(OpNo).isImm())
  233. O << "i";
  234. return false;
  235. case 'x':
  236. if(!MI->getOperand(OpNo).isReg())
  237. return true;
  238. // This operand uses VSX numbering.
  239. // If the operand is a VMX register, convert it to a VSX register.
  240. Register Reg = MI->getOperand(OpNo).getReg();
  241. if (PPCInstrInfo::isVRRegister(Reg))
  242. Reg = PPC::VSX32 + (Reg - PPC::V0);
  243. else if (PPCInstrInfo::isVFRegister(Reg))
  244. Reg = PPC::VSX32 + (Reg - PPC::VF0);
  245. const char *RegName;
  246. RegName = PPCInstPrinter::getRegisterName(Reg);
  247. RegName = PPCRegisterInfo::stripRegisterPrefix(RegName);
  248. O << RegName;
  249. return false;
  250. }
  251. }
  252. printOperand(MI, OpNo, O);
  253. return false;
  254. }
  255. // At the moment, all inline asm memory operands are a single register.
  256. // In any case, the output of this routine should always be just one
  257. // assembler operand.
  258. bool PPCAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
  259. const char *ExtraCode,
  260. raw_ostream &O) {
  261. if (ExtraCode && ExtraCode[0]) {
  262. if (ExtraCode[1] != 0) return true; // Unknown modifier.
  263. switch (ExtraCode[0]) {
  264. default: return true; // Unknown modifier.
  265. case 'L': // A memory reference to the upper word of a double word op.
  266. O << getDataLayout().getPointerSize() << "(";
  267. printOperand(MI, OpNo, O);
  268. O << ")";
  269. return false;
  270. case 'y': // A memory reference for an X-form instruction
  271. O << "0, ";
  272. printOperand(MI, OpNo, O);
  273. return false;
  274. case 'I':
  275. // Write 'i' if an integer constant, otherwise nothing. Used to print
  276. // addi vs add, etc.
  277. if (MI->getOperand(OpNo).isImm())
  278. O << "i";
  279. return false;
  280. case 'U': // Print 'u' for update form.
  281. case 'X': // Print 'x' for indexed form.
  282. // FIXME: Currently for PowerPC memory operands are always loaded
  283. // into a register, so we never get an update or indexed form.
  284. // This is bad even for offset forms, since even if we know we
  285. // have a value in -16(r1), we will generate a load into r<n>
  286. // and then load from 0(r<n>). Until that issue is fixed,
  287. // tolerate 'U' and 'X' but don't output anything.
  288. assert(MI->getOperand(OpNo).isReg());
  289. return false;
  290. }
  291. }
  292. assert(MI->getOperand(OpNo).isReg());
  293. O << "0(";
  294. printOperand(MI, OpNo, O);
  295. O << ")";
  296. return false;
  297. }
  298. /// lookUpOrCreateTOCEntry -- Given a symbol, look up whether a TOC entry
  299. /// exists for it. If not, create one. Then return a symbol that references
  300. /// the TOC entry.
  301. MCSymbol *PPCAsmPrinter::lookUpOrCreateTOCEntry(const MCSymbol *Sym) {
  302. MCSymbol *&TOCEntry = TOC[Sym];
  303. if (!TOCEntry)
  304. TOCEntry = createTempSymbol("C");
  305. return TOCEntry;
  306. }
  307. void PPCAsmPrinter::emitEndOfAsmFile(Module &M) {
  308. emitStackMaps(SM);
  309. }
  310. void PPCAsmPrinter::LowerSTACKMAP(StackMaps &SM, const MachineInstr &MI) {
  311. unsigned NumNOPBytes = MI.getOperand(1).getImm();
  312. auto &Ctx = OutStreamer->getContext();
  313. MCSymbol *MILabel = Ctx.createTempSymbol();
  314. OutStreamer->emitLabel(MILabel);
  315. SM.recordStackMap(*MILabel, MI);
  316. assert(NumNOPBytes % 4 == 0 && "Invalid number of NOP bytes requested!");
  317. // Scan ahead to trim the shadow.
  318. const MachineBasicBlock &MBB = *MI.getParent();
  319. MachineBasicBlock::const_iterator MII(MI);
  320. ++MII;
  321. while (NumNOPBytes > 0) {
  322. if (MII == MBB.end() || MII->isCall() ||
  323. MII->getOpcode() == PPC::DBG_VALUE ||
  324. MII->getOpcode() == TargetOpcode::PATCHPOINT ||
  325. MII->getOpcode() == TargetOpcode::STACKMAP)
  326. break;
  327. ++MII;
  328. NumNOPBytes -= 4;
  329. }
  330. // Emit nops.
  331. for (unsigned i = 0; i < NumNOPBytes; i += 4)
  332. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP));
  333. }
  334. // Lower a patchpoint of the form:
  335. // [<def>], <id>, <numBytes>, <target>, <numArgs>
  336. void PPCAsmPrinter::LowerPATCHPOINT(StackMaps &SM, const MachineInstr &MI) {
  337. auto &Ctx = OutStreamer->getContext();
  338. MCSymbol *MILabel = Ctx.createTempSymbol();
  339. OutStreamer->emitLabel(MILabel);
  340. SM.recordPatchPoint(*MILabel, MI);
  341. PatchPointOpers Opers(&MI);
  342. unsigned EncodedBytes = 0;
  343. const MachineOperand &CalleeMO = Opers.getCallTarget();
  344. if (CalleeMO.isImm()) {
  345. int64_t CallTarget = CalleeMO.getImm();
  346. if (CallTarget) {
  347. assert((CallTarget & 0xFFFFFFFFFFFF) == CallTarget &&
  348. "High 16 bits of call target should be zero.");
  349. Register ScratchReg = MI.getOperand(Opers.getNextScratchIdx()).getReg();
  350. EncodedBytes = 0;
  351. // Materialize the jump address:
  352. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LI8)
  353. .addReg(ScratchReg)
  354. .addImm((CallTarget >> 32) & 0xFFFF));
  355. ++EncodedBytes;
  356. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::RLDIC)
  357. .addReg(ScratchReg)
  358. .addReg(ScratchReg)
  359. .addImm(32).addImm(16));
  360. ++EncodedBytes;
  361. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ORIS8)
  362. .addReg(ScratchReg)
  363. .addReg(ScratchReg)
  364. .addImm((CallTarget >> 16) & 0xFFFF));
  365. ++EncodedBytes;
  366. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ORI8)
  367. .addReg(ScratchReg)
  368. .addReg(ScratchReg)
  369. .addImm(CallTarget & 0xFFFF));
  370. // Save the current TOC pointer before the remote call.
  371. int TOCSaveOffset = Subtarget->getFrameLowering()->getTOCSaveOffset();
  372. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::STD)
  373. .addReg(PPC::X2)
  374. .addImm(TOCSaveOffset)
  375. .addReg(PPC::X1));
  376. ++EncodedBytes;
  377. // If we're on ELFv1, then we need to load the actual function pointer
  378. // from the function descriptor.
  379. if (!Subtarget->isELFv2ABI()) {
  380. // Load the new TOC pointer and the function address, but not r11
  381. // (needing this is rare, and loading it here would prevent passing it
  382. // via a 'nest' parameter.
  383. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD)
  384. .addReg(PPC::X2)
  385. .addImm(8)
  386. .addReg(ScratchReg));
  387. ++EncodedBytes;
  388. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD)
  389. .addReg(ScratchReg)
  390. .addImm(0)
  391. .addReg(ScratchReg));
  392. ++EncodedBytes;
  393. }
  394. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTCTR8)
  395. .addReg(ScratchReg));
  396. ++EncodedBytes;
  397. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BCTRL8));
  398. ++EncodedBytes;
  399. // Restore the TOC pointer after the call.
  400. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD)
  401. .addReg(PPC::X2)
  402. .addImm(TOCSaveOffset)
  403. .addReg(PPC::X1));
  404. ++EncodedBytes;
  405. }
  406. } else if (CalleeMO.isGlobal()) {
  407. const GlobalValue *GValue = CalleeMO.getGlobal();
  408. MCSymbol *MOSymbol = getSymbol(GValue);
  409. const MCExpr *SymVar = MCSymbolRefExpr::create(MOSymbol, OutContext);
  410. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BL8_NOP)
  411. .addExpr(SymVar));
  412. EncodedBytes += 2;
  413. }
  414. // Each instruction is 4 bytes.
  415. EncodedBytes *= 4;
  416. // Emit padding.
  417. unsigned NumBytes = Opers.getNumPatchBytes();
  418. assert(NumBytes >= EncodedBytes &&
  419. "Patchpoint can't request size less than the length of a call.");
  420. assert((NumBytes - EncodedBytes) % 4 == 0 &&
  421. "Invalid number of NOP bytes requested!");
  422. for (unsigned i = EncodedBytes; i < NumBytes; i += 4)
  423. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP));
  424. }
  425. /// EmitTlsCall -- Given a GETtls[ld]ADDR[32] instruction, print a
  426. /// call to __tls_get_addr to the current output stream.
  427. void PPCAsmPrinter::EmitTlsCall(const MachineInstr *MI,
  428. MCSymbolRefExpr::VariantKind VK) {
  429. StringRef Name = "__tls_get_addr";
  430. MCSymbol *TlsGetAddr = OutContext.getOrCreateSymbol(Name);
  431. MCSymbolRefExpr::VariantKind Kind = MCSymbolRefExpr::VK_None;
  432. unsigned Opcode = PPC::BL8_NOP_TLS;
  433. assert(MI->getNumOperands() >= 3 && "Expecting at least 3 operands from MI");
  434. if (MI->getOperand(2).getTargetFlags() == PPCII::MO_GOT_TLSGD_PCREL_FLAG ||
  435. MI->getOperand(2).getTargetFlags() == PPCII::MO_GOT_TLSLD_PCREL_FLAG) {
  436. Kind = MCSymbolRefExpr::VK_PPC_NOTOC;
  437. Opcode = PPC::BL8_NOTOC_TLS;
  438. }
  439. const Module *M = MF->getFunction().getParent();
  440. assert(MI->getOperand(0).isReg() &&
  441. ((Subtarget->isPPC64() && MI->getOperand(0).getReg() == PPC::X3) ||
  442. (!Subtarget->isPPC64() && MI->getOperand(0).getReg() == PPC::R3)) &&
  443. "GETtls[ld]ADDR[32] must define GPR3");
  444. assert(MI->getOperand(1).isReg() &&
  445. ((Subtarget->isPPC64() && MI->getOperand(1).getReg() == PPC::X3) ||
  446. (!Subtarget->isPPC64() && MI->getOperand(1).getReg() == PPC::R3)) &&
  447. "GETtls[ld]ADDR[32] must read GPR3");
  448. if (Subtarget->is32BitELFABI() && isPositionIndependent())
  449. Kind = MCSymbolRefExpr::VK_PLT;
  450. const MCExpr *TlsRef =
  451. MCSymbolRefExpr::create(TlsGetAddr, Kind, OutContext);
  452. // Add 32768 offset to the symbol so we follow up the latest GOT/PLT ABI.
  453. if (Kind == MCSymbolRefExpr::VK_PLT && Subtarget->isSecurePlt() &&
  454. M->getPICLevel() == PICLevel::BigPIC)
  455. TlsRef = MCBinaryExpr::createAdd(
  456. TlsRef, MCConstantExpr::create(32768, OutContext), OutContext);
  457. const MachineOperand &MO = MI->getOperand(2);
  458. const GlobalValue *GValue = MO.getGlobal();
  459. MCSymbol *MOSymbol = getSymbol(GValue);
  460. const MCExpr *SymVar = MCSymbolRefExpr::create(MOSymbol, VK, OutContext);
  461. EmitToStreamer(*OutStreamer,
  462. MCInstBuilder(Subtarget->isPPC64() ? Opcode
  463. : (unsigned)PPC::BL_TLS)
  464. .addExpr(TlsRef)
  465. .addExpr(SymVar));
  466. }
  467. /// Map a machine operand for a TOC pseudo-machine instruction to its
  468. /// corresponding MCSymbol.
  469. static MCSymbol *getMCSymbolForTOCPseudoMO(const MachineOperand &MO,
  470. AsmPrinter &AP) {
  471. switch (MO.getType()) {
  472. case MachineOperand::MO_GlobalAddress:
  473. return AP.getSymbol(MO.getGlobal());
  474. case MachineOperand::MO_ConstantPoolIndex:
  475. return AP.GetCPISymbol(MO.getIndex());
  476. case MachineOperand::MO_JumpTableIndex:
  477. return AP.GetJTISymbol(MO.getIndex());
  478. case MachineOperand::MO_BlockAddress:
  479. return AP.GetBlockAddressSymbol(MO.getBlockAddress());
  480. default:
  481. llvm_unreachable("Unexpected operand type to get symbol.");
  482. }
  483. }
  484. /// EmitInstruction -- Print out a single PowerPC MI in Darwin syntax to
  485. /// the current output stream.
  486. ///
  487. void PPCAsmPrinter::emitInstruction(const MachineInstr *MI) {
  488. MCInst TmpInst;
  489. const bool IsPPC64 = Subtarget->isPPC64();
  490. const bool IsAIX = Subtarget->isAIXABI();
  491. const Module *M = MF->getFunction().getParent();
  492. PICLevel::Level PL = M->getPICLevel();
  493. #ifndef NDEBUG
  494. // Validate that SPE and FPU are mutually exclusive in codegen
  495. if (!MI->isInlineAsm()) {
  496. for (const MachineOperand &MO: MI->operands()) {
  497. if (MO.isReg()) {
  498. Register Reg = MO.getReg();
  499. if (Subtarget->hasSPE()) {
  500. if (PPC::F4RCRegClass.contains(Reg) ||
  501. PPC::F8RCRegClass.contains(Reg) ||
  502. PPC::VFRCRegClass.contains(Reg) ||
  503. PPC::VRRCRegClass.contains(Reg) ||
  504. PPC::VSFRCRegClass.contains(Reg) ||
  505. PPC::VSSRCRegClass.contains(Reg)
  506. )
  507. llvm_unreachable("SPE targets cannot have FPRegs!");
  508. } else {
  509. if (PPC::SPERCRegClass.contains(Reg))
  510. llvm_unreachable("SPE register found in FPU-targeted code!");
  511. }
  512. }
  513. }
  514. }
  515. #endif
  516. auto getTOCRelocAdjustedExprForXCOFF = [this](const MCExpr *Expr,
  517. ptrdiff_t OriginalOffset) {
  518. // Apply an offset to the TOC-based expression such that the adjusted
  519. // notional offset from the TOC base (to be encoded into the instruction's D
  520. // or DS field) is the signed 16-bit truncation of the original notional
  521. // offset from the TOC base.
  522. // This is consistent with the treatment used both by XL C/C++ and
  523. // by AIX ld -r.
  524. ptrdiff_t Adjustment =
  525. OriginalOffset - llvm::SignExtend32<16>(OriginalOffset);
  526. return MCBinaryExpr::createAdd(
  527. Expr, MCConstantExpr::create(-Adjustment, OutContext), OutContext);
  528. };
  529. auto getTOCEntryLoadingExprForXCOFF =
  530. [IsPPC64, getTOCRelocAdjustedExprForXCOFF,
  531. this](const MCSymbol *MOSymbol, const MCExpr *Expr) -> const MCExpr * {
  532. const unsigned EntryByteSize = IsPPC64 ? 8 : 4;
  533. const auto TOCEntryIter = TOC.find(MOSymbol);
  534. assert(TOCEntryIter != TOC.end() &&
  535. "Could not find the TOC entry for this symbol.");
  536. const ptrdiff_t EntryDistanceFromTOCBase =
  537. (TOCEntryIter - TOC.begin()) * EntryByteSize;
  538. constexpr int16_t PositiveTOCRange = INT16_MAX;
  539. if (EntryDistanceFromTOCBase > PositiveTOCRange)
  540. return getTOCRelocAdjustedExprForXCOFF(Expr, EntryDistanceFromTOCBase);
  541. return Expr;
  542. };
  543. // Lower multi-instruction pseudo operations.
  544. switch (MI->getOpcode()) {
  545. default: break;
  546. case TargetOpcode::DBG_VALUE:
  547. llvm_unreachable("Should be handled target independently");
  548. case TargetOpcode::STACKMAP:
  549. return LowerSTACKMAP(SM, *MI);
  550. case TargetOpcode::PATCHPOINT:
  551. return LowerPATCHPOINT(SM, *MI);
  552. case PPC::MoveGOTtoLR: {
  553. // Transform %lr = MoveGOTtoLR
  554. // Into this: bl _GLOBAL_OFFSET_TABLE_@local-4
  555. // _GLOBAL_OFFSET_TABLE_@local-4 (instruction preceding
  556. // _GLOBAL_OFFSET_TABLE_) has exactly one instruction:
  557. // blrl
  558. // This will return the pointer to _GLOBAL_OFFSET_TABLE_@local
  559. MCSymbol *GOTSymbol =
  560. OutContext.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_"));
  561. const MCExpr *OffsExpr =
  562. MCBinaryExpr::createSub(MCSymbolRefExpr::create(GOTSymbol,
  563. MCSymbolRefExpr::VK_PPC_LOCAL,
  564. OutContext),
  565. MCConstantExpr::create(4, OutContext),
  566. OutContext);
  567. // Emit the 'bl'.
  568. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BL).addExpr(OffsExpr));
  569. return;
  570. }
  571. case PPC::MovePCtoLR:
  572. case PPC::MovePCtoLR8: {
  573. // Transform %lr = MovePCtoLR
  574. // Into this, where the label is the PIC base:
  575. // bl L1$pb
  576. // L1$pb:
  577. MCSymbol *PICBase = MF->getPICBaseSymbol();
  578. // Emit the 'bl'.
  579. EmitToStreamer(*OutStreamer,
  580. MCInstBuilder(PPC::BL)
  581. // FIXME: We would like an efficient form for this, so we
  582. // don't have to do a lot of extra uniquing.
  583. .addExpr(MCSymbolRefExpr::create(PICBase, OutContext)));
  584. // Emit the label.
  585. OutStreamer->emitLabel(PICBase);
  586. return;
  587. }
  588. case PPC::UpdateGBR: {
  589. // Transform %rd = UpdateGBR(%rt, %ri)
  590. // Into: lwz %rt, .L0$poff - .L0$pb(%ri)
  591. // add %rd, %rt, %ri
  592. // or into (if secure plt mode is on):
  593. // addis r30, r30, {.LTOC,_GLOBAL_OFFSET_TABLE} - .L0$pb@ha
  594. // addi r30, r30, {.LTOC,_GLOBAL_OFFSET_TABLE} - .L0$pb@l
  595. // Get the offset from the GOT Base Register to the GOT
  596. LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
  597. if (Subtarget->isSecurePlt() && isPositionIndependent() ) {
  598. unsigned PICR = TmpInst.getOperand(0).getReg();
  599. MCSymbol *BaseSymbol = OutContext.getOrCreateSymbol(
  600. M->getPICLevel() == PICLevel::SmallPIC ? "_GLOBAL_OFFSET_TABLE_"
  601. : ".LTOC");
  602. const MCExpr *PB =
  603. MCSymbolRefExpr::create(MF->getPICBaseSymbol(), OutContext);
  604. const MCExpr *DeltaExpr = MCBinaryExpr::createSub(
  605. MCSymbolRefExpr::create(BaseSymbol, OutContext), PB, OutContext);
  606. const MCExpr *DeltaHi = PPCMCExpr::createHa(DeltaExpr, OutContext);
  607. EmitToStreamer(
  608. *OutStreamer,
  609. MCInstBuilder(PPC::ADDIS).addReg(PICR).addReg(PICR).addExpr(DeltaHi));
  610. const MCExpr *DeltaLo = PPCMCExpr::createLo(DeltaExpr, OutContext);
  611. EmitToStreamer(
  612. *OutStreamer,
  613. MCInstBuilder(PPC::ADDI).addReg(PICR).addReg(PICR).addExpr(DeltaLo));
  614. return;
  615. } else {
  616. MCSymbol *PICOffset =
  617. MF->getInfo<PPCFunctionInfo>()->getPICOffsetSymbol(*MF);
  618. TmpInst.setOpcode(PPC::LWZ);
  619. const MCExpr *Exp =
  620. MCSymbolRefExpr::create(PICOffset, MCSymbolRefExpr::VK_None, OutContext);
  621. const MCExpr *PB =
  622. MCSymbolRefExpr::create(MF->getPICBaseSymbol(),
  623. MCSymbolRefExpr::VK_None,
  624. OutContext);
  625. const MCOperand TR = TmpInst.getOperand(1);
  626. const MCOperand PICR = TmpInst.getOperand(0);
  627. // Step 1: lwz %rt, .L$poff - .L$pb(%ri)
  628. TmpInst.getOperand(1) =
  629. MCOperand::createExpr(MCBinaryExpr::createSub(Exp, PB, OutContext));
  630. TmpInst.getOperand(0) = TR;
  631. TmpInst.getOperand(2) = PICR;
  632. EmitToStreamer(*OutStreamer, TmpInst);
  633. TmpInst.setOpcode(PPC::ADD4);
  634. TmpInst.getOperand(0) = PICR;
  635. TmpInst.getOperand(1) = TR;
  636. TmpInst.getOperand(2) = PICR;
  637. EmitToStreamer(*OutStreamer, TmpInst);
  638. return;
  639. }
  640. }
  641. case PPC::LWZtoc: {
  642. // Transform %rN = LWZtoc @op1, %r2
  643. LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
  644. // Change the opcode to LWZ.
  645. TmpInst.setOpcode(PPC::LWZ);
  646. const MachineOperand &MO = MI->getOperand(1);
  647. assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()) &&
  648. "Invalid operand for LWZtoc.");
  649. // Map the operand to its corresponding MCSymbol.
  650. const MCSymbol *const MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this);
  651. // Create a reference to the GOT entry for the symbol. The GOT entry will be
  652. // synthesized later.
  653. if (PL == PICLevel::SmallPIC && !IsAIX) {
  654. const MCExpr *Exp =
  655. MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_GOT,
  656. OutContext);
  657. TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
  658. EmitToStreamer(*OutStreamer, TmpInst);
  659. return;
  660. }
  661. // Otherwise, use the TOC. 'TOCEntry' is a label used to reference the
  662. // storage allocated in the TOC which contains the address of
  663. // 'MOSymbol'. Said TOC entry will be synthesized later.
  664. MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(MOSymbol);
  665. const MCExpr *Exp =
  666. MCSymbolRefExpr::create(TOCEntry, MCSymbolRefExpr::VK_None, OutContext);
  667. // AIX uses the label directly as the lwz displacement operand for
  668. // references into the toc section. The displacement value will be generated
  669. // relative to the toc-base.
  670. if (IsAIX) {
  671. assert(
  672. TM.getCodeModel() == CodeModel::Small &&
  673. "This pseudo should only be selected for 32-bit small code model.");
  674. Exp = getTOCEntryLoadingExprForXCOFF(MOSymbol, Exp);
  675. TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
  676. EmitToStreamer(*OutStreamer, TmpInst);
  677. return;
  678. }
  679. // Create an explicit subtract expression between the local symbol and
  680. // '.LTOC' to manifest the toc-relative offset.
  681. const MCExpr *PB = MCSymbolRefExpr::create(
  682. OutContext.getOrCreateSymbol(Twine(".LTOC")), OutContext);
  683. Exp = MCBinaryExpr::createSub(Exp, PB, OutContext);
  684. TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
  685. EmitToStreamer(*OutStreamer, TmpInst);
  686. return;
  687. }
  688. case PPC::LDtocJTI:
  689. case PPC::LDtocCPT:
  690. case PPC::LDtocBA:
  691. case PPC::LDtoc: {
  692. // Transform %x3 = LDtoc @min1, %x2
  693. LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
  694. // Change the opcode to LD.
  695. TmpInst.setOpcode(PPC::LD);
  696. const MachineOperand &MO = MI->getOperand(1);
  697. assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()) &&
  698. "Invalid operand!");
  699. // Map the operand to its corresponding MCSymbol.
  700. const MCSymbol *const MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this);
  701. // Map the machine operand to its corresponding MCSymbol, then map the
  702. // global address operand to be a reference to the TOC entry we will
  703. // synthesize later.
  704. MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(MOSymbol);
  705. const MCSymbolRefExpr::VariantKind VK =
  706. IsAIX ? MCSymbolRefExpr::VK_None : MCSymbolRefExpr::VK_PPC_TOC;
  707. const MCExpr *Exp =
  708. MCSymbolRefExpr::create(TOCEntry, VK, OutContext);
  709. TmpInst.getOperand(1) = MCOperand::createExpr(
  710. IsAIX ? getTOCEntryLoadingExprForXCOFF(MOSymbol, Exp) : Exp);
  711. EmitToStreamer(*OutStreamer, TmpInst);
  712. return;
  713. }
  714. case PPC::ADDIStocHA: {
  715. assert((IsAIX && !IsPPC64 && TM.getCodeModel() == CodeModel::Large) &&
  716. "This pseudo should only be selected for 32-bit large code model on"
  717. " AIX.");
  718. // Transform %rd = ADDIStocHA %rA, @sym(%r2)
  719. LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
  720. // Change the opcode to ADDIS.
  721. TmpInst.setOpcode(PPC::ADDIS);
  722. const MachineOperand &MO = MI->getOperand(2);
  723. assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()) &&
  724. "Invalid operand for ADDIStocHA.");
  725. // Map the machine operand to its corresponding MCSymbol.
  726. MCSymbol *MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this);
  727. // Always use TOC on AIX. Map the global address operand to be a reference
  728. // to the TOC entry we will synthesize later. 'TOCEntry' is a label used to
  729. // reference the storage allocated in the TOC which contains the address of
  730. // 'MOSymbol'.
  731. MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(MOSymbol);
  732. const MCExpr *Exp = MCSymbolRefExpr::create(TOCEntry,
  733. MCSymbolRefExpr::VK_PPC_U,
  734. OutContext);
  735. TmpInst.getOperand(2) = MCOperand::createExpr(Exp);
  736. EmitToStreamer(*OutStreamer, TmpInst);
  737. return;
  738. }
  739. case PPC::LWZtocL: {
  740. assert(IsAIX && !IsPPC64 && TM.getCodeModel() == CodeModel::Large &&
  741. "This pseudo should only be selected for 32-bit large code model on"
  742. " AIX.");
  743. // Transform %rd = LWZtocL @sym, %rs.
  744. LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
  745. // Change the opcode to lwz.
  746. TmpInst.setOpcode(PPC::LWZ);
  747. const MachineOperand &MO = MI->getOperand(1);
  748. assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()) &&
  749. "Invalid operand for LWZtocL.");
  750. // Map the machine operand to its corresponding MCSymbol.
  751. MCSymbol *MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this);
  752. // Always use TOC on AIX. Map the global address operand to be a reference
  753. // to the TOC entry we will synthesize later. 'TOCEntry' is a label used to
  754. // reference the storage allocated in the TOC which contains the address of
  755. // 'MOSymbol'.
  756. MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(MOSymbol);
  757. const MCExpr *Exp = MCSymbolRefExpr::create(TOCEntry,
  758. MCSymbolRefExpr::VK_PPC_L,
  759. OutContext);
  760. TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
  761. EmitToStreamer(*OutStreamer, TmpInst);
  762. return;
  763. }
  764. case PPC::ADDIStocHA8: {
  765. // Transform %xd = ADDIStocHA8 %x2, @sym
  766. LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
  767. // Change the opcode to ADDIS8. If the global address is the address of
  768. // an external symbol, is a jump table address, is a block address, or is a
  769. // constant pool index with large code model enabled, then generate a TOC
  770. // entry and reference that. Otherwise, reference the symbol directly.
  771. TmpInst.setOpcode(PPC::ADDIS8);
  772. const MachineOperand &MO = MI->getOperand(2);
  773. assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isBlockAddress()) &&
  774. "Invalid operand for ADDIStocHA8!");
  775. const MCSymbol *MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this);
  776. const bool GlobalToc =
  777. MO.isGlobal() && Subtarget->isGVIndirectSymbol(MO.getGlobal());
  778. if (GlobalToc || MO.isJTI() || MO.isBlockAddress() ||
  779. (MO.isCPI() && TM.getCodeModel() == CodeModel::Large))
  780. MOSymbol = lookUpOrCreateTOCEntry(MOSymbol);
  781. const MCSymbolRefExpr::VariantKind VK =
  782. IsAIX ? MCSymbolRefExpr::VK_PPC_U : MCSymbolRefExpr::VK_PPC_TOC_HA;
  783. const MCExpr *Exp =
  784. MCSymbolRefExpr::create(MOSymbol, VK, OutContext);
  785. if (!MO.isJTI() && MO.getOffset())
  786. Exp = MCBinaryExpr::createAdd(Exp,
  787. MCConstantExpr::create(MO.getOffset(),
  788. OutContext),
  789. OutContext);
  790. TmpInst.getOperand(2) = MCOperand::createExpr(Exp);
  791. EmitToStreamer(*OutStreamer, TmpInst);
  792. return;
  793. }
  794. case PPC::LDtocL: {
  795. // Transform %xd = LDtocL @sym, %xs
  796. LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
  797. // Change the opcode to LD. If the global address is the address of
  798. // an external symbol, is a jump table address, is a block address, or is
  799. // a constant pool index with large code model enabled, then generate a
  800. // TOC entry and reference that. Otherwise, reference the symbol directly.
  801. TmpInst.setOpcode(PPC::LD);
  802. const MachineOperand &MO = MI->getOperand(1);
  803. assert((MO.isGlobal() || MO.isCPI() || MO.isJTI() ||
  804. MO.isBlockAddress()) &&
  805. "Invalid operand for LDtocL!");
  806. LLVM_DEBUG(assert(
  807. (!MO.isGlobal() || Subtarget->isGVIndirectSymbol(MO.getGlobal())) &&
  808. "LDtocL used on symbol that could be accessed directly is "
  809. "invalid. Must match ADDIStocHA8."));
  810. const MCSymbol *MOSymbol = getMCSymbolForTOCPseudoMO(MO, *this);
  811. if (!MO.isCPI() || TM.getCodeModel() == CodeModel::Large)
  812. MOSymbol = lookUpOrCreateTOCEntry(MOSymbol);
  813. const MCSymbolRefExpr::VariantKind VK =
  814. IsAIX ? MCSymbolRefExpr::VK_PPC_L : MCSymbolRefExpr::VK_PPC_TOC_LO;
  815. const MCExpr *Exp =
  816. MCSymbolRefExpr::create(MOSymbol, VK, OutContext);
  817. TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
  818. EmitToStreamer(*OutStreamer, TmpInst);
  819. return;
  820. }
  821. case PPC::ADDItocL: {
  822. // Transform %xd = ADDItocL %xs, @sym
  823. LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
  824. // Change the opcode to ADDI8. If the global address is external, then
  825. // generate a TOC entry and reference that. Otherwise, reference the
  826. // symbol directly.
  827. TmpInst.setOpcode(PPC::ADDI8);
  828. const MachineOperand &MO = MI->getOperand(2);
  829. assert((MO.isGlobal() || MO.isCPI()) && "Invalid operand for ADDItocL.");
  830. LLVM_DEBUG(assert(
  831. !(MO.isGlobal() && Subtarget->isGVIndirectSymbol(MO.getGlobal())) &&
  832. "Interposable definitions must use indirect access."));
  833. const MCExpr *Exp =
  834. MCSymbolRefExpr::create(getMCSymbolForTOCPseudoMO(MO, *this),
  835. MCSymbolRefExpr::VK_PPC_TOC_LO, OutContext);
  836. TmpInst.getOperand(2) = MCOperand::createExpr(Exp);
  837. EmitToStreamer(*OutStreamer, TmpInst);
  838. return;
  839. }
  840. case PPC::ADDISgotTprelHA: {
  841. // Transform: %xd = ADDISgotTprelHA %x2, @sym
  842. // Into: %xd = ADDIS8 %x2, sym@got@tlsgd@ha
  843. assert(IsPPC64 && "Not supported for 32-bit PowerPC");
  844. const MachineOperand &MO = MI->getOperand(2);
  845. const GlobalValue *GValue = MO.getGlobal();
  846. MCSymbol *MOSymbol = getSymbol(GValue);
  847. const MCExpr *SymGotTprel =
  848. MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA,
  849. OutContext);
  850. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS8)
  851. .addReg(MI->getOperand(0).getReg())
  852. .addReg(MI->getOperand(1).getReg())
  853. .addExpr(SymGotTprel));
  854. return;
  855. }
  856. case PPC::LDgotTprelL:
  857. case PPC::LDgotTprelL32: {
  858. // Transform %xd = LDgotTprelL @sym, %xs
  859. LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
  860. // Change the opcode to LD.
  861. TmpInst.setOpcode(IsPPC64 ? PPC::LD : PPC::LWZ);
  862. const MachineOperand &MO = MI->getOperand(1);
  863. const GlobalValue *GValue = MO.getGlobal();
  864. MCSymbol *MOSymbol = getSymbol(GValue);
  865. const MCExpr *Exp = MCSymbolRefExpr::create(
  866. MOSymbol, IsPPC64 ? MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO
  867. : MCSymbolRefExpr::VK_PPC_GOT_TPREL,
  868. OutContext);
  869. TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
  870. EmitToStreamer(*OutStreamer, TmpInst);
  871. return;
  872. }
  873. case PPC::PPC32PICGOT: {
  874. MCSymbol *GOTSymbol = OutContext.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_"));
  875. MCSymbol *GOTRef = OutContext.createTempSymbol();
  876. MCSymbol *NextInstr = OutContext.createTempSymbol();
  877. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::BL)
  878. // FIXME: We would like an efficient form for this, so we don't have to do
  879. // a lot of extra uniquing.
  880. .addExpr(MCSymbolRefExpr::create(NextInstr, OutContext)));
  881. const MCExpr *OffsExpr =
  882. MCBinaryExpr::createSub(MCSymbolRefExpr::create(GOTSymbol, OutContext),
  883. MCSymbolRefExpr::create(GOTRef, OutContext),
  884. OutContext);
  885. OutStreamer->emitLabel(GOTRef);
  886. OutStreamer->emitValue(OffsExpr, 4);
  887. OutStreamer->emitLabel(NextInstr);
  888. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR)
  889. .addReg(MI->getOperand(0).getReg()));
  890. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LWZ)
  891. .addReg(MI->getOperand(1).getReg())
  892. .addImm(0)
  893. .addReg(MI->getOperand(0).getReg()));
  894. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADD4)
  895. .addReg(MI->getOperand(0).getReg())
  896. .addReg(MI->getOperand(1).getReg())
  897. .addReg(MI->getOperand(0).getReg()));
  898. return;
  899. }
  900. case PPC::PPC32GOT: {
  901. MCSymbol *GOTSymbol =
  902. OutContext.getOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_"));
  903. const MCExpr *SymGotTlsL = MCSymbolRefExpr::create(
  904. GOTSymbol, MCSymbolRefExpr::VK_PPC_LO, OutContext);
  905. const MCExpr *SymGotTlsHA = MCSymbolRefExpr::create(
  906. GOTSymbol, MCSymbolRefExpr::VK_PPC_HA, OutContext);
  907. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LI)
  908. .addReg(MI->getOperand(0).getReg())
  909. .addExpr(SymGotTlsL));
  910. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS)
  911. .addReg(MI->getOperand(0).getReg())
  912. .addReg(MI->getOperand(0).getReg())
  913. .addExpr(SymGotTlsHA));
  914. return;
  915. }
  916. case PPC::ADDIStlsgdHA: {
  917. // Transform: %xd = ADDIStlsgdHA %x2, @sym
  918. // Into: %xd = ADDIS8 %x2, sym@got@tlsgd@ha
  919. assert(IsPPC64 && "Not supported for 32-bit PowerPC");
  920. const MachineOperand &MO = MI->getOperand(2);
  921. const GlobalValue *GValue = MO.getGlobal();
  922. MCSymbol *MOSymbol = getSymbol(GValue);
  923. const MCExpr *SymGotTlsGD =
  924. MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA,
  925. OutContext);
  926. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS8)
  927. .addReg(MI->getOperand(0).getReg())
  928. .addReg(MI->getOperand(1).getReg())
  929. .addExpr(SymGotTlsGD));
  930. return;
  931. }
  932. case PPC::ADDItlsgdL:
  933. // Transform: %xd = ADDItlsgdL %xs, @sym
  934. // Into: %xd = ADDI8 %xs, sym@got@tlsgd@l
  935. case PPC::ADDItlsgdL32: {
  936. // Transform: %rd = ADDItlsgdL32 %rs, @sym
  937. // Into: %rd = ADDI %rs, sym@got@tlsgd
  938. const MachineOperand &MO = MI->getOperand(2);
  939. const GlobalValue *GValue = MO.getGlobal();
  940. MCSymbol *MOSymbol = getSymbol(GValue);
  941. const MCExpr *SymGotTlsGD = MCSymbolRefExpr::create(
  942. MOSymbol, IsPPC64 ? MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO
  943. : MCSymbolRefExpr::VK_PPC_GOT_TLSGD,
  944. OutContext);
  945. EmitToStreamer(*OutStreamer,
  946. MCInstBuilder(IsPPC64 ? PPC::ADDI8 : PPC::ADDI)
  947. .addReg(MI->getOperand(0).getReg())
  948. .addReg(MI->getOperand(1).getReg())
  949. .addExpr(SymGotTlsGD));
  950. return;
  951. }
  952. case PPC::GETtlsADDR:
  953. // Transform: %x3 = GETtlsADDR %x3, @sym
  954. // Into: BL8_NOP_TLS __tls_get_addr(sym at tlsgd)
  955. case PPC::GETtlsADDRPCREL:
  956. case PPC::GETtlsADDR32: {
  957. // Transform: %r3 = GETtlsADDR32 %r3, @sym
  958. // Into: BL_TLS __tls_get_addr(sym at tlsgd)@PLT
  959. EmitTlsCall(MI, MCSymbolRefExpr::VK_PPC_TLSGD);
  960. return;
  961. }
  962. case PPC::ADDIStlsldHA: {
  963. // Transform: %xd = ADDIStlsldHA %x2, @sym
  964. // Into: %xd = ADDIS8 %x2, sym@got@tlsld@ha
  965. assert(IsPPC64 && "Not supported for 32-bit PowerPC");
  966. const MachineOperand &MO = MI->getOperand(2);
  967. const GlobalValue *GValue = MO.getGlobal();
  968. MCSymbol *MOSymbol = getSymbol(GValue);
  969. const MCExpr *SymGotTlsLD =
  970. MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA,
  971. OutContext);
  972. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS8)
  973. .addReg(MI->getOperand(0).getReg())
  974. .addReg(MI->getOperand(1).getReg())
  975. .addExpr(SymGotTlsLD));
  976. return;
  977. }
  978. case PPC::ADDItlsldL:
  979. // Transform: %xd = ADDItlsldL %xs, @sym
  980. // Into: %xd = ADDI8 %xs, sym@got@tlsld@l
  981. case PPC::ADDItlsldL32: {
  982. // Transform: %rd = ADDItlsldL32 %rs, @sym
  983. // Into: %rd = ADDI %rs, sym@got@tlsld
  984. const MachineOperand &MO = MI->getOperand(2);
  985. const GlobalValue *GValue = MO.getGlobal();
  986. MCSymbol *MOSymbol = getSymbol(GValue);
  987. const MCExpr *SymGotTlsLD = MCSymbolRefExpr::create(
  988. MOSymbol, IsPPC64 ? MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO
  989. : MCSymbolRefExpr::VK_PPC_GOT_TLSLD,
  990. OutContext);
  991. EmitToStreamer(*OutStreamer,
  992. MCInstBuilder(IsPPC64 ? PPC::ADDI8 : PPC::ADDI)
  993. .addReg(MI->getOperand(0).getReg())
  994. .addReg(MI->getOperand(1).getReg())
  995. .addExpr(SymGotTlsLD));
  996. return;
  997. }
  998. case PPC::GETtlsldADDR:
  999. // Transform: %x3 = GETtlsldADDR %x3, @sym
  1000. // Into: BL8_NOP_TLS __tls_get_addr(sym at tlsld)
  1001. case PPC::GETtlsldADDRPCREL:
  1002. case PPC::GETtlsldADDR32: {
  1003. // Transform: %r3 = GETtlsldADDR32 %r3, @sym
  1004. // Into: BL_TLS __tls_get_addr(sym at tlsld)@PLT
  1005. EmitTlsCall(MI, MCSymbolRefExpr::VK_PPC_TLSLD);
  1006. return;
  1007. }
  1008. case PPC::ADDISdtprelHA:
  1009. // Transform: %xd = ADDISdtprelHA %xs, @sym
  1010. // Into: %xd = ADDIS8 %xs, sym@dtprel@ha
  1011. case PPC::ADDISdtprelHA32: {
  1012. // Transform: %rd = ADDISdtprelHA32 %rs, @sym
  1013. // Into: %rd = ADDIS %rs, sym@dtprel@ha
  1014. const MachineOperand &MO = MI->getOperand(2);
  1015. const GlobalValue *GValue = MO.getGlobal();
  1016. MCSymbol *MOSymbol = getSymbol(GValue);
  1017. const MCExpr *SymDtprel =
  1018. MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_DTPREL_HA,
  1019. OutContext);
  1020. EmitToStreamer(
  1021. *OutStreamer,
  1022. MCInstBuilder(IsPPC64 ? PPC::ADDIS8 : PPC::ADDIS)
  1023. .addReg(MI->getOperand(0).getReg())
  1024. .addReg(MI->getOperand(1).getReg())
  1025. .addExpr(SymDtprel));
  1026. return;
  1027. }
  1028. case PPC::PADDIdtprel: {
  1029. // Transform: %rd = PADDIdtprel %rs, @sym
  1030. // Into: %rd = PADDI8 %rs, sym@dtprel
  1031. const MachineOperand &MO = MI->getOperand(2);
  1032. const GlobalValue *GValue = MO.getGlobal();
  1033. MCSymbol *MOSymbol = getSymbol(GValue);
  1034. const MCExpr *SymDtprel = MCSymbolRefExpr::create(
  1035. MOSymbol, MCSymbolRefExpr::VK_DTPREL, OutContext);
  1036. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::PADDI8)
  1037. .addReg(MI->getOperand(0).getReg())
  1038. .addReg(MI->getOperand(1).getReg())
  1039. .addExpr(SymDtprel));
  1040. return;
  1041. }
  1042. case PPC::ADDIdtprelL:
  1043. // Transform: %xd = ADDIdtprelL %xs, @sym
  1044. // Into: %xd = ADDI8 %xs, sym@dtprel@l
  1045. case PPC::ADDIdtprelL32: {
  1046. // Transform: %rd = ADDIdtprelL32 %rs, @sym
  1047. // Into: %rd = ADDI %rs, sym@dtprel@l
  1048. const MachineOperand &MO = MI->getOperand(2);
  1049. const GlobalValue *GValue = MO.getGlobal();
  1050. MCSymbol *MOSymbol = getSymbol(GValue);
  1051. const MCExpr *SymDtprel =
  1052. MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_DTPREL_LO,
  1053. OutContext);
  1054. EmitToStreamer(*OutStreamer,
  1055. MCInstBuilder(IsPPC64 ? PPC::ADDI8 : PPC::ADDI)
  1056. .addReg(MI->getOperand(0).getReg())
  1057. .addReg(MI->getOperand(1).getReg())
  1058. .addExpr(SymDtprel));
  1059. return;
  1060. }
  1061. case PPC::MFOCRF:
  1062. case PPC::MFOCRF8:
  1063. if (!Subtarget->hasMFOCRF()) {
  1064. // Transform: %r3 = MFOCRF %cr7
  1065. // Into: %r3 = MFCR ;; cr7
  1066. unsigned NewOpcode =
  1067. MI->getOpcode() == PPC::MFOCRF ? PPC::MFCR : PPC::MFCR8;
  1068. OutStreamer->AddComment(PPCInstPrinter::
  1069. getRegisterName(MI->getOperand(1).getReg()));
  1070. EmitToStreamer(*OutStreamer, MCInstBuilder(NewOpcode)
  1071. .addReg(MI->getOperand(0).getReg()));
  1072. return;
  1073. }
  1074. break;
  1075. case PPC::MTOCRF:
  1076. case PPC::MTOCRF8:
  1077. if (!Subtarget->hasMFOCRF()) {
  1078. // Transform: %cr7 = MTOCRF %r3
  1079. // Into: MTCRF mask, %r3 ;; cr7
  1080. unsigned NewOpcode =
  1081. MI->getOpcode() == PPC::MTOCRF ? PPC::MTCRF : PPC::MTCRF8;
  1082. unsigned Mask = 0x80 >> OutContext.getRegisterInfo()
  1083. ->getEncodingValue(MI->getOperand(0).getReg());
  1084. OutStreamer->AddComment(PPCInstPrinter::
  1085. getRegisterName(MI->getOperand(0).getReg()));
  1086. EmitToStreamer(*OutStreamer, MCInstBuilder(NewOpcode)
  1087. .addImm(Mask)
  1088. .addReg(MI->getOperand(1).getReg()));
  1089. return;
  1090. }
  1091. break;
  1092. case PPC::LD:
  1093. case PPC::STD:
  1094. case PPC::LWA_32:
  1095. case PPC::LWA: {
  1096. // Verify alignment is legal, so we don't create relocations
  1097. // that can't be supported.
  1098. unsigned OpNum = (MI->getOpcode() == PPC::STD) ? 2 : 1;
  1099. const MachineOperand &MO = MI->getOperand(OpNum);
  1100. if (MO.isGlobal()) {
  1101. const DataLayout &DL = MO.getGlobal()->getParent()->getDataLayout();
  1102. if (MO.getGlobal()->getPointerAlignment(DL) < 4)
  1103. llvm_unreachable("Global must be word-aligned for LD, STD, LWA!");
  1104. }
  1105. // Now process the instruction normally.
  1106. break;
  1107. }
  1108. }
  1109. LowerPPCMachineInstrToMCInst(MI, TmpInst, *this);
  1110. EmitToStreamer(*OutStreamer, TmpInst);
  1111. }
  1112. void PPCLinuxAsmPrinter::emitInstruction(const MachineInstr *MI) {
  1113. if (!Subtarget->isPPC64())
  1114. return PPCAsmPrinter::emitInstruction(MI);
  1115. switch (MI->getOpcode()) {
  1116. default:
  1117. return PPCAsmPrinter::emitInstruction(MI);
  1118. case TargetOpcode::PATCHABLE_FUNCTION_ENTER: {
  1119. // .begin:
  1120. // b .end # lis 0, FuncId[16..32]
  1121. // nop # li 0, FuncId[0..15]
  1122. // std 0, -8(1)
  1123. // mflr 0
  1124. // bl __xray_FunctionEntry
  1125. // mtlr 0
  1126. // .end:
  1127. //
  1128. // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number
  1129. // of instructions change.
  1130. MCSymbol *BeginOfSled = OutContext.createTempSymbol();
  1131. MCSymbol *EndOfSled = OutContext.createTempSymbol();
  1132. OutStreamer->emitLabel(BeginOfSled);
  1133. EmitToStreamer(*OutStreamer,
  1134. MCInstBuilder(PPC::B).addExpr(
  1135. MCSymbolRefExpr::create(EndOfSled, OutContext)));
  1136. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP));
  1137. EmitToStreamer(
  1138. *OutStreamer,
  1139. MCInstBuilder(PPC::STD).addReg(PPC::X0).addImm(-8).addReg(PPC::X1));
  1140. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR8).addReg(PPC::X0));
  1141. EmitToStreamer(*OutStreamer,
  1142. MCInstBuilder(PPC::BL8_NOP)
  1143. .addExpr(MCSymbolRefExpr::create(
  1144. OutContext.getOrCreateSymbol("__xray_FunctionEntry"),
  1145. OutContext)));
  1146. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTLR8).addReg(PPC::X0));
  1147. OutStreamer->emitLabel(EndOfSled);
  1148. recordSled(BeginOfSled, *MI, SledKind::FUNCTION_ENTER, 2);
  1149. break;
  1150. }
  1151. case TargetOpcode::PATCHABLE_RET: {
  1152. unsigned RetOpcode = MI->getOperand(0).getImm();
  1153. MCInst RetInst;
  1154. RetInst.setOpcode(RetOpcode);
  1155. for (const auto &MO :
  1156. make_range(std::next(MI->operands_begin()), MI->operands_end())) {
  1157. MCOperand MCOp;
  1158. if (LowerPPCMachineOperandToMCOperand(MO, MCOp, *this))
  1159. RetInst.addOperand(MCOp);
  1160. }
  1161. bool IsConditional;
  1162. if (RetOpcode == PPC::BCCLR) {
  1163. IsConditional = true;
  1164. } else if (RetOpcode == PPC::TCRETURNdi8 || RetOpcode == PPC::TCRETURNri8 ||
  1165. RetOpcode == PPC::TCRETURNai8) {
  1166. break;
  1167. } else if (RetOpcode == PPC::BLR8 || RetOpcode == PPC::TAILB8) {
  1168. IsConditional = false;
  1169. } else {
  1170. EmitToStreamer(*OutStreamer, RetInst);
  1171. break;
  1172. }
  1173. MCSymbol *FallthroughLabel;
  1174. if (IsConditional) {
  1175. // Before:
  1176. // bgtlr cr0
  1177. //
  1178. // After:
  1179. // ble cr0, .end
  1180. // .p2align 3
  1181. // .begin:
  1182. // blr # lis 0, FuncId[16..32]
  1183. // nop # li 0, FuncId[0..15]
  1184. // std 0, -8(1)
  1185. // mflr 0
  1186. // bl __xray_FunctionExit
  1187. // mtlr 0
  1188. // blr
  1189. // .end:
  1190. //
  1191. // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number
  1192. // of instructions change.
  1193. FallthroughLabel = OutContext.createTempSymbol();
  1194. EmitToStreamer(
  1195. *OutStreamer,
  1196. MCInstBuilder(PPC::BCC)
  1197. .addImm(PPC::InvertPredicate(
  1198. static_cast<PPC::Predicate>(MI->getOperand(1).getImm())))
  1199. .addReg(MI->getOperand(2).getReg())
  1200. .addExpr(MCSymbolRefExpr::create(FallthroughLabel, OutContext)));
  1201. RetInst = MCInst();
  1202. RetInst.setOpcode(PPC::BLR8);
  1203. }
  1204. // .p2align 3
  1205. // .begin:
  1206. // b(lr)? # lis 0, FuncId[16..32]
  1207. // nop # li 0, FuncId[0..15]
  1208. // std 0, -8(1)
  1209. // mflr 0
  1210. // bl __xray_FunctionExit
  1211. // mtlr 0
  1212. // b(lr)?
  1213. //
  1214. // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number
  1215. // of instructions change.
  1216. OutStreamer->emitCodeAlignment(8);
  1217. MCSymbol *BeginOfSled = OutContext.createTempSymbol();
  1218. OutStreamer->emitLabel(BeginOfSled);
  1219. EmitToStreamer(*OutStreamer, RetInst);
  1220. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP));
  1221. EmitToStreamer(
  1222. *OutStreamer,
  1223. MCInstBuilder(PPC::STD).addReg(PPC::X0).addImm(-8).addReg(PPC::X1));
  1224. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR8).addReg(PPC::X0));
  1225. EmitToStreamer(*OutStreamer,
  1226. MCInstBuilder(PPC::BL8_NOP)
  1227. .addExpr(MCSymbolRefExpr::create(
  1228. OutContext.getOrCreateSymbol("__xray_FunctionExit"),
  1229. OutContext)));
  1230. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTLR8).addReg(PPC::X0));
  1231. EmitToStreamer(*OutStreamer, RetInst);
  1232. if (IsConditional)
  1233. OutStreamer->emitLabel(FallthroughLabel);
  1234. recordSled(BeginOfSled, *MI, SledKind::FUNCTION_EXIT, 2);
  1235. break;
  1236. }
  1237. case TargetOpcode::PATCHABLE_FUNCTION_EXIT:
  1238. llvm_unreachable("PATCHABLE_FUNCTION_EXIT should never be emitted");
  1239. case TargetOpcode::PATCHABLE_TAIL_CALL:
  1240. // TODO: Define a trampoline `__xray_FunctionTailExit` and differentiate a
  1241. // normal function exit from a tail exit.
  1242. llvm_unreachable("Tail call is handled in the normal case. See comments "
  1243. "around this assert.");
  1244. }
  1245. }
  1246. void PPCLinuxAsmPrinter::emitStartOfAsmFile(Module &M) {
  1247. if (static_cast<const PPCTargetMachine &>(TM).isELFv2ABI()) {
  1248. PPCTargetStreamer *TS =
  1249. static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
  1250. if (TS)
  1251. TS->emitAbiVersion(2);
  1252. }
  1253. if (static_cast<const PPCTargetMachine &>(TM).isPPC64() ||
  1254. !isPositionIndependent())
  1255. return AsmPrinter::emitStartOfAsmFile(M);
  1256. if (M.getPICLevel() == PICLevel::SmallPIC)
  1257. return AsmPrinter::emitStartOfAsmFile(M);
  1258. OutStreamer->SwitchSection(OutContext.getELFSection(
  1259. ".got2", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC));
  1260. MCSymbol *TOCSym = OutContext.getOrCreateSymbol(Twine(".LTOC"));
  1261. MCSymbol *CurrentPos = OutContext.createTempSymbol();
  1262. OutStreamer->emitLabel(CurrentPos);
  1263. // The GOT pointer points to the middle of the GOT, in order to reference the
  1264. // entire 64kB range. 0x8000 is the midpoint.
  1265. const MCExpr *tocExpr =
  1266. MCBinaryExpr::createAdd(MCSymbolRefExpr::create(CurrentPos, OutContext),
  1267. MCConstantExpr::create(0x8000, OutContext),
  1268. OutContext);
  1269. OutStreamer->emitAssignment(TOCSym, tocExpr);
  1270. OutStreamer->SwitchSection(getObjFileLowering().getTextSection());
  1271. }
  1272. void PPCLinuxAsmPrinter::emitFunctionEntryLabel() {
  1273. // linux/ppc32 - Normal entry label.
  1274. if (!Subtarget->isPPC64() &&
  1275. (!isPositionIndependent() ||
  1276. MF->getFunction().getParent()->getPICLevel() == PICLevel::SmallPIC))
  1277. return AsmPrinter::emitFunctionEntryLabel();
  1278. if (!Subtarget->isPPC64()) {
  1279. const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>();
  1280. if (PPCFI->usesPICBase() && !Subtarget->isSecurePlt()) {
  1281. MCSymbol *RelocSymbol = PPCFI->getPICOffsetSymbol(*MF);
  1282. MCSymbol *PICBase = MF->getPICBaseSymbol();
  1283. OutStreamer->emitLabel(RelocSymbol);
  1284. const MCExpr *OffsExpr =
  1285. MCBinaryExpr::createSub(
  1286. MCSymbolRefExpr::create(OutContext.getOrCreateSymbol(Twine(".LTOC")),
  1287. OutContext),
  1288. MCSymbolRefExpr::create(PICBase, OutContext),
  1289. OutContext);
  1290. OutStreamer->emitValue(OffsExpr, 4);
  1291. OutStreamer->emitLabel(CurrentFnSym);
  1292. return;
  1293. } else
  1294. return AsmPrinter::emitFunctionEntryLabel();
  1295. }
  1296. // ELFv2 ABI - Normal entry label.
  1297. if (Subtarget->isELFv2ABI()) {
  1298. // In the Large code model, we allow arbitrary displacements between
  1299. // the text section and its associated TOC section. We place the
  1300. // full 8-byte offset to the TOC in memory immediately preceding
  1301. // the function global entry point.
  1302. if (TM.getCodeModel() == CodeModel::Large
  1303. && !MF->getRegInfo().use_empty(PPC::X2)) {
  1304. const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>();
  1305. MCSymbol *TOCSymbol = OutContext.getOrCreateSymbol(StringRef(".TOC."));
  1306. MCSymbol *GlobalEPSymbol = PPCFI->getGlobalEPSymbol(*MF);
  1307. const MCExpr *TOCDeltaExpr =
  1308. MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCSymbol, OutContext),
  1309. MCSymbolRefExpr::create(GlobalEPSymbol,
  1310. OutContext),
  1311. OutContext);
  1312. OutStreamer->emitLabel(PPCFI->getTOCOffsetSymbol(*MF));
  1313. OutStreamer->emitValue(TOCDeltaExpr, 8);
  1314. }
  1315. return AsmPrinter::emitFunctionEntryLabel();
  1316. }
  1317. // Emit an official procedure descriptor.
  1318. MCSectionSubPair Current = OutStreamer->getCurrentSection();
  1319. MCSectionELF *Section = OutStreamer->getContext().getELFSection(
  1320. ".opd", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);
  1321. OutStreamer->SwitchSection(Section);
  1322. OutStreamer->emitLabel(CurrentFnSym);
  1323. OutStreamer->emitValueToAlignment(8);
  1324. MCSymbol *Symbol1 = CurrentFnSymForSize;
  1325. // Generates a R_PPC64_ADDR64 (from FK_DATA_8) relocation for the function
  1326. // entry point.
  1327. OutStreamer->emitValue(MCSymbolRefExpr::create(Symbol1, OutContext),
  1328. 8 /*size*/);
  1329. MCSymbol *Symbol2 = OutContext.getOrCreateSymbol(StringRef(".TOC."));
  1330. // Generates a R_PPC64_TOC relocation for TOC base insertion.
  1331. OutStreamer->emitValue(
  1332. MCSymbolRefExpr::create(Symbol2, MCSymbolRefExpr::VK_PPC_TOCBASE, OutContext),
  1333. 8/*size*/);
  1334. // Emit a null environment pointer.
  1335. OutStreamer->emitIntValue(0, 8 /* size */);
  1336. OutStreamer->SwitchSection(Current.first, Current.second);
  1337. }
  1338. void PPCLinuxAsmPrinter::emitEndOfAsmFile(Module &M) {
  1339. const DataLayout &DL = getDataLayout();
  1340. bool isPPC64 = DL.getPointerSizeInBits() == 64;
  1341. PPCTargetStreamer *TS =
  1342. static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
  1343. if (!TOC.empty()) {
  1344. const char *Name = isPPC64 ? ".toc" : ".got2";
  1345. MCSectionELF *Section = OutContext.getELFSection(
  1346. Name, ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);
  1347. OutStreamer->SwitchSection(Section);
  1348. if (!isPPC64)
  1349. OutStreamer->emitValueToAlignment(4);
  1350. for (const auto &TOCMapPair : TOC) {
  1351. const MCSymbol *const TOCEntryTarget = TOCMapPair.first;
  1352. MCSymbol *const TOCEntryLabel = TOCMapPair.second;
  1353. OutStreamer->emitLabel(TOCEntryLabel);
  1354. if (isPPC64 && TS != nullptr)
  1355. TS->emitTCEntry(*TOCEntryTarget);
  1356. else
  1357. OutStreamer->emitSymbolValue(TOCEntryTarget, 4);
  1358. }
  1359. }
  1360. PPCAsmPrinter::emitEndOfAsmFile(M);
  1361. }
  1362. /// EmitFunctionBodyStart - Emit a global entry point prefix for ELFv2.
  1363. void PPCLinuxAsmPrinter::emitFunctionBodyStart() {
  1364. // In the ELFv2 ABI, in functions that use the TOC register, we need to
  1365. // provide two entry points. The ABI guarantees that when calling the
  1366. // local entry point, r2 is set up by the caller to contain the TOC base
  1367. // for this function, and when calling the global entry point, r12 is set
  1368. // up by the caller to hold the address of the global entry point. We
  1369. // thus emit a prefix sequence along the following lines:
  1370. //
  1371. // func:
  1372. // .Lfunc_gepNN:
  1373. // # global entry point
  1374. // addis r2,r12,(.TOC.-.Lfunc_gepNN)@ha
  1375. // addi r2,r2,(.TOC.-.Lfunc_gepNN)@l
  1376. // .Lfunc_lepNN:
  1377. // .localentry func, .Lfunc_lepNN-.Lfunc_gepNN
  1378. // # local entry point, followed by function body
  1379. //
  1380. // For the Large code model, we create
  1381. //
  1382. // .Lfunc_tocNN:
  1383. // .quad .TOC.-.Lfunc_gepNN # done by EmitFunctionEntryLabel
  1384. // func:
  1385. // .Lfunc_gepNN:
  1386. // # global entry point
  1387. // ld r2,.Lfunc_tocNN-.Lfunc_gepNN(r12)
  1388. // add r2,r2,r12
  1389. // .Lfunc_lepNN:
  1390. // .localentry func, .Lfunc_lepNN-.Lfunc_gepNN
  1391. // # local entry point, followed by function body
  1392. //
  1393. // This ensures we have r2 set up correctly while executing the function
  1394. // body, no matter which entry point is called.
  1395. const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>();
  1396. const bool UsesX2OrR2 = !MF->getRegInfo().use_empty(PPC::X2) ||
  1397. !MF->getRegInfo().use_empty(PPC::R2);
  1398. const bool PCrelGEPRequired = Subtarget->isUsingPCRelativeCalls() &&
  1399. UsesX2OrR2 && PPCFI->usesTOCBasePtr();
  1400. const bool NonPCrelGEPRequired = !Subtarget->isUsingPCRelativeCalls() &&
  1401. Subtarget->isELFv2ABI() && UsesX2OrR2;
  1402. // Only do all that if the function uses R2 as the TOC pointer
  1403. // in the first place. We don't need the global entry point if the
  1404. // function uses R2 as an allocatable register.
  1405. if (NonPCrelGEPRequired || PCrelGEPRequired) {
  1406. // Note: The logic here must be synchronized with the code in the
  1407. // branch-selection pass which sets the offset of the first block in the
  1408. // function. This matters because it affects the alignment.
  1409. MCSymbol *GlobalEntryLabel = PPCFI->getGlobalEPSymbol(*MF);
  1410. OutStreamer->emitLabel(GlobalEntryLabel);
  1411. const MCSymbolRefExpr *GlobalEntryLabelExp =
  1412. MCSymbolRefExpr::create(GlobalEntryLabel, OutContext);
  1413. if (TM.getCodeModel() != CodeModel::Large) {
  1414. MCSymbol *TOCSymbol = OutContext.getOrCreateSymbol(StringRef(".TOC."));
  1415. const MCExpr *TOCDeltaExpr =
  1416. MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCSymbol, OutContext),
  1417. GlobalEntryLabelExp, OutContext);
  1418. const MCExpr *TOCDeltaHi = PPCMCExpr::createHa(TOCDeltaExpr, OutContext);
  1419. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS)
  1420. .addReg(PPC::X2)
  1421. .addReg(PPC::X12)
  1422. .addExpr(TOCDeltaHi));
  1423. const MCExpr *TOCDeltaLo = PPCMCExpr::createLo(TOCDeltaExpr, OutContext);
  1424. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDI)
  1425. .addReg(PPC::X2)
  1426. .addReg(PPC::X2)
  1427. .addExpr(TOCDeltaLo));
  1428. } else {
  1429. MCSymbol *TOCOffset = PPCFI->getTOCOffsetSymbol(*MF);
  1430. const MCExpr *TOCOffsetDeltaExpr =
  1431. MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCOffset, OutContext),
  1432. GlobalEntryLabelExp, OutContext);
  1433. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::LD)
  1434. .addReg(PPC::X2)
  1435. .addExpr(TOCOffsetDeltaExpr)
  1436. .addReg(PPC::X12));
  1437. EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADD8)
  1438. .addReg(PPC::X2)
  1439. .addReg(PPC::X2)
  1440. .addReg(PPC::X12));
  1441. }
  1442. MCSymbol *LocalEntryLabel = PPCFI->getLocalEPSymbol(*MF);
  1443. OutStreamer->emitLabel(LocalEntryLabel);
  1444. const MCSymbolRefExpr *LocalEntryLabelExp =
  1445. MCSymbolRefExpr::create(LocalEntryLabel, OutContext);
  1446. const MCExpr *LocalOffsetExp =
  1447. MCBinaryExpr::createSub(LocalEntryLabelExp,
  1448. GlobalEntryLabelExp, OutContext);
  1449. PPCTargetStreamer *TS =
  1450. static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
  1451. if (TS)
  1452. TS->emitLocalEntry(cast<MCSymbolELF>(CurrentFnSym), LocalOffsetExp);
  1453. } else if (Subtarget->isUsingPCRelativeCalls()) {
  1454. // When generating the entry point for a function we have a few scenarios
  1455. // based on whether or not that function uses R2 and whether or not that
  1456. // function makes calls (or is a leaf function).
  1457. // 1) A leaf function that does not use R2 (or treats it as callee-saved
  1458. // and preserves it). In this case st_other=0 and both
  1459. // the local and global entry points for the function are the same.
  1460. // No special entry point code is required.
  1461. // 2) A function uses the TOC pointer R2. This function may or may not have
  1462. // calls. In this case st_other=[2,6] and the global and local entry
  1463. // points are different. Code to correctly setup the TOC pointer in R2
  1464. // is put between the global and local entry points. This case is
  1465. // covered by the if statatement above.
  1466. // 3) A function does not use the TOC pointer R2 but does have calls.
  1467. // In this case st_other=1 since we do not know whether or not any
  1468. // of the callees clobber R2. This case is dealt with in this else if
  1469. // block. Tail calls are considered calls and the st_other should also
  1470. // be set to 1 in that case as well.
  1471. // 4) The function does not use the TOC pointer but R2 is used inside
  1472. // the function. In this case st_other=1 once again.
  1473. // 5) This function uses inline asm. We mark R2 as reserved if the function
  1474. // has inline asm as we have to assume that it may be used.
  1475. if (MF->getFrameInfo().hasCalls() || MF->getFrameInfo().hasTailCall() ||
  1476. MF->hasInlineAsm() || (!PPCFI->usesTOCBasePtr() && UsesX2OrR2)) {
  1477. PPCTargetStreamer *TS =
  1478. static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
  1479. if (TS)
  1480. TS->emitLocalEntry(cast<MCSymbolELF>(CurrentFnSym),
  1481. MCConstantExpr::create(1, OutContext));
  1482. }
  1483. }
  1484. }
  1485. /// EmitFunctionBodyEnd - Print the traceback table before the .size
  1486. /// directive.
  1487. ///
  1488. void PPCLinuxAsmPrinter::emitFunctionBodyEnd() {
  1489. // Only the 64-bit target requires a traceback table. For now,
  1490. // we only emit the word of zeroes that GDB requires to find
  1491. // the end of the function, and zeroes for the eight-byte
  1492. // mandatory fields.
  1493. // FIXME: We should fill in the eight-byte mandatory fields as described in
  1494. // the PPC64 ELF ABI (this is a low-priority item because GDB does not
  1495. // currently make use of these fields).
  1496. if (Subtarget->isPPC64()) {
  1497. OutStreamer->emitIntValue(0, 4/*size*/);
  1498. OutStreamer->emitIntValue(0, 8/*size*/);
  1499. }
  1500. }
  1501. void PPCAIXAsmPrinter::emitLinkage(const GlobalValue *GV,
  1502. MCSymbol *GVSym) const {
  1503. assert(MAI->hasVisibilityOnlyWithLinkage() &&
  1504. "AIX's linkage directives take a visibility setting.");
  1505. MCSymbolAttr LinkageAttr = MCSA_Invalid;
  1506. switch (GV->getLinkage()) {
  1507. case GlobalValue::ExternalLinkage:
  1508. LinkageAttr = GV->isDeclaration() ? MCSA_Extern : MCSA_Global;
  1509. break;
  1510. case GlobalValue::LinkOnceAnyLinkage:
  1511. case GlobalValue::LinkOnceODRLinkage:
  1512. case GlobalValue::WeakAnyLinkage:
  1513. case GlobalValue::WeakODRLinkage:
  1514. case GlobalValue::ExternalWeakLinkage:
  1515. LinkageAttr = MCSA_Weak;
  1516. break;
  1517. case GlobalValue::AvailableExternallyLinkage:
  1518. LinkageAttr = MCSA_Extern;
  1519. break;
  1520. case GlobalValue::PrivateLinkage:
  1521. return;
  1522. case GlobalValue::InternalLinkage:
  1523. assert(GV->getVisibility() == GlobalValue::DefaultVisibility &&
  1524. "InternalLinkage should not have other visibility setting.");
  1525. LinkageAttr = MCSA_LGlobal;
  1526. break;
  1527. case GlobalValue::AppendingLinkage:
  1528. llvm_unreachable("Should never emit this");
  1529. case GlobalValue::CommonLinkage:
  1530. llvm_unreachable("CommonLinkage of XCOFF should not come to this path");
  1531. }
  1532. assert(LinkageAttr != MCSA_Invalid && "LinkageAttr should not MCSA_Invalid.");
  1533. MCSymbolAttr VisibilityAttr = MCSA_Invalid;
  1534. if (!TM.getIgnoreXCOFFVisibility()) {
  1535. switch (GV->getVisibility()) {
  1536. // TODO: "exported" and "internal" Visibility needs to go here.
  1537. case GlobalValue::DefaultVisibility:
  1538. break;
  1539. case GlobalValue::HiddenVisibility:
  1540. VisibilityAttr = MAI->getHiddenVisibilityAttr();
  1541. break;
  1542. case GlobalValue::ProtectedVisibility:
  1543. VisibilityAttr = MAI->getProtectedVisibilityAttr();
  1544. break;
  1545. }
  1546. }
  1547. OutStreamer->emitXCOFFSymbolLinkageWithVisibility(GVSym, LinkageAttr,
  1548. VisibilityAttr);
  1549. }
  1550. void PPCAIXAsmPrinter::SetupMachineFunction(MachineFunction &MF) {
  1551. // Setup CurrentFnDescSym and its containing csect.
  1552. MCSectionXCOFF *FnDescSec =
  1553. cast<MCSectionXCOFF>(getObjFileLowering().getSectionForFunctionDescriptor(
  1554. &MF.getFunction(), TM));
  1555. FnDescSec->setAlignment(Align(Subtarget->isPPC64() ? 8 : 4));
  1556. CurrentFnDescSym = FnDescSec->getQualNameSymbol();
  1557. return AsmPrinter::SetupMachineFunction(MF);
  1558. }
  1559. void PPCAIXAsmPrinter::emitFunctionBodyEnd() {
  1560. if (!TM.getXCOFFTracebackTable())
  1561. return;
  1562. emitTracebackTable();
  1563. }
  1564. void PPCAIXAsmPrinter::emitTracebackTable() {
  1565. // Create a symbol for the end of function.
  1566. MCSymbol *FuncEnd = createTempSymbol(MF->getName());
  1567. OutStreamer->emitLabel(FuncEnd);
  1568. OutStreamer->AddComment("Traceback table begin");
  1569. // Begin with a fullword of zero.
  1570. OutStreamer->emitIntValueInHexWithPadding(0, 4 /*size*/);
  1571. SmallString<128> CommentString;
  1572. raw_svector_ostream CommentOS(CommentString);
  1573. auto EmitComment = [&]() {
  1574. OutStreamer->AddComment(CommentOS.str());
  1575. CommentString.clear();
  1576. };
  1577. auto EmitCommentAndValue = [&](uint64_t Value, int Size) {
  1578. EmitComment();
  1579. OutStreamer->emitIntValueInHexWithPadding(Value, Size);
  1580. };
  1581. unsigned int Version = 0;
  1582. CommentOS << "Version = " << Version;
  1583. EmitCommentAndValue(Version, 1);
  1584. // There is a lack of information in the IR to assist with determining the
  1585. // source language. AIX exception handling mechanism would only search for
  1586. // personality routine and LSDA area when such language supports exception
  1587. // handling. So to be conservatively correct and allow runtime to do its job,
  1588. // we need to set it to C++ for now.
  1589. TracebackTable::LanguageID LanguageIdentifier =
  1590. TracebackTable::CPlusPlus; // C++
  1591. CommentOS << "Language = "
  1592. << getNameForTracebackTableLanguageId(LanguageIdentifier);
  1593. EmitCommentAndValue(LanguageIdentifier, 1);
  1594. // This is only populated for the third and fourth bytes.
  1595. uint32_t FirstHalfOfMandatoryField = 0;
  1596. // Emit the 3rd byte of the mandatory field.
  1597. // We always set traceback offset bit to true.
  1598. FirstHalfOfMandatoryField |= TracebackTable::HasTraceBackTableOffsetMask;
  1599. const PPCFunctionInfo *FI = MF->getInfo<PPCFunctionInfo>();
  1600. const MachineRegisterInfo &MRI = MF->getRegInfo();
  1601. // Check the function uses floating-point processor instructions or not
  1602. for (unsigned Reg = PPC::F0; Reg <= PPC::F31; ++Reg) {
  1603. if (MRI.isPhysRegUsed(Reg)) {
  1604. FirstHalfOfMandatoryField |= TracebackTable::IsFloatingPointPresentMask;
  1605. break;
  1606. }
  1607. }
  1608. #define GENBOOLCOMMENT(Prefix, V, Field) \
  1609. CommentOS << (Prefix) << ((V) & (TracebackTable::Field##Mask) ? "+" : "-") \
  1610. << #Field
  1611. #define GENVALUECOMMENT(PrefixAndName, V, Field) \
  1612. CommentOS << (PrefixAndName) << " = " \
  1613. << static_cast<unsigned>(((V) & (TracebackTable::Field##Mask)) >> \
  1614. (TracebackTable::Field##Shift))
  1615. GENBOOLCOMMENT("", FirstHalfOfMandatoryField, IsGlobaLinkage);
  1616. GENBOOLCOMMENT(", ", FirstHalfOfMandatoryField, IsOutOfLineEpilogOrPrologue);
  1617. EmitComment();
  1618. GENBOOLCOMMENT("", FirstHalfOfMandatoryField, HasTraceBackTableOffset);
  1619. GENBOOLCOMMENT(", ", FirstHalfOfMandatoryField, IsInternalProcedure);
  1620. EmitComment();
  1621. GENBOOLCOMMENT("", FirstHalfOfMandatoryField, HasControlledStorage);
  1622. GENBOOLCOMMENT(", ", FirstHalfOfMandatoryField, IsTOCless);
  1623. EmitComment();
  1624. GENBOOLCOMMENT("", FirstHalfOfMandatoryField, IsFloatingPointPresent);
  1625. EmitComment();
  1626. GENBOOLCOMMENT("", FirstHalfOfMandatoryField,
  1627. IsFloatingPointOperationLogOrAbortEnabled);
  1628. EmitComment();
  1629. OutStreamer->emitIntValueInHexWithPadding(
  1630. (FirstHalfOfMandatoryField & 0x0000ff00) >> 8, 1);
  1631. // Set the 4th byte of the mandatory field.
  1632. FirstHalfOfMandatoryField |= TracebackTable::IsFunctionNamePresentMask;
  1633. static_assert(XCOFF::AllocRegNo == 31, "Unexpected register usage!");
  1634. if (MRI.isPhysRegUsed(Subtarget->isPPC64() ? PPC::X31 : PPC::R31))
  1635. FirstHalfOfMandatoryField |= TracebackTable::IsAllocaUsedMask;
  1636. const SmallVectorImpl<Register> &MustSaveCRs = FI->getMustSaveCRs();
  1637. if (!MustSaveCRs.empty())
  1638. FirstHalfOfMandatoryField |= TracebackTable::IsCRSavedMask;
  1639. if (FI->mustSaveLR())
  1640. FirstHalfOfMandatoryField |= TracebackTable::IsLRSavedMask;
  1641. GENBOOLCOMMENT("", FirstHalfOfMandatoryField, IsInterruptHandler);
  1642. GENBOOLCOMMENT(", ", FirstHalfOfMandatoryField, IsFunctionNamePresent);
  1643. GENBOOLCOMMENT(", ", FirstHalfOfMandatoryField, IsAllocaUsed);
  1644. EmitComment();
  1645. GENVALUECOMMENT("OnConditionDirective", FirstHalfOfMandatoryField,
  1646. OnConditionDirective);
  1647. GENBOOLCOMMENT(", ", FirstHalfOfMandatoryField, IsCRSaved);
  1648. GENBOOLCOMMENT(", ", FirstHalfOfMandatoryField, IsLRSaved);
  1649. EmitComment();
  1650. OutStreamer->emitIntValueInHexWithPadding((FirstHalfOfMandatoryField & 0xff),
  1651. 1);
  1652. // Set the 5th byte of mandatory field.
  1653. uint32_t SecondHalfOfMandatoryField = 0;
  1654. // Always store back chain.
  1655. SecondHalfOfMandatoryField |= TracebackTable::IsBackChainStoredMask;
  1656. uint32_t FPRSaved = 0;
  1657. for (unsigned Reg = PPC::F14; Reg <= PPC::F31; ++Reg) {
  1658. if (MRI.isPhysRegModified(Reg)) {
  1659. FPRSaved = PPC::F31 - Reg + 1;
  1660. break;
  1661. }
  1662. }
  1663. SecondHalfOfMandatoryField |= (FPRSaved << TracebackTable::FPRSavedShift) &
  1664. TracebackTable::FPRSavedMask;
  1665. GENBOOLCOMMENT("", SecondHalfOfMandatoryField, IsBackChainStored);
  1666. GENBOOLCOMMENT(", ", SecondHalfOfMandatoryField, IsFixup);
  1667. GENVALUECOMMENT(", NumOfFPRsSaved", SecondHalfOfMandatoryField, FPRSaved);
  1668. EmitComment();
  1669. OutStreamer->emitIntValueInHexWithPadding(
  1670. (SecondHalfOfMandatoryField & 0xff000000) >> 24, 1);
  1671. // Set the 6th byte of mandatory field.
  1672. bool ShouldEmitEHBlock = TargetLoweringObjectFileXCOFF::ShouldEmitEHBlock(MF);
  1673. if (ShouldEmitEHBlock)
  1674. SecondHalfOfMandatoryField |= TracebackTable::HasExtensionTableMask;
  1675. uint32_t GPRSaved = 0;
  1676. // X13 is reserved under 64-bit environment.
  1677. unsigned GPRBegin = Subtarget->isPPC64() ? PPC::X14 : PPC::R13;
  1678. unsigned GPREnd = Subtarget->isPPC64() ? PPC::X31 : PPC::R31;
  1679. for (unsigned Reg = GPRBegin; Reg <= GPREnd; ++Reg) {
  1680. if (MRI.isPhysRegModified(Reg)) {
  1681. GPRSaved = GPREnd - Reg + 1;
  1682. break;
  1683. }
  1684. }
  1685. SecondHalfOfMandatoryField |= (GPRSaved << TracebackTable::GPRSavedShift) &
  1686. TracebackTable::GPRSavedMask;
  1687. GENBOOLCOMMENT("", SecondHalfOfMandatoryField, HasVectorInfo);
  1688. GENBOOLCOMMENT(", ", SecondHalfOfMandatoryField, HasExtensionTable);
  1689. GENVALUECOMMENT(", NumOfGPRsSaved", SecondHalfOfMandatoryField, GPRSaved);
  1690. EmitComment();
  1691. OutStreamer->emitIntValueInHexWithPadding(
  1692. (SecondHalfOfMandatoryField & 0x00ff0000) >> 16, 1);
  1693. // Set the 7th byte of mandatory field.
  1694. uint32_t NumberOfFixedPara = FI->getFixedParamNum();
  1695. SecondHalfOfMandatoryField |=
  1696. (NumberOfFixedPara << TracebackTable::NumberOfFixedParmsShift) &
  1697. TracebackTable::NumberOfFixedParmsMask;
  1698. GENVALUECOMMENT("NumberOfFixedParms", SecondHalfOfMandatoryField,
  1699. NumberOfFixedParms);
  1700. EmitComment();
  1701. OutStreamer->emitIntValueInHexWithPadding(
  1702. (SecondHalfOfMandatoryField & 0x0000ff00) >> 8, 1);
  1703. // Set the 8th byte of mandatory field.
  1704. // Always set parameter on stack.
  1705. SecondHalfOfMandatoryField |= TracebackTable::HasParmsOnStackMask;
  1706. uint32_t NumberOfFPPara = FI->getFloatingPointParamNum();
  1707. SecondHalfOfMandatoryField |=
  1708. (NumberOfFPPara << TracebackTable::NumberOfFloatingPointParmsShift) &
  1709. TracebackTable::NumberOfFloatingPointParmsMask;
  1710. GENVALUECOMMENT("NumberOfFPParms", SecondHalfOfMandatoryField,
  1711. NumberOfFloatingPointParms);
  1712. GENBOOLCOMMENT(", ", SecondHalfOfMandatoryField, HasParmsOnStack);
  1713. EmitComment();
  1714. OutStreamer->emitIntValueInHexWithPadding(SecondHalfOfMandatoryField & 0xff,
  1715. 1);
  1716. // Generate the optional fields of traceback table.
  1717. // Parameter type.
  1718. if (NumberOfFixedPara || NumberOfFPPara) {
  1719. assert((SecondHalfOfMandatoryField & TracebackTable::HasVectorInfoMask) ==
  1720. 0 &&
  1721. "VectorInfo has not been implemented.");
  1722. uint32_t ParaType = FI->getParameterType();
  1723. CommentOS << "Parameter type = "
  1724. << XCOFF::parseParmsType(ParaType,
  1725. NumberOfFixedPara + NumberOfFPPara);
  1726. EmitComment();
  1727. OutStreamer->emitIntValueInHexWithPadding(ParaType, sizeof(ParaType));
  1728. }
  1729. // Traceback table offset.
  1730. OutStreamer->AddComment("Function size");
  1731. if (FirstHalfOfMandatoryField & TracebackTable::HasTraceBackTableOffsetMask) {
  1732. MCSymbol *FuncSectSym = getObjFileLowering().getFunctionEntryPointSymbol(
  1733. &(MF->getFunction()), TM);
  1734. OutStreamer->emitAbsoluteSymbolDiff(FuncEnd, FuncSectSym, 4);
  1735. }
  1736. // Since we unset the Int_Handler.
  1737. if (FirstHalfOfMandatoryField & TracebackTable::IsInterruptHandlerMask)
  1738. report_fatal_error("Hand_Mask not implement yet");
  1739. if (FirstHalfOfMandatoryField & TracebackTable::HasControlledStorageMask)
  1740. report_fatal_error("Ctl_Info not implement yet");
  1741. if (FirstHalfOfMandatoryField & TracebackTable::IsFunctionNamePresentMask) {
  1742. StringRef Name = MF->getName().substr(0, INT16_MAX);
  1743. int16_t NameLength = Name.size();
  1744. CommentOS << "Function name len = "
  1745. << static_cast<unsigned int>(NameLength);
  1746. EmitCommentAndValue(NameLength, 2);
  1747. OutStreamer->AddComment("Function Name");
  1748. OutStreamer->emitBytes(Name);
  1749. }
  1750. if (FirstHalfOfMandatoryField & TracebackTable::IsAllocaUsedMask) {
  1751. uint8_t AllocReg = XCOFF::AllocRegNo;
  1752. OutStreamer->AddComment("AllocaUsed");
  1753. OutStreamer->emitIntValueInHex(AllocReg, sizeof(AllocReg));
  1754. }
  1755. uint8_t ExtensionTableFlag = 0;
  1756. if (SecondHalfOfMandatoryField & TracebackTable::HasExtensionTableMask) {
  1757. if (ShouldEmitEHBlock)
  1758. ExtensionTableFlag |= ExtendedTBTableFlag::TB_EH_INFO;
  1759. CommentOS << "ExtensionTableFlag = "
  1760. << getExtendedTBTableFlagString(ExtensionTableFlag);
  1761. EmitCommentAndValue(ExtensionTableFlag, sizeof(ExtensionTableFlag));
  1762. }
  1763. if (ExtensionTableFlag & ExtendedTBTableFlag::TB_EH_INFO) {
  1764. auto &Ctx = OutStreamer->getContext();
  1765. MCSymbol *EHInfoSym =
  1766. TargetLoweringObjectFileXCOFF::getEHInfoTableSymbol(MF);
  1767. MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(EHInfoSym);
  1768. const MCSymbol *TOCBaseSym =
  1769. cast<MCSectionXCOFF>(getObjFileLowering().getTOCBaseSection())
  1770. ->getQualNameSymbol();
  1771. const MCExpr *Exp =
  1772. MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCEntry, Ctx),
  1773. MCSymbolRefExpr::create(TOCBaseSym, Ctx), Ctx);
  1774. const DataLayout &DL = getDataLayout();
  1775. OutStreamer->emitValueToAlignment(4);
  1776. OutStreamer->AddComment("EHInfo Table");
  1777. OutStreamer->emitValue(Exp, DL.getPointerSize());
  1778. }
  1779. #undef GENBOOLCOMMENT
  1780. #undef GENVALUECOMMENT
  1781. }
  1782. void PPCAIXAsmPrinter::ValidateGV(const GlobalVariable *GV) {
  1783. // Early error checking limiting what is supported.
  1784. if (GV->isThreadLocal())
  1785. report_fatal_error("Thread local not yet supported on AIX.");
  1786. if (GV->hasComdat())
  1787. report_fatal_error("COMDAT not yet supported by AIX.");
  1788. }
  1789. static bool isSpecialLLVMGlobalArrayToSkip(const GlobalVariable *GV) {
  1790. return GV->hasAppendingLinkage() &&
  1791. StringSwitch<bool>(GV->getName())
  1792. // TODO: Linker could still eliminate the GV if we just skip
  1793. // handling llvm.used array. Skipping them for now until we or the
  1794. // AIX OS team come up with a good solution.
  1795. .Case("llvm.used", true)
  1796. // It's correct to just skip llvm.compiler.used array here.
  1797. .Case("llvm.compiler.used", true)
  1798. .Default(false);
  1799. }
  1800. static bool isSpecialLLVMGlobalArrayForStaticInit(const GlobalVariable *GV) {
  1801. return StringSwitch<bool>(GV->getName())
  1802. .Cases("llvm.global_ctors", "llvm.global_dtors", true)
  1803. .Default(false);
  1804. }
  1805. void PPCAIXAsmPrinter::emitGlobalVariable(const GlobalVariable *GV) {
  1806. // Special LLVM global arrays have been handled at the initialization.
  1807. if (isSpecialLLVMGlobalArrayToSkip(GV) || isSpecialLLVMGlobalArrayForStaticInit(GV))
  1808. return;
  1809. assert(!GV->getName().startswith("llvm.") &&
  1810. "Unhandled intrinsic global variable.");
  1811. ValidateGV(GV);
  1812. MCSymbolXCOFF *GVSym = cast<MCSymbolXCOFF>(getSymbol(GV));
  1813. if (GV->isDeclarationForLinker()) {
  1814. emitLinkage(GV, GVSym);
  1815. return;
  1816. }
  1817. SectionKind GVKind = getObjFileLowering().getKindForGlobal(GV, TM);
  1818. if (!GVKind.isGlobalWriteableData() && !GVKind.isReadOnly())
  1819. report_fatal_error("Encountered a global variable kind that is "
  1820. "not supported yet.");
  1821. MCSectionXCOFF *Csect = cast<MCSectionXCOFF>(
  1822. getObjFileLowering().SectionForGlobal(GV, GVKind, TM));
  1823. // Switch to the containing csect.
  1824. OutStreamer->SwitchSection(Csect);
  1825. const DataLayout &DL = GV->getParent()->getDataLayout();
  1826. // Handle common symbols.
  1827. if (GVKind.isCommon() || GVKind.isBSSLocal()) {
  1828. Align Alignment = GV->getAlign().getValueOr(DL.getPreferredAlign(GV));
  1829. uint64_t Size = DL.getTypeAllocSize(GV->getType()->getElementType());
  1830. GVSym->setStorageClass(
  1831. TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(GV));
  1832. if (GVKind.isBSSLocal())
  1833. OutStreamer->emitXCOFFLocalCommonSymbol(
  1834. OutContext.getOrCreateSymbol(GVSym->getSymbolTableName()), Size,
  1835. GVSym, Alignment.value());
  1836. else
  1837. OutStreamer->emitCommonSymbol(GVSym, Size, Alignment.value());
  1838. return;
  1839. }
  1840. MCSymbol *EmittedInitSym = GVSym;
  1841. emitLinkage(GV, EmittedInitSym);
  1842. emitAlignment(getGVAlignment(GV, DL), GV);
  1843. // When -fdata-sections is enabled, every GlobalVariable will
  1844. // be put into its own csect; therefore, label is not necessary here.
  1845. if (!TM.getDataSections() || GV->hasSection()) {
  1846. OutStreamer->emitLabel(EmittedInitSym);
  1847. }
  1848. // Emit aliasing label for global variable.
  1849. llvm::for_each(GOAliasMap[GV], [this](const GlobalAlias *Alias) {
  1850. OutStreamer->emitLabel(getSymbol(Alias));
  1851. });
  1852. emitGlobalConstant(GV->getParent()->getDataLayout(), GV->getInitializer());
  1853. }
  1854. void PPCAIXAsmPrinter::emitFunctionDescriptor() {
  1855. const DataLayout &DL = getDataLayout();
  1856. const unsigned PointerSize = DL.getPointerSizeInBits() == 64 ? 8 : 4;
  1857. MCSectionSubPair Current = OutStreamer->getCurrentSection();
  1858. // Emit function descriptor.
  1859. OutStreamer->SwitchSection(
  1860. cast<MCSymbolXCOFF>(CurrentFnDescSym)->getRepresentedCsect());
  1861. // Emit aliasing label for function descriptor csect.
  1862. llvm::for_each(GOAliasMap[&MF->getFunction()],
  1863. [this](const GlobalAlias *Alias) {
  1864. OutStreamer->emitLabel(getSymbol(Alias));
  1865. });
  1866. // Emit function entry point address.
  1867. OutStreamer->emitValue(MCSymbolRefExpr::create(CurrentFnSym, OutContext),
  1868. PointerSize);
  1869. // Emit TOC base address.
  1870. const MCSymbol *TOCBaseSym =
  1871. cast<MCSectionXCOFF>(getObjFileLowering().getTOCBaseSection())
  1872. ->getQualNameSymbol();
  1873. OutStreamer->emitValue(MCSymbolRefExpr::create(TOCBaseSym, OutContext),
  1874. PointerSize);
  1875. // Emit a null environment pointer.
  1876. OutStreamer->emitIntValue(0, PointerSize);
  1877. OutStreamer->SwitchSection(Current.first, Current.second);
  1878. }
  1879. void PPCAIXAsmPrinter::emitFunctionEntryLabel() {
  1880. // It's not necessary to emit the label when we have individual
  1881. // function in its own csect.
  1882. if (!TM.getFunctionSections())
  1883. PPCAsmPrinter::emitFunctionEntryLabel();
  1884. // Emit aliasing label for function entry point label.
  1885. llvm::for_each(
  1886. GOAliasMap[&MF->getFunction()], [this](const GlobalAlias *Alias) {
  1887. OutStreamer->emitLabel(
  1888. getObjFileLowering().getFunctionEntryPointSymbol(Alias, TM));
  1889. });
  1890. }
  1891. void PPCAIXAsmPrinter::emitEndOfAsmFile(Module &M) {
  1892. // If there are no functions in this module, we will never need to reference
  1893. // the TOC base.
  1894. if (M.empty())
  1895. return;
  1896. // Switch to section to emit TOC base.
  1897. OutStreamer->SwitchSection(getObjFileLowering().getTOCBaseSection());
  1898. PPCTargetStreamer *TS =
  1899. static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer());
  1900. for (auto &I : TOC) {
  1901. // Setup the csect for the current TC entry.
  1902. MCSectionXCOFF *TCEntry = cast<MCSectionXCOFF>(
  1903. getObjFileLowering().getSectionForTOCEntry(I.first, TM));
  1904. OutStreamer->SwitchSection(TCEntry);
  1905. OutStreamer->emitLabel(I.second);
  1906. if (TS != nullptr)
  1907. TS->emitTCEntry(*I.first);
  1908. }
  1909. }
  1910. bool PPCAIXAsmPrinter::doInitialization(Module &M) {
  1911. const bool Result = PPCAsmPrinter::doInitialization(M);
  1912. auto setCsectAlignment = [this](const GlobalObject *GO) {
  1913. // Declarations have 0 alignment which is set by default.
  1914. if (GO->isDeclarationForLinker())
  1915. return;
  1916. SectionKind GOKind = getObjFileLowering().getKindForGlobal(GO, TM);
  1917. MCSectionXCOFF *Csect = cast<MCSectionXCOFF>(
  1918. getObjFileLowering().SectionForGlobal(GO, GOKind, TM));
  1919. Align GOAlign = getGVAlignment(GO, GO->getParent()->getDataLayout());
  1920. if (GOAlign > Csect->getAlignment())
  1921. Csect->setAlignment(GOAlign);
  1922. };
  1923. // We need to know, up front, the alignment of csects for the assembly path,
  1924. // because once a .csect directive gets emitted, we could not change the
  1925. // alignment value on it.
  1926. for (const auto &G : M.globals()) {
  1927. if (isSpecialLLVMGlobalArrayToSkip(&G))
  1928. continue;
  1929. if (isSpecialLLVMGlobalArrayForStaticInit(&G)) {
  1930. // Generate a format indicator and a unique module id to be a part of
  1931. // the sinit and sterm function names.
  1932. if (FormatIndicatorAndUniqueModId.empty()) {
  1933. std::string UniqueModuleId = getUniqueModuleId(&M);
  1934. if (UniqueModuleId != "")
  1935. // TODO: Use source file full path to generate the unique module id
  1936. // and add a format indicator as a part of function name in case we
  1937. // will support more than one format.
  1938. FormatIndicatorAndUniqueModId = "clang_" + UniqueModuleId.substr(1);
  1939. else
  1940. // Use the Pid and current time as the unique module id when we cannot
  1941. // generate one based on a module's strong external symbols.
  1942. // FIXME: Adjust the comment accordingly after we use source file full
  1943. // path instead.
  1944. FormatIndicatorAndUniqueModId =
  1945. "clangPidTime_" + llvm::itostr(sys::Process::getProcessId()) +
  1946. "_" + llvm::itostr(time(nullptr));
  1947. }
  1948. emitSpecialLLVMGlobal(&G);
  1949. continue;
  1950. }
  1951. setCsectAlignment(&G);
  1952. }
  1953. for (const auto &F : M)
  1954. setCsectAlignment(&F);
  1955. // Construct an aliasing list for each GlobalObject.
  1956. for (const auto &Alias : M.aliases()) {
  1957. const GlobalObject *Base = Alias.getBaseObject();
  1958. if (!Base)
  1959. report_fatal_error(
  1960. "alias without a base object is not yet supported on AIX");
  1961. GOAliasMap[Base].push_back(&Alias);
  1962. }
  1963. return Result;
  1964. }
  1965. void PPCAIXAsmPrinter::emitInstruction(const MachineInstr *MI) {
  1966. switch (MI->getOpcode()) {
  1967. default:
  1968. break;
  1969. case PPC::BL8:
  1970. case PPC::BL:
  1971. case PPC::BL8_NOP:
  1972. case PPC::BL_NOP: {
  1973. const MachineOperand &MO = MI->getOperand(0);
  1974. if (MO.isSymbol()) {
  1975. MCSymbolXCOFF *S =
  1976. cast<MCSymbolXCOFF>(OutContext.getOrCreateSymbol(MO.getSymbolName()));
  1977. ExtSymSDNodeSymbols.insert(S);
  1978. }
  1979. } break;
  1980. case PPC::BL_TLS:
  1981. case PPC::BL8_TLS:
  1982. case PPC::BL8_TLS_:
  1983. case PPC::BL8_NOP_TLS:
  1984. report_fatal_error("TLS call not yet implemented");
  1985. case PPC::TAILB:
  1986. case PPC::TAILB8:
  1987. case PPC::TAILBA:
  1988. case PPC::TAILBA8:
  1989. case PPC::TAILBCTR:
  1990. case PPC::TAILBCTR8:
  1991. if (MI->getOperand(0).isSymbol())
  1992. report_fatal_error("Tail call for extern symbol not yet supported.");
  1993. break;
  1994. }
  1995. return PPCAsmPrinter::emitInstruction(MI);
  1996. }
  1997. bool PPCAIXAsmPrinter::doFinalization(Module &M) {
  1998. for (MCSymbol *Sym : ExtSymSDNodeSymbols)
  1999. OutStreamer->emitSymbolAttribute(Sym, MCSA_Extern);
  2000. return PPCAsmPrinter::doFinalization(M);
  2001. }
  2002. static unsigned mapToSinitPriority(int P) {
  2003. if (P < 0 || P > 65535)
  2004. report_fatal_error("invalid init priority");
  2005. if (P <= 20)
  2006. return P;
  2007. if (P < 81)
  2008. return 20 + (P - 20) * 16;
  2009. if (P <= 1124)
  2010. return 1004 + (P - 81);
  2011. if (P < 64512)
  2012. return 2047 + (P - 1124) * 33878;
  2013. return 2147482625u + (P - 64512);
  2014. }
  2015. static std::string convertToSinitPriority(int Priority) {
  2016. // This helper function converts clang init priority to values used in sinit
  2017. // and sterm functions.
  2018. //
  2019. // The conversion strategies are:
  2020. // We map the reserved clang/gnu priority range [0, 100] into the sinit/sterm
  2021. // reserved priority range [0, 1023] by
  2022. // - directly mapping the first 21 and the last 20 elements of the ranges
  2023. // - linear interpolating the intermediate values with a step size of 16.
  2024. //
  2025. // We map the non reserved clang/gnu priority range of [101, 65535] into the
  2026. // sinit/sterm priority range [1024, 2147483648] by:
  2027. // - directly mapping the first and the last 1024 elements of the ranges
  2028. // - linear interpolating the intermediate values with a step size of 33878.
  2029. unsigned int P = mapToSinitPriority(Priority);
  2030. std::string PrioritySuffix;
  2031. llvm::raw_string_ostream os(PrioritySuffix);
  2032. os << llvm::format_hex_no_prefix(P, 8);
  2033. os.flush();
  2034. return PrioritySuffix;
  2035. }
  2036. void PPCAIXAsmPrinter::emitXXStructorList(const DataLayout &DL,
  2037. const Constant *List, bool IsCtor) {
  2038. SmallVector<Structor, 8> Structors;
  2039. preprocessXXStructorList(DL, List, Structors);
  2040. if (Structors.empty())
  2041. return;
  2042. unsigned Index = 0;
  2043. for (Structor &S : Structors) {
  2044. if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(S.Func))
  2045. S.Func = CE->getOperand(0);
  2046. llvm::GlobalAlias::create(
  2047. GlobalValue::ExternalLinkage,
  2048. (IsCtor ? llvm::Twine("__sinit") : llvm::Twine("__sterm")) +
  2049. llvm::Twine(convertToSinitPriority(S.Priority)) +
  2050. llvm::Twine("_", FormatIndicatorAndUniqueModId) +
  2051. llvm::Twine("_", llvm::utostr(Index++)),
  2052. cast<Function>(S.Func));
  2053. }
  2054. }
  2055. void PPCAIXAsmPrinter::emitTTypeReference(const GlobalValue *GV,
  2056. unsigned Encoding) {
  2057. if (GV) {
  2058. MCSymbol *TypeInfoSym = TM.getSymbol(GV);
  2059. MCSymbol *TOCEntry = lookUpOrCreateTOCEntry(TypeInfoSym);
  2060. const MCSymbol *TOCBaseSym =
  2061. cast<MCSectionXCOFF>(getObjFileLowering().getTOCBaseSection())
  2062. ->getQualNameSymbol();
  2063. auto &Ctx = OutStreamer->getContext();
  2064. const MCExpr *Exp =
  2065. MCBinaryExpr::createSub(MCSymbolRefExpr::create(TOCEntry, Ctx),
  2066. MCSymbolRefExpr::create(TOCBaseSym, Ctx), Ctx);
  2067. OutStreamer->emitValue(Exp, GetSizeOfEncodedValue(Encoding));
  2068. } else
  2069. OutStreamer->emitIntValue(0, GetSizeOfEncodedValue(Encoding));
  2070. }
  2071. // Return a pass that prints the PPC assembly code for a MachineFunction to the
  2072. // given output stream.
  2073. static AsmPrinter *
  2074. createPPCAsmPrinterPass(TargetMachine &tm,
  2075. std::unique_ptr<MCStreamer> &&Streamer) {
  2076. if (tm.getTargetTriple().isOSAIX())
  2077. return new PPCAIXAsmPrinter(tm, std::move(Streamer));
  2078. return new PPCLinuxAsmPrinter(tm, std::move(Streamer));
  2079. }
  2080. // Force static initialization.
  2081. extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializePowerPCAsmPrinter() {
  2082. TargetRegistry::RegisterAsmPrinter(getThePPC32Target(),
  2083. createPPCAsmPrinterPass);
  2084. TargetRegistry::RegisterAsmPrinter(getThePPC32LETarget(),
  2085. createPPCAsmPrinterPass);
  2086. TargetRegistry::RegisterAsmPrinter(getThePPC64Target(),
  2087. createPPCAsmPrinterPass);
  2088. TargetRegistry::RegisterAsmPrinter(getThePPC64LETarget(),
  2089. createPPCAsmPrinterPass);
  2090. }