LLVM 19.0.0git
AsmPrinter.cpp
Go to the documentation of this file.
1//===- AsmPrinter.cpp - Common AsmPrinter code ----------------------------===//
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 implements the AsmPrinter class.
10//
11//===----------------------------------------------------------------------===//
12
14#include "CodeViewDebug.h"
15#include "DwarfDebug.h"
16#include "DwarfException.h"
17#include "PseudoProbePrinter.h"
18#include "WasmException.h"
19#include "WinCFGuard.h"
20#include "WinException.h"
21#include "llvm/ADT/APFloat.h"
22#include "llvm/ADT/APInt.h"
23#include "llvm/ADT/DenseMap.h"
24#include "llvm/ADT/STLExtras.h"
28#include "llvm/ADT/Statistic.h"
30#include "llvm/ADT/StringRef.h"
32#include "llvm/ADT/Twine.h"
64#include "llvm/Config/config.h"
65#include "llvm/IR/BasicBlock.h"
66#include "llvm/IR/Comdat.h"
67#include "llvm/IR/Constant.h"
68#include "llvm/IR/Constants.h"
69#include "llvm/IR/DataLayout.h"
73#include "llvm/IR/Function.h"
74#include "llvm/IR/GCStrategy.h"
75#include "llvm/IR/GlobalAlias.h"
76#include "llvm/IR/GlobalIFunc.h"
78#include "llvm/IR/GlobalValue.h"
80#include "llvm/IR/Instruction.h"
81#include "llvm/IR/Mangler.h"
82#include "llvm/IR/Metadata.h"
83#include "llvm/IR/Module.h"
84#include "llvm/IR/Operator.h"
85#include "llvm/IR/PseudoProbe.h"
86#include "llvm/IR/Type.h"
87#include "llvm/IR/Value.h"
88#include "llvm/IR/ValueHandle.h"
89#include "llvm/MC/MCAsmInfo.h"
90#include "llvm/MC/MCContext.h"
92#include "llvm/MC/MCExpr.h"
93#include "llvm/MC/MCInst.h"
94#include "llvm/MC/MCSection.h"
99#include "llvm/MC/MCStreamer.h"
101#include "llvm/MC/MCSymbol.h"
102#include "llvm/MC/MCSymbolELF.h"
104#include "llvm/MC/MCValue.h"
105#include "llvm/MC/SectionKind.h"
106#include "llvm/Object/ELFTypes.h"
107#include "llvm/Pass.h"
109#include "llvm/Support/Casting.h"
113#include "llvm/Support/Format.h"
115#include "llvm/Support/Path.h"
116#include "llvm/Support/Timer.h"
117#include "llvm/Support/VCSRevision.h"
123#include <algorithm>
124#include <cassert>
125#include <cinttypes>
126#include <cstdint>
127#include <iterator>
128#include <memory>
129#include <optional>
130#include <string>
131#include <utility>
132#include <vector>
133
134using namespace llvm;
135
136#define DEBUG_TYPE "asm-printer"
137
138// This is a replication of fields of object::PGOAnalysisMap::Features. It
139// should match the order of the fields so that
140// `object::PGOAnalysisMap::Features::decode(PgoAnalysisMapFeatures.getBits())`
141// succeeds.
144 BBFreq,
145 BrProb,
146};
148 "pgo-analysis-map", cl::Hidden, cl::CommaSeparated,
150 "func-entry-count", "Function Entry Count"),
152 "Basic Block Frequency"),
154 "Branch Probability")),
155 cl::desc(
156 "Enable extended information within the SHT_LLVM_BB_ADDR_MAP that is "
157 "extracted from PGO related analysis."));
158
159const char DWARFGroupName[] = "dwarf";
160const char DWARFGroupDescription[] = "DWARF Emission";
161const char DbgTimerName[] = "emit";
162const char DbgTimerDescription[] = "Debug Info Emission";
163const char EHTimerName[] = "write_exception";
164const char EHTimerDescription[] = "DWARF Exception Writer";
165const char CFGuardName[] = "Control Flow Guard";
166const char CFGuardDescription[] = "Control Flow Guard";
167const char CodeViewLineTablesGroupName[] = "linetables";
168const char CodeViewLineTablesGroupDescription[] = "CodeView Line Tables";
169const char PPTimerName[] = "emit";
170const char PPTimerDescription[] = "Pseudo Probe Emission";
171const char PPGroupName[] = "pseudo probe";
172const char PPGroupDescription[] = "Pseudo Probe Emission";
173
174STATISTIC(EmittedInsts, "Number of machine instrs printed");
175
176char AsmPrinter::ID = 0;
177
178namespace {
179class AddrLabelMapCallbackPtr final : CallbackVH {
180 AddrLabelMap *Map = nullptr;
181
182public:
183 AddrLabelMapCallbackPtr() = default;
184 AddrLabelMapCallbackPtr(Value *V) : CallbackVH(V) {}
185
186 void setPtr(BasicBlock *BB) {
188 }
189
190 void setMap(AddrLabelMap *map) { Map = map; }
191
192 void deleted() override;
193 void allUsesReplacedWith(Value *V2) override;
194};
195} // namespace
196
198 MCContext &Context;
199 struct AddrLabelSymEntry {
200 /// The symbols for the label.
202
203 Function *Fn; // The containing function of the BasicBlock.
204 unsigned Index; // The index in BBCallbacks for the BasicBlock.
205 };
206
207 DenseMap<AssertingVH<BasicBlock>, AddrLabelSymEntry> AddrLabelSymbols;
208
209 /// Callbacks for the BasicBlock's that we have entries for. We use this so
210 /// we get notified if a block is deleted or RAUWd.
211 std::vector<AddrLabelMapCallbackPtr> BBCallbacks;
212
213 /// This is a per-function list of symbols whose corresponding BasicBlock got
214 /// deleted. These symbols need to be emitted at some point in the file, so
215 /// AsmPrinter emits them after the function body.
216 DenseMap<AssertingVH<Function>, std::vector<MCSymbol *>>
217 DeletedAddrLabelsNeedingEmission;
218
219public:
220 AddrLabelMap(MCContext &context) : Context(context) {}
221
223 assert(DeletedAddrLabelsNeedingEmission.empty() &&
224 "Some labels for deleted blocks never got emitted");
225 }
226
228
230 std::vector<MCSymbol *> &Result);
231
234};
235
237 assert(BB->hasAddressTaken() &&
238 "Shouldn't get label for block without address taken");
239 AddrLabelSymEntry &Entry = AddrLabelSymbols[BB];
240
241 // If we already had an entry for this block, just return it.
242 if (!Entry.Symbols.empty()) {
243 assert(BB->getParent() == Entry.Fn && "Parent changed");
244 return Entry.Symbols;
245 }
246
247 // Otherwise, this is a new entry, create a new symbol for it and add an
248 // entry to BBCallbacks so we can be notified if the BB is deleted or RAUWd.
249 BBCallbacks.emplace_back(BB);
250 BBCallbacks.back().setMap(this);
251 Entry.Index = BBCallbacks.size() - 1;
252 Entry.Fn = BB->getParent();
254 : Context.createTempSymbol();
255 Entry.Symbols.push_back(Sym);
256 return Entry.Symbols;
257}
258
259/// If we have any deleted symbols for F, return them.
261 Function *F, std::vector<MCSymbol *> &Result) {
262 DenseMap<AssertingVH<Function>, std::vector<MCSymbol *>>::iterator I =
263 DeletedAddrLabelsNeedingEmission.find(F);
264
265 // If there are no entries for the function, just return.
266 if (I == DeletedAddrLabelsNeedingEmission.end())
267 return;
268
269 // Otherwise, take the list.
270 std::swap(Result, I->second);
271 DeletedAddrLabelsNeedingEmission.erase(I);
272}
273
274//===- Address of Block Management ----------------------------------------===//
275
278 // Lazily create AddrLabelSymbols.
279 if (!AddrLabelSymbols)
280 AddrLabelSymbols = std::make_unique<AddrLabelMap>(OutContext);
281 return AddrLabelSymbols->getAddrLabelSymbolToEmit(
282 const_cast<BasicBlock *>(BB));
283}
284
286 const Function *F, std::vector<MCSymbol *> &Result) {
287 // If no blocks have had their addresses taken, we're done.
288 if (!AddrLabelSymbols)
289 return;
290 return AddrLabelSymbols->takeDeletedSymbolsForFunction(
291 const_cast<Function *>(F), Result);
292}
293
295 // If the block got deleted, there is no need for the symbol. If the symbol
296 // was already emitted, we can just forget about it, otherwise we need to
297 // queue it up for later emission when the function is output.
298 AddrLabelSymEntry Entry = std::move(AddrLabelSymbols[BB]);
299 AddrLabelSymbols.erase(BB);
300 assert(!Entry.Symbols.empty() && "Didn't have a symbol, why a callback?");
301 BBCallbacks[Entry.Index] = nullptr; // Clear the callback.
302
303#if !LLVM_MEMORY_SANITIZER_BUILD
304 // BasicBlock is destroyed already, so this access is UB detectable by msan.
305 assert((BB->getParent() == nullptr || BB->getParent() == Entry.Fn) &&
306 "Block/parent mismatch");
307#endif
308
309 for (MCSymbol *Sym : Entry.Symbols) {
310 if (Sym->isDefined())
311 return;
312
313 // If the block is not yet defined, we need to emit it at the end of the
314 // function. Add the symbol to the DeletedAddrLabelsNeedingEmission list
315 // for the containing Function. Since the block is being deleted, its
316 // parent may already be removed, we have to get the function from 'Entry'.
317 DeletedAddrLabelsNeedingEmission[Entry.Fn].push_back(Sym);
318 }
319}
320
322 // Get the entry for the RAUW'd block and remove it from our map.
323 AddrLabelSymEntry OldEntry = std::move(AddrLabelSymbols[Old]);
324 AddrLabelSymbols.erase(Old);
325 assert(!OldEntry.Symbols.empty() && "Didn't have a symbol, why a callback?");
326
327 AddrLabelSymEntry &NewEntry = AddrLabelSymbols[New];
328
329 // If New is not address taken, just move our symbol over to it.
330 if (NewEntry.Symbols.empty()) {
331 BBCallbacks[OldEntry.Index].setPtr(New); // Update the callback.
332 NewEntry = std::move(OldEntry); // Set New's entry.
333 return;
334 }
335
336 BBCallbacks[OldEntry.Index] = nullptr; // Update the callback.
337
338 // Otherwise, we need to add the old symbols to the new block's set.
339 llvm::append_range(NewEntry.Symbols, OldEntry.Symbols);
340}
341
342void AddrLabelMapCallbackPtr::deleted() {
343 Map->UpdateForDeletedBlock(cast<BasicBlock>(getValPtr()));
344}
345
346void AddrLabelMapCallbackPtr::allUsesReplacedWith(Value *V2) {
347 Map->UpdateForRAUWBlock(cast<BasicBlock>(getValPtr()), cast<BasicBlock>(V2));
348}
349
350/// getGVAlignment - Return the alignment to use for the specified global
351/// value. This rounds up to the preferred alignment if possible and legal.
353 Align InAlign) {
354 Align Alignment;
355 if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV))
356 Alignment = DL.getPreferredAlign(GVar);
357
358 // If InAlign is specified, round it to it.
359 if (InAlign > Alignment)
360 Alignment = InAlign;
361
362 // If the GV has a specified alignment, take it into account.
363 const MaybeAlign GVAlign(GV->getAlign());
364 if (!GVAlign)
365 return Alignment;
366
367 assert(GVAlign && "GVAlign must be set");
368
369 // If the GVAlign is larger than NumBits, or if we are required to obey
370 // NumBits because the GV has an assigned section, obey it.
371 if (*GVAlign > Alignment || GV->hasSection())
372 Alignment = *GVAlign;
373 return Alignment;
374}
375
376AsmPrinter::AsmPrinter(TargetMachine &tm, std::unique_ptr<MCStreamer> Streamer)
377 : MachineFunctionPass(ID), TM(tm), MAI(tm.getMCAsmInfo()),
378 OutContext(Streamer->getContext()), OutStreamer(std::move(Streamer)),
379 SM(*this) {
380 VerboseAsm = OutStreamer->isVerboseAsm();
381 DwarfUsesRelocationsAcrossSections =
383}
384
386 assert(!DD && Handlers.size() == NumUserHandlers &&
387 "Debug/EH info didn't get finalized");
388}
389
391 return TM.isPositionIndependent();
392}
393
394/// getFunctionNumber - Return a unique ID for the current function.
396 return MF->getFunctionNumber();
397}
398
400 return *TM.getObjFileLowering();
401}
402
404 assert(MMI && "MMI could not be nullptr!");
405 return MMI->getModule()->getDataLayout();
406}
407
408// Do not use the cached DataLayout because some client use it without a Module
409// (dsymutil, llvm-dwarfdump).
411 return TM.getPointerSize(0); // FIXME: Default address space
412}
413
415 assert(MF && "getSubtargetInfo requires a valid MachineFunction!");
417}
418
421}
422
424 if (DD) {
425 assert(OutStreamer->hasRawTextSupport() &&
426 "Expected assembly output mode.");
427 // This is NVPTX specific and it's unclear why.
428 // PR51079: If we have code without debug information we need to give up.
430 if (!MFSP)
431 return;
432 (void)DD->emitInitialLocDirective(MF, /*CUID=*/0);
433 }
434}
435
436/// getCurrentSection() - Return the current section we are emitting to.
438 return OutStreamer->getCurrentSectionOnly();
439}
440
442 AU.setPreservesAll();
448}
449
451 auto *MMIWP = getAnalysisIfAvailable<MachineModuleInfoWrapperPass>();
452 MMI = MMIWP ? &MMIWP->getMMI() : nullptr;
453 HasSplitStack = false;
454 HasNoSplitStack = false;
455
456 AddrLabelSymbols = nullptr;
457
458 // Initialize TargetLoweringObjectFile.
460 .Initialize(OutContext, TM);
461
463 .getModuleMetadata(M);
464
465 // On AIX, we delay emitting any section information until
466 // after emitting the .file pseudo-op. This allows additional
467 // information (such as the embedded command line) to be associated
468 // with all sections in the object file rather than a single section.
470 OutStreamer->initSections(false, *TM.getMCSubtargetInfo());
471
472 // Emit the version-min deployment target directive if needed.
473 //
474 // FIXME: If we end up with a collection of these sorts of Darwin-specific
475 // or ELF-specific things, it may make sense to have a platform helper class
476 // that will work with the target helper class. For now keep it here, as the
477 // alternative is duplicated code in each of the target asm printers that
478 // use the directive, where it would need the same conditionalization
479 // anyway.
480 const Triple &Target = TM.getTargetTriple();
481 if (Target.isOSBinFormatMachO() && Target.isOSDarwin()) {
482 Triple TVT(M.getDarwinTargetVariantTriple());
483 OutStreamer->emitVersionForTarget(
484 Target, M.getSDKVersion(),
485 M.getDarwinTargetVariantTriple().empty() ? nullptr : &TVT,
486 M.getDarwinTargetVariantSDKVersion());
487 }
488
489 // Allow the target to emit any magic that it wants at the start of the file.
491
492 // Very minimal debug info. It is ignored if we emit actual debug info. If we
493 // don't, this at least helps the user find where a global came from.
495 // .file "foo.c"
496
497 SmallString<128> FileName;
499 FileName = llvm::sys::path::filename(M.getSourceFileName());
500 else
501 FileName = M.getSourceFileName();
502 if (MAI->hasFourStringsDotFile()) {
503 const char VerStr[] =
504#ifdef PACKAGE_VENDOR
505 PACKAGE_VENDOR " "
506#endif
507 PACKAGE_NAME " version " PACKAGE_VERSION
508#ifdef LLVM_REVISION
509 " (" LLVM_REVISION ")"
510#endif
511 ;
512 // TODO: Add timestamp and description.
513 OutStreamer->emitFileDirective(FileName, VerStr, "", "");
514 } else {
515 OutStreamer->emitFileDirective(FileName);
516 }
517 }
518
519 // On AIX, emit bytes for llvm.commandline metadata after .file so that the
520 // C_INFO symbol is preserved if any csect is kept by the linker.
522 emitModuleCommandLines(M);
523 // Now we can generate section information.
524 OutStreamer->initSections(false, *TM.getMCSubtargetInfo());
525
526 // To work around an AIX assembler and/or linker bug, generate
527 // a rename for the default text-section symbol name. This call has
528 // no effect when generating object code directly.
529 MCSection *TextSection =
530 OutStreamer->getContext().getObjectFileInfo()->getTextSection();
531 MCSymbolXCOFF *XSym =
532 static_cast<MCSectionXCOFF *>(TextSection)->getQualNameSymbol();
533 if (XSym->hasRename())
534 OutStreamer->emitXCOFFRenameDirective(XSym, XSym->getSymbolTableName());
535 }
536
537 GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
538 assert(MI && "AsmPrinter didn't require GCModuleInfo?");
539 for (const auto &I : *MI)
540 if (GCMetadataPrinter *MP = getOrCreateGCPrinter(*I))
541 MP->beginAssembly(M, *MI, *this);
542
543 // Emit module-level inline asm if it exists.
544 if (!M.getModuleInlineAsm().empty()) {
545 OutStreamer->AddComment("Start of file scope inline assembly");
546 OutStreamer->addBlankLine();
547 emitInlineAsm(
548 M.getModuleInlineAsm() + "\n", *TM.getMCSubtargetInfo(),
549 TM.Options.MCOptions, nullptr,
551 OutStreamer->AddComment("End of file scope inline assembly");
552 OutStreamer->addBlankLine();
553 }
554
556 bool EmitCodeView = M.getCodeViewFlag();
557 if (EmitCodeView && TM.getTargetTriple().isOSWindows()) {
558 Handlers.emplace_back(std::make_unique<CodeViewDebug>(this),
562 }
563 if (!EmitCodeView || M.getDwarfVersion()) {
564 assert(MMI && "MMI could not be nullptr here!");
565 if (MMI->hasDebugInfo()) {
566 DD = new DwarfDebug(this);
567 Handlers.emplace_back(std::unique_ptr<DwarfDebug>(DD), DbgTimerName,
570 }
571 }
572 }
573
574 if (M.getNamedMetadata(PseudoProbeDescMetadataName)) {
575 PP = new PseudoProbeHandler(this);
576 Handlers.emplace_back(std::unique_ptr<PseudoProbeHandler>(PP), PPTimerName,
578 }
579
580 switch (MAI->getExceptionHandlingType()) {
582 // We may want to emit CFI for debug.
583 [[fallthrough]];
587 for (auto &F : M.getFunctionList()) {
589 ModuleCFISection = getFunctionCFISectionType(F);
590 // If any function needsUnwindTableEntry(), it needs .eh_frame and hence
591 // the module needs .eh_frame. If we have found that case, we are done.
592 if (ModuleCFISection == CFISection::EH)
593 break;
594 }
596 usesCFIWithoutEH() || ModuleCFISection != CFISection::EH);
597 break;
598 default:
599 break;
600 }
601
602 EHStreamer *ES = nullptr;
603 switch (MAI->getExceptionHandlingType()) {
605 if (!usesCFIWithoutEH())
606 break;
607 [[fallthrough]];
611 ES = new DwarfCFIException(this);
612 break;
614 ES = new ARMException(this);
615 break;
617 switch (MAI->getWinEHEncodingType()) {
618 default: llvm_unreachable("unsupported unwinding information encoding");
620 break;
623 ES = new WinException(this);
624 break;
625 }
626 break;
628 ES = new WasmException(this);
629 break;
631 ES = new AIXException(this);
632 break;
633 }
634 if (ES)
635 Handlers.emplace_back(std::unique_ptr<EHStreamer>(ES), EHTimerName,
638
639 // Emit tables for any value of cfguard flag (i.e. cfguard=1 or cfguard=2).
640 if (mdconst::extract_or_null<ConstantInt>(M.getModuleFlag("cfguard")))
641 Handlers.emplace_back(std::make_unique<WinCFGuard>(this), CFGuardName,
644
645 for (const HandlerInfo &HI : Handlers) {
646 NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
647 HI.TimerGroupDescription, TimePassesIsEnabled);
648 HI.Handler->beginModule(&M);
649 }
650
651 return false;
652}
653
654static bool canBeHidden(const GlobalValue *GV, const MCAsmInfo &MAI) {
656 return false;
657
658 return GV->canBeOmittedFromSymbolTable();
659}
660
661void AsmPrinter::emitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const {
663 switch (Linkage) {
669 if (MAI->hasWeakDefDirective()) {
670 // .globl _foo
671 OutStreamer->emitSymbolAttribute(GVSym, MCSA_Global);
672
673 if (!canBeHidden(GV, *MAI))
674 // .weak_definition _foo
675 OutStreamer->emitSymbolAttribute(GVSym, MCSA_WeakDefinition);
676 else
677 OutStreamer->emitSymbolAttribute(GVSym, MCSA_WeakDefAutoPrivate);
678 } else if (MAI->avoidWeakIfComdat() && GV->hasComdat()) {
679 // .globl _foo
680 OutStreamer->emitSymbolAttribute(GVSym, MCSA_Global);
681 //NOTE: linkonce is handled by the section the symbol was assigned to.
682 } else {
683 // .weak _foo
684 OutStreamer->emitSymbolAttribute(GVSym, MCSA_Weak);
685 }
686 return;
688 OutStreamer->emitSymbolAttribute(GVSym, MCSA_Global);
689 return;
692 return;
696 llvm_unreachable("Should never emit this");
697 }
698 llvm_unreachable("Unknown linkage type!");
699}
700
702 const GlobalValue *GV) const {
703 TM.getNameWithPrefix(Name, GV, getObjFileLowering().getMangler());
704}
705
707 return TM.getSymbol(GV);
708}
709
711 // On ELF, use .Lfoo$local if GV is a non-interposable GlobalObject with an
712 // exact definion (intersection of GlobalValue::hasExactDefinition() and
713 // !isInterposable()). These linkages include: external, appending, internal,
714 // private. It may be profitable to use a local alias for external. The
715 // assembler would otherwise be conservative and assume a global default
716 // visibility symbol can be interposable, even if the code generator already
717 // assumed it.
719 const Module &M = *GV.getParent();
721 M.getPIELevel() == PIELevel::Default && GV.isDSOLocal())
722 return getSymbolWithGlobalValueBase(&GV, "$local");
723 }
724 return TM.getSymbol(&GV);
725}
726
727/// EmitGlobalVariable - Emit the specified global variable to the .s file.
729 bool IsEmuTLSVar = TM.useEmulatedTLS() && GV->isThreadLocal();
730 assert(!(IsEmuTLSVar && GV->hasCommonLinkage()) &&
731 "No emulated TLS variables in the common section");
732
733 // Never emit TLS variable xyz in emulated TLS model.
734 // The initialization value is in __emutls_t.xyz instead of xyz.
735 if (IsEmuTLSVar)
736 return;
737
738 if (GV->hasInitializer()) {
739 // Check to see if this is a special global used by LLVM, if so, emit it.
740 if (emitSpecialLLVMGlobal(GV))
741 return;
742
743 // Skip the emission of global equivalents. The symbol can be emitted later
744 // on by emitGlobalGOTEquivs in case it turns out to be needed.
745 if (GlobalGOTEquivs.count(getSymbol(GV)))
746 return;
747
748 if (isVerbose()) {
749 // When printing the control variable __emutls_v.*,
750 // we don't need to print the original TLS variable name.
751 GV->printAsOperand(OutStreamer->getCommentOS(),
752 /*PrintType=*/false, GV->getParent());
753 OutStreamer->getCommentOS() << '\n';
754 }
755 }
756
757 MCSymbol *GVSym = getSymbol(GV);
758 MCSymbol *EmittedSym = GVSym;
759
760 // getOrCreateEmuTLSControlSym only creates the symbol with name and default
761 // attributes.
762 // GV's or GVSym's attributes will be used for the EmittedSym.
763 emitVisibility(EmittedSym, GV->getVisibility(), !GV->isDeclaration());
764
765 if (GV->isTagged()) {
767
768 if (T.getArch() != Triple::aarch64 || !T.isAndroid())
770 "tagged symbols (-fsanitize=memtag-globals) are "
771 "only supported on AArch64 Android");
772 OutStreamer->emitSymbolAttribute(EmittedSym, MAI->getMemtagAttr());
773 }
774
775 if (!GV->hasInitializer()) // External globals require no extra code.
776 return;
777
778 GVSym->redefineIfPossible();
779 if (GVSym->isDefined() || GVSym->isVariable())
780 OutContext.reportError(SMLoc(), "symbol '" + Twine(GVSym->getName()) +
781 "' is already defined");
782
784 OutStreamer->emitSymbolAttribute(EmittedSym, MCSA_ELF_TypeObject);
785
787
788 const DataLayout &DL = GV->getDataLayout();
789 uint64_t Size = DL.getTypeAllocSize(GV->getValueType());
790
791 // If the alignment is specified, we *must* obey it. Overaligning a global
792 // with a specified alignment is a prompt way to break globals emitted to
793 // sections and expected to be contiguous (e.g. ObjC metadata).
794 const Align Alignment = getGVAlignment(GV, DL);
795
796 for (const HandlerInfo &HI : Handlers) {
797 NamedRegionTimer T(HI.TimerName, HI.TimerDescription,
798 HI.TimerGroupName, HI.TimerGroupDescription,
800 HI.Handler->setSymbolSize(GVSym, Size);
801 }
802
803 // Handle common symbols
804 if (GVKind.isCommon()) {
805 if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it.
806 // .comm _foo, 42, 4
807 OutStreamer->emitCommonSymbol(GVSym, Size, Alignment);
808 return;
809 }
810
811 // Determine to which section this global should be emitted.
812 MCSection *TheSection = getObjFileLowering().SectionForGlobal(GV, GVKind, TM);
813
814 // If we have a bss global going to a section that supports the
815 // zerofill directive, do so here.
816 if (GVKind.isBSS() && MAI->hasMachoZeroFillDirective() &&
817 TheSection->isVirtualSection()) {
818 if (Size == 0)
819 Size = 1; // zerofill of 0 bytes is undefined.
820 emitLinkage(GV, GVSym);
821 // .zerofill __DATA, __bss, _foo, 400, 5
822 OutStreamer->emitZerofill(TheSection, GVSym, Size, Alignment);
823 return;
824 }
825
826 // If this is a BSS local symbol and we are emitting in the BSS
827 // section use .lcomm/.comm directive.
828 if (GVKind.isBSSLocal() &&
829 getObjFileLowering().getBSSSection() == TheSection) {
830 if (Size == 0)
831 Size = 1; // .comm Foo, 0 is undefined, avoid it.
832
833 // Use .lcomm only if it supports user-specified alignment.
834 // Otherwise, while it would still be correct to use .lcomm in some
835 // cases (e.g. when Align == 1), the external assembler might enfore
836 // some -unknown- default alignment behavior, which could cause
837 // spurious differences between external and integrated assembler.
838 // Prefer to simply fall back to .local / .comm in this case.
840 // .lcomm _foo, 42
841 OutStreamer->emitLocalCommonSymbol(GVSym, Size, Alignment);
842 return;
843 }
844
845 // .local _foo
846 OutStreamer->emitSymbolAttribute(GVSym, MCSA_Local);
847 // .comm _foo, 42, 4
848 OutStreamer->emitCommonSymbol(GVSym, Size, Alignment);
849 return;
850 }
851
852 // Handle thread local data for mach-o which requires us to output an
853 // additional structure of data and mangle the original symbol so that we
854 // can reference it later.
855 //
856 // TODO: This should become an "emit thread local global" method on TLOF.
857 // All of this macho specific stuff should be sunk down into TLOFMachO and
858 // stuff like "TLSExtraDataSection" should no longer be part of the parent
859 // TLOF class. This will also make it more obvious that stuff like
860 // MCStreamer::EmitTBSSSymbol is macho specific and only called from macho
861 // specific code.
862 if (GVKind.isThreadLocal() && MAI->hasMachoTBSSDirective()) {
863 // Emit the .tbss symbol
864 MCSymbol *MangSym =
865 OutContext.getOrCreateSymbol(GVSym->getName() + Twine("$tlv$init"));
866
867 if (GVKind.isThreadBSS()) {
868 TheSection = getObjFileLowering().getTLSBSSSection();
869 OutStreamer->emitTBSSSymbol(TheSection, MangSym, Size, Alignment);
870 } else if (GVKind.isThreadData()) {
871 OutStreamer->switchSection(TheSection);
872
873 emitAlignment(Alignment, GV);
874 OutStreamer->emitLabel(MangSym);
875
877 GV->getInitializer());
878 }
879
880 OutStreamer->addBlankLine();
881
882 // Emit the variable struct for the runtime.
884
885 OutStreamer->switchSection(TLVSect);
886 // Emit the linkage here.
887 emitLinkage(GV, GVSym);
888 OutStreamer->emitLabel(GVSym);
889
890 // Three pointers in size:
891 // - __tlv_bootstrap - used to make sure support exists
892 // - spare pointer, used when mapped by the runtime
893 // - pointer to mangled symbol above with initializer
894 unsigned PtrSize = DL.getPointerTypeSize(GV->getType());
895 OutStreamer->emitSymbolValue(GetExternalSymbolSymbol("_tlv_bootstrap"),
896 PtrSize);
897 OutStreamer->emitIntValue(0, PtrSize);
898 OutStreamer->emitSymbolValue(MangSym, PtrSize);
899
900 OutStreamer->addBlankLine();
901 return;
902 }
903
904 MCSymbol *EmittedInitSym = GVSym;
905
906 OutStreamer->switchSection(TheSection);
907
908 emitLinkage(GV, EmittedInitSym);
909 emitAlignment(Alignment, GV);
910
911 OutStreamer->emitLabel(EmittedInitSym);
912 MCSymbol *LocalAlias = getSymbolPreferLocal(*GV);
913 if (LocalAlias != EmittedInitSym)
914 OutStreamer->emitLabel(LocalAlias);
915
917
919 // .size foo, 42
920 OutStreamer->emitELFSize(EmittedInitSym,
922
923 OutStreamer->addBlankLine();
924}
925
926/// Emit the directive and value for debug thread local expression
927///
928/// \p Value - The value to emit.
929/// \p Size - The size of the integer (in bytes) to emit.
930void AsmPrinter::emitDebugValue(const MCExpr *Value, unsigned Size) const {
931 OutStreamer->emitValue(Value, Size);
932}
933
934void AsmPrinter::emitFunctionHeaderComment() {}
935
936void AsmPrinter::emitFunctionPrefix(ArrayRef<const Constant *> Prefix) {
937 const Function &F = MF->getFunction();
939 for (auto &C : Prefix)
940 emitGlobalConstant(F.getDataLayout(), C);
941 return;
942 }
943 // Preserving prefix-like data on platforms which use subsections-via-symbols
944 // is a bit tricky. Here we introduce a symbol for the prefix-like data
945 // and use the .alt_entry attribute to mark the function's real entry point
946 // as an alternative entry point to the symbol that precedes the function..
948
949 for (auto &C : Prefix) {
950 emitGlobalConstant(F.getDataLayout(), C);
951 }
952
953 // Emit an .alt_entry directive for the actual function symbol.
954 OutStreamer->emitSymbolAttribute(CurrentFnSym, MCSA_AltEntry);
955}
956
957/// EmitFunctionHeader - This method emits the header for the current
958/// function.
959void AsmPrinter::emitFunctionHeader() {
960 const Function &F = MF->getFunction();
961
962 if (isVerbose())
963 OutStreamer->getCommentOS()
964 << "-- Begin function "
965 << GlobalValue::dropLLVMManglingEscape(F.getName()) << '\n';
966
967 // Print out constants referenced by the function
969
970 // Print the 'header' of function.
971 // If basic block sections are desired, explicitly request a unique section
972 // for this function's entry block.
973 if (MF->front().isBeginSection())
974 MF->setSection(getObjFileLowering().getUniqueSectionForFunction(F, TM));
975 else
976 MF->setSection(getObjFileLowering().SectionForGlobal(&F, TM));
977 OutStreamer->switchSection(MF->getSection());
978
980 emitVisibility(CurrentFnSym, F.getVisibility());
981
984
988
990 OutStreamer->emitSymbolAttribute(CurrentFnSym, MCSA_ELF_TypeFunction);
991
992 if (F.hasFnAttribute(Attribute::Cold))
993 OutStreamer->emitSymbolAttribute(CurrentFnSym, MCSA_Cold);
994
995 // Emit the prefix data.
996 if (F.hasPrefixData())
997 emitFunctionPrefix({F.getPrefixData()});
998
999 // Emit KCFI type information before patchable-function-prefix nops.
1001
1002 // Emit M NOPs for -fpatchable-function-entry=N,M where M>0. We arbitrarily
1003 // place prefix data before NOPs.
1004 unsigned PatchableFunctionPrefix = 0;
1005 unsigned PatchableFunctionEntry = 0;
1006 (void)F.getFnAttribute("patchable-function-prefix")
1007 .getValueAsString()
1008 .getAsInteger(10, PatchableFunctionPrefix);
1009 (void)F.getFnAttribute("patchable-function-entry")
1010 .getValueAsString()
1011 .getAsInteger(10, PatchableFunctionEntry);
1012 if (PatchableFunctionPrefix) {
1016 emitNops(PatchableFunctionPrefix);
1017 } else if (PatchableFunctionEntry) {
1018 // May be reassigned when emitting the body, to reference the label after
1019 // the initial BTI (AArch64) or endbr32/endbr64 (x86).
1021 }
1022
1023 // Emit the function prologue data for the indirect call sanitizer.
1024 if (const MDNode *MD = F.getMetadata(LLVMContext::MD_func_sanitize)) {
1025 assert(MD->getNumOperands() == 2);
1026
1027 auto *PrologueSig = mdconst::extract<Constant>(MD->getOperand(0));
1028 auto *TypeHash = mdconst::extract<Constant>(MD->getOperand(1));
1029 emitFunctionPrefix({PrologueSig, TypeHash});
1030 }
1031
1032 if (isVerbose()) {
1033 F.printAsOperand(OutStreamer->getCommentOS(),
1034 /*PrintType=*/false, F.getParent());
1035 emitFunctionHeaderComment();
1036 OutStreamer->getCommentOS() << '\n';
1037 }
1038
1039 // Emit the function descriptor. This is a virtual function to allow targets
1040 // to emit their specific function descriptor. Right now it is only used by
1041 // the AIX target. The PowerPC 64-bit V1 ELF target also uses function
1042 // descriptors and should be converted to use this hook as well.
1045
1046 // Emit the CurrentFnSym. This is a virtual function to allow targets to do
1047 // their wild and crazy things as required.
1049
1050 // If the function had address-taken blocks that got deleted, then we have
1051 // references to the dangling symbols. Emit them at the start of the function
1052 // so that we don't get references to undefined symbols.
1053 std::vector<MCSymbol*> DeadBlockSyms;
1054 takeDeletedSymbolsForFunction(&F, DeadBlockSyms);
1055 for (MCSymbol *DeadBlockSym : DeadBlockSyms) {
1056 OutStreamer->AddComment("Address taken block that was later removed");
1057 OutStreamer->emitLabel(DeadBlockSym);
1058 }
1059
1060 if (CurrentFnBegin) {
1063 OutStreamer->emitLabel(CurPos);
1064 OutStreamer->emitAssignment(CurrentFnBegin,
1066 } else {
1067 OutStreamer->emitLabel(CurrentFnBegin);
1068 }
1069 }
1070
1071 // Emit pre-function debug and/or EH information.
1072 for (const HandlerInfo &HI : Handlers) {
1073 NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
1074 HI.TimerGroupDescription, TimePassesIsEnabled);
1075 HI.Handler->beginFunction(MF);
1076 }
1077 for (const HandlerInfo &HI : Handlers) {
1078 NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
1079 HI.TimerGroupDescription, TimePassesIsEnabled);
1080 HI.Handler->beginBasicBlockSection(MF->front());
1081 }
1082
1083 // Emit the prologue data.
1084 if (F.hasPrologueData())
1085 emitGlobalConstant(F.getDataLayout(), F.getPrologueData());
1086}
1087
1088/// EmitFunctionEntryLabel - Emit the label that is the entrypoint for the
1089/// function. This can be overridden by targets as required to do custom stuff.
1092
1093 // The function label could have already been emitted if two symbols end up
1094 // conflicting due to asm renaming. Detect this and emit an error.
1095 if (CurrentFnSym->isVariable())
1097 "' is a protected alias");
1098
1099 OutStreamer->emitLabel(CurrentFnSym);
1100
1103 if (Sym != CurrentFnSym) {
1104 cast<MCSymbolELF>(Sym)->setType(ELF::STT_FUNC);
1106 OutStreamer->emitLabel(Sym);
1108 OutStreamer->emitSymbolAttribute(Sym, MCSA_ELF_TypeFunction);
1109 }
1110 }
1111}
1112
1113/// emitComments - Pretty-print comments for instructions.
1114static void emitComments(const MachineInstr &MI, raw_ostream &CommentOS) {
1115 const MachineFunction *MF = MI.getMF();
1117
1118 // Check for spills and reloads
1119
1120 // We assume a single instruction only has a spill or reload, not
1121 // both.
1122 std::optional<LocationSize> Size;
1123 if ((Size = MI.getRestoreSize(TII))) {
1124 CommentOS << Size->getValue() << "-byte Reload\n";
1125 } else if ((Size = MI.getFoldedRestoreSize(TII))) {
1126 if (!Size->hasValue())
1127 CommentOS << "Unknown-size Folded Reload\n";
1128 else if (Size->getValue())
1129 CommentOS << Size->getValue() << "-byte Folded Reload\n";
1130 } else if ((Size = MI.getSpillSize(TII))) {
1131 CommentOS << Size->getValue() << "-byte Spill\n";
1132 } else if ((Size = MI.getFoldedSpillSize(TII))) {
1133 if (!Size->hasValue())
1134 CommentOS << "Unknown-size Folded Spill\n";
1135 else if (Size->getValue())
1136 CommentOS << Size->getValue() << "-byte Folded Spill\n";
1137 }
1138
1139 // Check for spill-induced copies
1140 if (MI.getAsmPrinterFlag(MachineInstr::ReloadReuse))
1141 CommentOS << " Reload Reuse\n";
1142}
1143
1144/// emitImplicitDef - This method emits the specified machine instruction
1145/// that is an implicit def.
1147 Register RegNo = MI->getOperand(0).getReg();
1148
1149 SmallString<128> Str;
1151 OS << "implicit-def: "
1152 << printReg(RegNo, MF->getSubtarget().getRegisterInfo());
1153
1154 OutStreamer->AddComment(OS.str());
1155 OutStreamer->addBlankLine();
1156}
1157
1158static void emitKill(const MachineInstr *MI, AsmPrinter &AP) {
1159 std::string Str;
1161 OS << "kill:";
1162 for (const MachineOperand &Op : MI->operands()) {
1163 assert(Op.isReg() && "KILL instruction must have only register operands");
1164 OS << ' ' << (Op.isDef() ? "def " : "killed ")
1165 << printReg(Op.getReg(), AP.MF->getSubtarget().getRegisterInfo());
1166 }
1167 AP.OutStreamer->AddComment(OS.str());
1168 AP.OutStreamer->addBlankLine();
1169}
1170
1171/// emitDebugValueComment - This method handles the target-independent form
1172/// of DBG_VALUE, returning true if it was able to do so. A false return
1173/// means the target will need to handle MI in EmitInstruction.
1175 // This code handles only the 4-operand target-independent form.
1176 if (MI->isNonListDebugValue() && MI->getNumOperands() != 4)
1177 return false;
1178
1179 SmallString<128> Str;
1181 OS << "DEBUG_VALUE: ";
1182
1183 const DILocalVariable *V = MI->getDebugVariable();
1184 if (auto *SP = dyn_cast<DISubprogram>(V->getScope())) {
1185 StringRef Name = SP->getName();
1186 if (!Name.empty())
1187 OS << Name << ":";
1188 }
1189 OS << V->getName();
1190 OS << " <- ";
1191
1192 const DIExpression *Expr = MI->getDebugExpression();
1193 // First convert this to a non-variadic expression if possible, to simplify
1194 // the output.
1195 if (auto NonVariadicExpr = DIExpression::convertToNonVariadicExpression(Expr))
1196 Expr = *NonVariadicExpr;
1197 // Then, output the possibly-simplified expression.
1198 if (Expr->getNumElements()) {
1199 OS << '[';
1200 ListSeparator LS;
1201 for (auto &Op : Expr->expr_ops()) {
1202 OS << LS << dwarf::OperationEncodingString(Op.getOp());
1203 for (unsigned I = 0; I < Op.getNumArgs(); ++I)
1204 OS << ' ' << Op.getArg(I);
1205 }
1206 OS << "] ";
1207 }
1208
1209 // Register or immediate value. Register 0 means undef.
1210 for (const MachineOperand &Op : MI->debug_operands()) {
1211 if (&Op != MI->debug_operands().begin())
1212 OS << ", ";
1213 switch (Op.getType()) {
1215 APFloat APF = APFloat(Op.getFPImm()->getValueAPF());
1216 Type *ImmTy = Op.getFPImm()->getType();
1217 if (ImmTy->isBFloatTy() || ImmTy->isHalfTy() || ImmTy->isFloatTy() ||
1218 ImmTy->isDoubleTy()) {
1219 OS << APF.convertToDouble();
1220 } else {
1221 // There is no good way to print long double. Convert a copy to
1222 // double. Ah well, it's only a comment.
1223 bool ignored;
1225 &ignored);
1226 OS << "(long double) " << APF.convertToDouble();
1227 }
1228 break;
1229 }
1231 OS << Op.getImm();
1232 break;
1233 }
1235 Op.getCImm()->getValue().print(OS, false /*isSigned*/);
1236 break;
1237 }
1239 OS << "!target-index(" << Op.getIndex() << "," << Op.getOffset() << ")";
1240 break;
1241 }
1244 Register Reg;
1245 std::optional<StackOffset> Offset;
1246 if (Op.isReg()) {
1247 Reg = Op.getReg();
1248 } else {
1249 const TargetFrameLowering *TFI =
1251 Offset = TFI->getFrameIndexReference(*AP.MF, Op.getIndex(), Reg);
1252 }
1253 if (!Reg) {
1254 // Suppress offset, it is not meaningful here.
1255 OS << "undef";
1256 break;
1257 }
1258 // The second operand is only an offset if it's an immediate.
1259 if (MI->isIndirectDebugValue())
1260 Offset = StackOffset::getFixed(MI->getDebugOffset().getImm());
1261 if (Offset)
1262 OS << '[';
1263 OS << printReg(Reg, AP.MF->getSubtarget().getRegisterInfo());
1264 if (Offset)
1265 OS << '+' << Offset->getFixed() << ']';
1266 break;
1267 }
1268 default:
1269 llvm_unreachable("Unknown operand type");
1270 }
1271 }
1272
1273 // NOTE: Want this comment at start of line, don't emit with AddComment.
1274 AP.OutStreamer->emitRawComment(OS.str());
1275 return true;
1276}
1277
1278/// This method handles the target-independent form of DBG_LABEL, returning
1279/// true if it was able to do so. A false return means the target will need
1280/// to handle MI in EmitInstruction.
1282 if (MI->getNumOperands() != 1)
1283 return false;
1284
1285 SmallString<128> Str;
1287 OS << "DEBUG_LABEL: ";
1288
1289 const DILabel *V = MI->getDebugLabel();
1290 if (auto *SP = dyn_cast<DISubprogram>(
1291 V->getScope()->getNonLexicalBlockFileScope())) {
1292 StringRef Name = SP->getName();
1293 if (!Name.empty())
1294 OS << Name << ":";
1295 }
1296 OS << V->getName();
1297
1298 // NOTE: Want this comment at start of line, don't emit with AddComment.
1299 AP.OutStreamer->emitRawComment(OS.str());
1300 return true;
1301}
1302
1305 // Ignore functions that won't get emitted.
1306 if (F.isDeclarationForLinker())
1307 return CFISection::None;
1308
1310 F.needsUnwindTableEntry())
1311 return CFISection::EH;
1312
1313 if (MAI->usesCFIWithoutEH() && F.hasUWTable())
1314 return CFISection::EH;
1315
1316 assert(MMI != nullptr && "Invalid machine module info");
1318 return CFISection::Debug;
1319
1320 return CFISection::None;
1321}
1322
1326}
1327
1330}
1331
1333 return MAI->usesCFIWithoutEH() && ModuleCFISection != CFISection::None;
1334}
1335
1337 ExceptionHandling ExceptionHandlingType = MAI->getExceptionHandlingType();
1338 if (!usesCFIWithoutEH() &&
1339 ExceptionHandlingType != ExceptionHandling::DwarfCFI &&
1340 ExceptionHandlingType != ExceptionHandling::ARM)
1341 return;
1342
1344 return;
1345
1346 // If there is no "real" instruction following this CFI instruction, skip
1347 // emitting it; it would be beyond the end of the function's FDE range.
1348 auto *MBB = MI.getParent();
1349 auto I = std::next(MI.getIterator());
1350 while (I != MBB->end() && I->isTransient())
1351 ++I;
1352 if (I == MBB->instr_end() &&
1354 return;
1355
1356 const std::vector<MCCFIInstruction> &Instrs = MF->getFrameInstructions();
1357 unsigned CFIIndex = MI.getOperand(0).getCFIIndex();
1358 const MCCFIInstruction &CFI = Instrs[CFIIndex];
1359 emitCFIInstruction(CFI);
1360}
1361
1363 // The operands are the MCSymbol and the frame offset of the allocation.
1364 MCSymbol *FrameAllocSym = MI.getOperand(0).getMCSymbol();
1365 int FrameOffset = MI.getOperand(1).getImm();
1366
1367 // Emit a symbol assignment.
1368 OutStreamer->emitAssignment(FrameAllocSym,
1369 MCConstantExpr::create(FrameOffset, OutContext));
1370}
1371
1372/// Returns the BB metadata to be emitted in the SHT_LLVM_BB_ADDR_MAP section
1373/// for a given basic block. This can be used to capture more precise profile
1374/// information.
1379 MBB.isEHPad(), const_cast<MachineBasicBlock &>(MBB).canFallThrough(),
1380 !MBB.empty() && MBB.rbegin()->isIndirectBranch()}
1381 .encode();
1382}
1383
1385getBBAddrMapFeature(const MachineFunction &MF, int NumMBBSectionRanges) {
1386 return {PgoAnalysisMapFeatures.isSet(PGOMapFeaturesEnum::FuncEntryCount),
1387 PgoAnalysisMapFeatures.isSet(PGOMapFeaturesEnum::BBFreq),
1388 PgoAnalysisMapFeatures.isSet(PGOMapFeaturesEnum::BrProb),
1389 MF.hasBBSections() && NumMBBSectionRanges > 1};
1390}
1391
1393 MCSection *BBAddrMapSection =
1395 assert(BBAddrMapSection && ".llvm_bb_addr_map section is not initialized.");
1396
1397 const MCSymbol *FunctionSymbol = getFunctionBegin();
1398
1399 OutStreamer->pushSection();
1400 OutStreamer->switchSection(BBAddrMapSection);
1401 OutStreamer->AddComment("version");
1402 uint8_t BBAddrMapVersion = OutStreamer->getContext().getBBAddrMapVersion();
1403 OutStreamer->emitInt8(BBAddrMapVersion);
1404 OutStreamer->AddComment("feature");
1405 auto Features = getBBAddrMapFeature(MF, MBBSectionRanges.size());
1406 OutStreamer->emitInt8(Features.encode());
1407 // Emit BB Information for each basic block in the function.
1408 if (Features.MultiBBRange) {
1409 OutStreamer->AddComment("number of basic block ranges");
1410 OutStreamer->emitULEB128IntValue(MBBSectionRanges.size());
1411 }
1412 // Number of blocks in each MBB section.
1413 MapVector<unsigned, unsigned> MBBSectionNumBlocks;
1414 const MCSymbol *PrevMBBEndSymbol = nullptr;
1415 if (!Features.MultiBBRange) {
1416 OutStreamer->AddComment("function address");
1417 OutStreamer->emitSymbolValue(FunctionSymbol, getPointerSize());
1418 OutStreamer->AddComment("number of basic blocks");
1419 OutStreamer->emitULEB128IntValue(MF.size());
1420 PrevMBBEndSymbol = FunctionSymbol;
1421 } else {
1422 unsigned BBCount = 0;
1423 for (const MachineBasicBlock &MBB : MF) {
1424 BBCount++;
1425 if (MBB.isEndSection()) {
1426 // Store each section's basic block count when it ends.
1427 MBBSectionNumBlocks[MBB.getSectionIDNum()] = BBCount;
1428 // Reset the count for the next section.
1429 BBCount = 0;
1430 }
1431 }
1432 }
1433 // Emit the BB entry for each basic block in the function.
1434 for (const MachineBasicBlock &MBB : MF) {
1435 const MCSymbol *MBBSymbol =
1436 MBB.isEntryBlock() ? FunctionSymbol : MBB.getSymbol();
1437 bool IsBeginSection =
1438 Features.MultiBBRange && (MBB.isBeginSection() || MBB.isEntryBlock());
1439 if (IsBeginSection) {
1440 OutStreamer->AddComment("base address");
1441 OutStreamer->emitSymbolValue(MBBSymbol, getPointerSize());
1442 OutStreamer->AddComment("number of basic blocks");
1443 OutStreamer->emitULEB128IntValue(
1444 MBBSectionNumBlocks[MBB.getSectionIDNum()]);
1445 PrevMBBEndSymbol = MBBSymbol;
1446 }
1447 // TODO: Remove this check when version 1 is deprecated.
1448 if (BBAddrMapVersion > 1) {
1449 OutStreamer->AddComment("BB id");
1450 // Emit the BB ID for this basic block.
1451 // We only emit BaseID since CloneID is unset for
1452 // basic-block-sections=labels.
1453 // TODO: Emit the full BBID when labels and sections can be mixed
1454 // together.
1455 OutStreamer->emitULEB128IntValue(MBB.getBBID()->BaseID);
1456 }
1457 // Emit the basic block offset relative to the end of the previous block.
1458 // This is zero unless the block is padded due to alignment.
1459 emitLabelDifferenceAsULEB128(MBBSymbol, PrevMBBEndSymbol);
1460 // Emit the basic block size. When BBs have alignments, their size cannot
1461 // always be computed from their offsets.
1463 // Emit the Metadata.
1464 OutStreamer->emitULEB128IntValue(getBBAddrMapMetadata(MBB));
1465 PrevMBBEndSymbol = MBB.getEndSymbol();
1466 }
1467
1468 if (Features.hasPGOAnalysis()) {
1469 assert(BBAddrMapVersion >= 2 &&
1470 "PGOAnalysisMap only supports version 2 or later");
1471
1472 if (Features.FuncEntryCount) {
1473 OutStreamer->AddComment("function entry count");
1474 auto MaybeEntryCount = MF.getFunction().getEntryCount();
1475 OutStreamer->emitULEB128IntValue(
1476 MaybeEntryCount ? MaybeEntryCount->getCount() : 0);
1477 }
1478 const MachineBlockFrequencyInfo *MBFI =
1479 Features.BBFreq
1480 ? &getAnalysis<LazyMachineBlockFrequencyInfoPass>().getBFI()
1481 : nullptr;
1482 const MachineBranchProbabilityInfo *MBPI =
1483 Features.BrProb
1484 ? &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI()
1485 : nullptr;
1486
1487 if (Features.BBFreq || Features.BrProb) {
1488 for (const MachineBasicBlock &MBB : MF) {
1489 if (Features.BBFreq) {
1490 OutStreamer->AddComment("basic block frequency");
1491 OutStreamer->emitULEB128IntValue(
1492 MBFI->getBlockFreq(&MBB).getFrequency());
1493 }
1494 if (Features.BrProb) {
1495 unsigned SuccCount = MBB.succ_size();
1496 OutStreamer->AddComment("basic block successor count");
1497 OutStreamer->emitULEB128IntValue(SuccCount);
1498 for (const MachineBasicBlock *SuccMBB : MBB.successors()) {
1499 OutStreamer->AddComment("successor BB ID");
1500 OutStreamer->emitULEB128IntValue(SuccMBB->getBBID()->BaseID);
1501 OutStreamer->AddComment("successor branch probability");
1502 OutStreamer->emitULEB128IntValue(
1503 MBPI->getEdgeProbability(&MBB, SuccMBB).getNumerator());
1504 }
1505 }
1506 }
1507 }
1508 }
1509
1510 OutStreamer->popSection();
1511}
1512
1514 const MCSymbol *Symbol) {
1515 MCSection *Section =
1517 if (!Section)
1518 return;
1519
1520 OutStreamer->pushSection();
1521 OutStreamer->switchSection(Section);
1522
1524 OutStreamer->emitLabel(Loc);
1525 OutStreamer->emitAbsoluteSymbolDiff(Symbol, Loc, 4);
1526
1527 OutStreamer->popSection();
1528}
1529
1531 const Function &F = MF.getFunction();
1532 if (const MDNode *MD = F.getMetadata(LLVMContext::MD_kcfi_type))
1533 emitGlobalConstant(F.getDataLayout(),
1534 mdconst::extract<ConstantInt>(MD->getOperand(0)));
1535}
1536
1538 if (PP) {
1539 auto GUID = MI.getOperand(0).getImm();
1540 auto Index = MI.getOperand(1).getImm();
1541 auto Type = MI.getOperand(2).getImm();
1542 auto Attr = MI.getOperand(3).getImm();
1543 DILocation *DebugLoc = MI.getDebugLoc();
1544 PP->emitPseudoProbe(GUID, Index, Type, Attr, DebugLoc);
1545 }
1546}
1547
1550 return;
1551
1552 MCSection *StackSizeSection =
1554 if (!StackSizeSection)
1555 return;
1556
1557 const MachineFrameInfo &FrameInfo = MF.getFrameInfo();
1558 // Don't emit functions with dynamic stack allocations.
1559 if (FrameInfo.hasVarSizedObjects())
1560 return;
1561
1562 OutStreamer->pushSection();
1563 OutStreamer->switchSection(StackSizeSection);
1564
1565 const MCSymbol *FunctionSymbol = getFunctionBegin();
1566 uint64_t StackSize =
1567 FrameInfo.getStackSize() + FrameInfo.getUnsafeStackSize();
1568 OutStreamer->emitSymbolValue(FunctionSymbol, TM.getProgramPointerSize());
1569 OutStreamer->emitULEB128IntValue(StackSize);
1570
1571 OutStreamer->popSection();
1572}
1573
1575 const std::string &OutputFilename = MF.getTarget().Options.StackUsageOutput;
1576
1577 // OutputFilename empty implies -fstack-usage is not passed.
1578 if (OutputFilename.empty())
1579 return;
1580
1581 const MachineFrameInfo &FrameInfo = MF.getFrameInfo();
1582 uint64_t StackSize =
1583 FrameInfo.getStackSize() + FrameInfo.getUnsafeStackSize();
1584
1585 if (StackUsageStream == nullptr) {
1586 std::error_code EC;
1587 StackUsageStream =
1588 std::make_unique<raw_fd_ostream>(OutputFilename, EC, sys::fs::OF_Text);
1589 if (EC) {
1590 errs() << "Could not open file: " << EC.message();
1591 return;
1592 }
1593 }
1594
1595 if (const DISubprogram *DSP = MF.getFunction().getSubprogram())
1596 *StackUsageStream << DSP->getFilename() << ':' << DSP->getLine();
1597 else
1598 *StackUsageStream << MF.getFunction().getParent()->getName();
1599
1600 *StackUsageStream << ':' << MF.getName() << '\t' << StackSize << '\t';
1601 if (FrameInfo.hasVarSizedObjects())
1602 *StackUsageStream << "dynamic\n";
1603 else
1604 *StackUsageStream << "static\n";
1605}
1606
1608 const MDNode &MD) {
1609 MCSymbol *S = MF.getContext().createTempSymbol("pcsection");
1610 OutStreamer->emitLabel(S);
1611 PCSectionsSymbols[&MD].emplace_back(S);
1612}
1613
1615 const Function &F = MF.getFunction();
1616 if (PCSectionsSymbols.empty() && !F.hasMetadata(LLVMContext::MD_pcsections))
1617 return;
1618
1620 const unsigned RelativeRelocSize =
1622 : 4;
1623
1624 // Switch to PCSection, short-circuiting the common case where the current
1625 // section is still valid (assume most MD_pcsections contain just 1 section).
1626 auto SwitchSection = [&, Prev = StringRef()](const StringRef &Sec) mutable {
1627 if (Sec == Prev)
1628 return;
1630 assert(S && "PC section is not initialized");
1631 OutStreamer->switchSection(S);
1632 Prev = Sec;
1633 };
1634 // Emit symbols into sections and data as specified in the pcsections MDNode.
1635 auto EmitForMD = [&](const MDNode &MD, ArrayRef<const MCSymbol *> Syms,
1636 bool Deltas) {
1637 // Expect the first operand to be a section name. After that, a tuple of
1638 // constants may appear, which will simply be emitted into the current
1639 // section (the user of MD_pcsections decides the format of encoded data).
1640 assert(isa<MDString>(MD.getOperand(0)) && "first operand not a string");
1641 bool ConstULEB128 = false;
1642 for (const MDOperand &MDO : MD.operands()) {
1643 if (auto *S = dyn_cast<MDString>(MDO)) {
1644 // Found string, start of new section!
1645 // Find options for this section "<section>!<opts>" - supported options:
1646 // C = Compress constant integers of size 2-8 bytes as ULEB128.
1647 const StringRef SecWithOpt = S->getString();
1648 const size_t OptStart = SecWithOpt.find('!'); // likely npos
1649 const StringRef Sec = SecWithOpt.substr(0, OptStart);
1650 const StringRef Opts = SecWithOpt.substr(OptStart); // likely empty
1651 ConstULEB128 = Opts.contains('C');
1652#ifndef NDEBUG
1653 for (char O : Opts)
1654 assert((O == '!' || O == 'C') && "Invalid !pcsections options");
1655#endif
1656 SwitchSection(Sec);
1657 const MCSymbol *Prev = Syms.front();
1658 for (const MCSymbol *Sym : Syms) {
1659 if (Sym == Prev || !Deltas) {
1660 // Use the entry itself as the base of the relative offset.
1661 MCSymbol *Base = MF.getContext().createTempSymbol("pcsection_base");
1662 OutStreamer->emitLabel(Base);
1663 // Emit relative relocation `addr - base`, which avoids a dynamic
1664 // relocation in the final binary. User will get the address with
1665 // `base + addr`.
1666 emitLabelDifference(Sym, Base, RelativeRelocSize);
1667 } else {
1668 // Emit delta between symbol and previous symbol.
1669 if (ConstULEB128)
1671 else
1672 emitLabelDifference(Sym, Prev, 4);
1673 }
1674 Prev = Sym;
1675 }
1676 } else {
1677 // Emit auxiliary data after PC.
1678 assert(isa<MDNode>(MDO) && "expecting either string or tuple");
1679 const auto *AuxMDs = cast<MDNode>(MDO);
1680 for (const MDOperand &AuxMDO : AuxMDs->operands()) {
1681 assert(isa<ConstantAsMetadata>(AuxMDO) && "expecting a constant");
1682 const Constant *C = cast<ConstantAsMetadata>(AuxMDO)->getValue();
1683 const DataLayout &DL = F.getDataLayout();
1684 const uint64_t Size = DL.getTypeStoreSize(C->getType());
1685
1686 if (auto *CI = dyn_cast<ConstantInt>(C);
1687 CI && ConstULEB128 && Size > 1 && Size <= 8) {
1688 emitULEB128(CI->getZExtValue());
1689 } else {
1691 }
1692 }
1693 }
1694 }
1695 };
1696
1697 OutStreamer->pushSection();
1698 // Emit PCs for function start and function size.
1699 if (const MDNode *MD = F.getMetadata(LLVMContext::MD_pcsections))
1700 EmitForMD(*MD, {getFunctionBegin(), getFunctionEnd()}, true);
1701 // Emit PCs for instructions collected.
1702 for (const auto &MS : PCSectionsSymbols)
1703 EmitForMD(*MS.first, MS.second, false);
1704 OutStreamer->popSection();
1705 PCSectionsSymbols.clear();
1706}
1707
1708/// Returns true if function begin and end labels should be emitted.
1709static bool needFuncLabels(const MachineFunction &MF) {
1710 MachineModuleInfo &MMI = MF.getMMI();
1711 if (!MF.getLandingPads().empty() || MF.hasEHFunclets() ||
1712 MMI.hasDebugInfo() ||
1713 MF.getFunction().hasMetadata(LLVMContext::MD_pcsections))
1714 return true;
1715
1716 // We might emit an EH table that uses function begin and end labels even if
1717 // we don't have any landingpads.
1718 if (!MF.getFunction().hasPersonalityFn())
1719 return false;
1720 return !isNoOpWithoutInvoke(
1722}
1723
1724/// EmitFunctionBody - This method emits the body and trailer for a
1725/// function.
1727 emitFunctionHeader();
1728
1729 // Emit target-specific gunk before the function body.
1731
1732 if (isVerbose()) {
1733 // Get MachineDominatorTree or compute it on the fly if it's unavailable
1734 auto MDTWrapper = getAnalysisIfAvailable<MachineDominatorTreeWrapperPass>();
1735 MDT = MDTWrapper ? &MDTWrapper->getDomTree() : nullptr;
1736 if (!MDT) {
1737 OwnedMDT = std::make_unique<MachineDominatorTree>();
1738 OwnedMDT->getBase().recalculate(*MF);
1739 MDT = OwnedMDT.get();
1740 }
1741
1742 // Get MachineLoopInfo or compute it on the fly if it's unavailable
1743 MLI = getAnalysisIfAvailable<MachineLoopInfo>();
1744 if (!MLI) {
1745 OwnedMLI = std::make_unique<MachineLoopInfo>();
1746 OwnedMLI->getBase().analyze(MDT->getBase());
1747 MLI = OwnedMLI.get();
1748 }
1749 }
1750
1751 // Print out code for the function.
1752 bool HasAnyRealCode = false;
1753 int NumInstsInFunction = 0;
1754 bool IsEHa = MMI->getModule()->getModuleFlag("eh-asynch");
1755
1756 bool CanDoExtraAnalysis = ORE->allowExtraAnalysis(DEBUG_TYPE);
1757 for (auto &MBB : *MF) {
1758 // Print a label for the basic block.
1760 DenseMap<StringRef, unsigned> MnemonicCounts;
1761 for (auto &MI : MBB) {
1762 // Print the assembly for the instruction.
1763 if (!MI.isPosition() && !MI.isImplicitDef() && !MI.isKill() &&
1764 !MI.isDebugInstr()) {
1765 HasAnyRealCode = true;
1766 ++NumInstsInFunction;
1767 }
1768
1769 // If there is a pre-instruction symbol, emit a label for it here.
1770 if (MCSymbol *S = MI.getPreInstrSymbol())
1771 OutStreamer->emitLabel(S);
1772
1773 if (MDNode *MD = MI.getPCSections())
1774 emitPCSectionsLabel(*MF, *MD);
1775
1776 for (const HandlerInfo &HI : Handlers) {
1777 NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
1778 HI.TimerGroupDescription, TimePassesIsEnabled);
1779 HI.Handler->beginInstruction(&MI);
1780 }
1781
1782 if (isVerbose())
1783 emitComments(MI, OutStreamer->getCommentOS());
1784
1785 switch (MI.getOpcode()) {
1786 case TargetOpcode::CFI_INSTRUCTION:
1788 break;
1789 case TargetOpcode::LOCAL_ESCAPE:
1791 break;
1792 case TargetOpcode::ANNOTATION_LABEL:
1793 case TargetOpcode::GC_LABEL:
1794 OutStreamer->emitLabel(MI.getOperand(0).getMCSymbol());
1795 break;
1796 case TargetOpcode::EH_LABEL:
1797 OutStreamer->emitLabel(MI.getOperand(0).getMCSymbol());
1798 // For AsynchEH, insert a Nop if followed by a trap inst
1799 // Or the exception won't be caught.
1800 // (see MCConstantExpr::create(1,..) in WinException.cpp)
1801 // Ignore SDiv/UDiv because a DIV with Const-0 divisor
1802 // must have being turned into an UndefValue.
1803 // Div with variable opnds won't be the first instruction in
1804 // an EH region as it must be led by at least a Load
1805 {
1806 auto MI2 = std::next(MI.getIterator());
1807 if (IsEHa && MI2 != MBB.end() &&
1808 (MI2->mayLoadOrStore() || MI2->mayRaiseFPException()))
1809 emitNops(1);
1810 }
1811 break;
1812 case TargetOpcode::INLINEASM:
1813 case TargetOpcode::INLINEASM_BR:
1814 emitInlineAsm(&MI);
1815 break;
1816 case TargetOpcode::DBG_VALUE:
1817 case TargetOpcode::DBG_VALUE_LIST:
1818 if (isVerbose()) {
1819 if (!emitDebugValueComment(&MI, *this))
1821 }
1822 break;
1823 case TargetOpcode::DBG_INSTR_REF:
1824 // This instruction reference will have been resolved to a machine
1825 // location, and a nearby DBG_VALUE created. We can safely ignore
1826 // the instruction reference.
1827 break;
1828 case TargetOpcode::DBG_PHI:
1829 // This instruction is only used to label a program point, it's purely
1830 // meta information.
1831 break;
1832 case TargetOpcode::DBG_LABEL:
1833 if (isVerbose()) {
1834 if (!emitDebugLabelComment(&MI, *this))
1836 }
1837 break;
1838 case TargetOpcode::IMPLICIT_DEF:
1839 if (isVerbose()) emitImplicitDef(&MI);
1840 break;
1841 case TargetOpcode::KILL:
1842 if (isVerbose()) emitKill(&MI, *this);
1843 break;
1844 case TargetOpcode::PSEUDO_PROBE:
1846 break;
1847 case TargetOpcode::ARITH_FENCE:
1848 if (isVerbose())
1849 OutStreamer->emitRawComment("ARITH_FENCE");
1850 break;
1851 case TargetOpcode::MEMBARRIER:
1852 OutStreamer->emitRawComment("MEMBARRIER");
1853 break;
1854 case TargetOpcode::JUMP_TABLE_DEBUG_INFO:
1855 // This instruction is only used to note jump table debug info, it's
1856 // purely meta information.
1857 break;
1858 default:
1860 if (CanDoExtraAnalysis) {
1861 MCInst MCI;
1862 MCI.setOpcode(MI.getOpcode());
1863 auto Name = OutStreamer->getMnemonic(MCI);
1864 auto I = MnemonicCounts.insert({Name, 0u});
1865 I.first->second++;
1866 }
1867 break;
1868 }
1869
1870 // If there is a post-instruction symbol, emit a label for it here.
1871 if (MCSymbol *S = MI.getPostInstrSymbol())
1872 OutStreamer->emitLabel(S);
1873
1874 for (const HandlerInfo &HI : Handlers) {
1875 NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
1876 HI.TimerGroupDescription, TimePassesIsEnabled);
1877 HI.Handler->endInstruction();
1878 }
1879 }
1880
1881 // We must emit temporary symbol for the end of this basic block, if either
1882 // we have BBLabels enabled or if this basic blocks marks the end of a
1883 // section.
1884 if (MF->hasBBLabels() || MF->getTarget().Options.BBAddrMap ||
1886 OutStreamer->emitLabel(MBB.getEndSymbol());
1887
1888 if (MBB.isEndSection()) {
1889 // The size directive for the section containing the entry block is
1890 // handled separately by the function section.
1891 if (!MBB.sameSection(&MF->front())) {
1893 // Emit the size directive for the basic block section.
1894 const MCExpr *SizeExp = MCBinaryExpr::createSub(
1896 MCSymbolRefExpr::create(CurrentSectionBeginSym, OutContext),
1897 OutContext);
1898 OutStreamer->emitELFSize(CurrentSectionBeginSym, SizeExp);
1899 }
1901 MBBSectionRange{CurrentSectionBeginSym, MBB.getEndSymbol()};
1902 }
1903 }
1905
1906 if (CanDoExtraAnalysis) {
1907 // Skip empty blocks.
1908 if (MBB.empty())
1909 continue;
1910
1912 MBB.begin()->getDebugLoc(), &MBB);
1913
1914 // Generate instruction mix remark. First, sort counts in descending order
1915 // by count and name.
1917 for (auto &KV : MnemonicCounts)
1918 MnemonicVec.emplace_back(KV.first, KV.second);
1919
1920 sort(MnemonicVec, [](const std::pair<StringRef, unsigned> &A,
1921 const std::pair<StringRef, unsigned> &B) {
1922 if (A.second > B.second)
1923 return true;
1924 if (A.second == B.second)
1925 return StringRef(A.first) < StringRef(B.first);
1926 return false;
1927 });
1928 R << "BasicBlock: " << ore::NV("BasicBlock", MBB.getName()) << "\n";
1929 for (auto &KV : MnemonicVec) {
1930 auto Name = (Twine("INST_") + getToken(KV.first.trim()).first).str();
1931 R << KV.first << ": " << ore::NV(Name, KV.second) << "\n";
1932 }
1933 ORE->emit(R);
1934 }
1935 }
1936
1937 EmittedInsts += NumInstsInFunction;
1938 MachineOptimizationRemarkAnalysis R(DEBUG_TYPE, "InstructionCount",
1940 &MF->front());
1941 R << ore::NV("NumInstructions", NumInstsInFunction)
1942 << " instructions in function";
1943 ORE->emit(R);
1944
1945 // If the function is empty and the object file uses .subsections_via_symbols,
1946 // then we need to emit *something* to the function body to prevent the
1947 // labels from collapsing together. Just emit a noop.
1948 // Similarly, don't emit empty functions on Windows either. It can lead to
1949 // duplicate entries (two functions with the same RVA) in the Guard CF Table
1950 // after linking, causing the kernel not to load the binary:
1951 // https://developercommunity.visualstudio.com/content/problem/45366/vc-linker-creates-invalid-dll-with-clang-cl.html
1952 // FIXME: Hide this behind some API in e.g. MCAsmInfo or MCTargetStreamer.
1953 const Triple &TT = TM.getTargetTriple();
1954 if (!HasAnyRealCode && (MAI->hasSubsectionsViaSymbols() ||
1955 (TT.isOSWindows() && TT.isOSBinFormatCOFF()))) {
1956 MCInst Noop = MF->getSubtarget().getInstrInfo()->getNop();
1957
1958 // Targets can opt-out of emitting the noop here by leaving the opcode
1959 // unspecified.
1960 if (Noop.getOpcode()) {
1961 OutStreamer->AddComment("avoids zero-length function");
1962 emitNops(1);
1963 }
1964 }
1965
1966 // Switch to the original section in case basic block sections was used.
1967 OutStreamer->switchSection(MF->getSection());
1968
1969 const Function &F = MF->getFunction();
1970 for (const auto &BB : F) {
1971 if (!BB.hasAddressTaken())
1972 continue;
1974 if (Sym->isDefined())
1975 continue;
1976 OutStreamer->AddComment("Address of block that was removed by CodeGen");
1977 OutStreamer->emitLabel(Sym);
1978 }
1979
1980 // Emit target-specific gunk after the function body.
1982
1983 // Even though wasm supports .type and .size in general, function symbols
1984 // are automatically sized.
1985 bool EmitFunctionSize = MAI->hasDotTypeDotSizeDirective() && !TT.isWasm();
1986
1987 if (needFuncLabels(*MF) || EmitFunctionSize) {
1988 // Create a symbol for the end of function.
1989 CurrentFnEnd = createTempSymbol("func_end");
1990 OutStreamer->emitLabel(CurrentFnEnd);
1991 }
1992
1993 // If the target wants a .size directive for the size of the function, emit
1994 // it.
1995 if (EmitFunctionSize) {
1996 // We can get the size as difference between the function label and the
1997 // temp label.
1998 const MCExpr *SizeExp = MCBinaryExpr::createSub(
1999 MCSymbolRefExpr::create(CurrentFnEnd, OutContext),
2001 OutStreamer->emitELFSize(CurrentFnSym, SizeExp);
2003 OutStreamer->emitELFSize(CurrentFnBeginLocal, SizeExp);
2004 }
2005
2006 // Call endBasicBlockSection on the last block now, if it wasn't already
2007 // called.
2008 if (!MF->back().isEndSection()) {
2009 for (const HandlerInfo &HI : Handlers) {
2010 NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
2011 HI.TimerGroupDescription, TimePassesIsEnabled);
2012 HI.Handler->endBasicBlockSection(MF->back());
2013 }
2014 }
2015 for (const HandlerInfo &HI : Handlers) {
2016 NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
2017 HI.TimerGroupDescription, TimePassesIsEnabled);
2018 HI.Handler->markFunctionEnd();
2019 }
2020
2022 MBBSectionRange{CurrentFnBegin, CurrentFnEnd};
2023
2024 // Print out jump tables referenced by the function.
2026
2027 // Emit post-function debug and/or EH information.
2028 for (const HandlerInfo &HI : Handlers) {
2029 NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
2030 HI.TimerGroupDescription, TimePassesIsEnabled);
2031 HI.Handler->endFunction(MF);
2032 }
2033
2034 // Emit section containing BB address offsets and their metadata, when
2035 // BB labels are requested for this function. Skip empty functions.
2036 if (HasAnyRealCode) {
2039 else if (PgoAnalysisMapFeatures.getBits() != 0)
2041 SMLoc(), "pgo-analysis-map is enabled for function " + MF->getName() +
2042 " but it does not have labels");
2043 }
2044
2045 // Emit sections containing instruction and function PCs.
2047
2048 // Emit section containing stack size metadata.
2050
2051 // Emit .su file containing function stack size information.
2053
2055
2056 if (isVerbose())
2057 OutStreamer->getCommentOS() << "-- End function\n";
2058
2059 OutStreamer->addBlankLine();
2060}
2061
2062/// Compute the number of Global Variables that uses a Constant.
2063static unsigned getNumGlobalVariableUses(const Constant *C) {
2064 if (!C)
2065 return 0;
2066
2067 if (isa<GlobalVariable>(C))
2068 return 1;
2069
2070 unsigned NumUses = 0;
2071 for (const auto *CU : C->users())
2072 NumUses += getNumGlobalVariableUses(dyn_cast<Constant>(CU));
2073
2074 return NumUses;
2075}
2076
2077/// Only consider global GOT equivalents if at least one user is a
2078/// cstexpr inside an initializer of another global variables. Also, don't
2079/// handle cstexpr inside instructions. During global variable emission,
2080/// candidates are skipped and are emitted later in case at least one cstexpr
2081/// isn't replaced by a PC relative GOT entry access.
2083 unsigned &NumGOTEquivUsers) {
2084 // Global GOT equivalents are unnamed private globals with a constant
2085 // pointer initializer to another global symbol. They must point to a
2086 // GlobalVariable or Function, i.e., as GlobalValue.
2087 if (!GV->hasGlobalUnnamedAddr() || !GV->hasInitializer() ||
2088 !GV->isConstant() || !GV->isDiscardableIfUnused() ||
2089 !isa<GlobalValue>(GV->getOperand(0)))
2090 return false;
2091
2092 // To be a got equivalent, at least one of its users need to be a constant
2093 // expression used by another global variable.
2094 for (const auto *U : GV->users())
2095 NumGOTEquivUsers += getNumGlobalVariableUses(dyn_cast<Constant>(U));
2096
2097 return NumGOTEquivUsers > 0;
2098}
2099
2100/// Unnamed constant global variables solely contaning a pointer to
2101/// another globals variable is equivalent to a GOT table entry; it contains the
2102/// the address of another symbol. Optimize it and replace accesses to these
2103/// "GOT equivalents" by using the GOT entry for the final global instead.
2104/// Compute GOT equivalent candidates among all global variables to avoid
2105/// emitting them if possible later on, after it use is replaced by a GOT entry
2106/// access.
2108 if (!getObjFileLowering().supportIndirectSymViaGOTPCRel())
2109 return;
2110
2111 for (const auto &G : M.globals()) {
2112 unsigned NumGOTEquivUsers = 0;
2113 if (!isGOTEquivalentCandidate(&G, NumGOTEquivUsers))
2114 continue;
2115
2116 const MCSymbol *GOTEquivSym = getSymbol(&G);
2117 GlobalGOTEquivs[GOTEquivSym] = std::make_pair(&G, NumGOTEquivUsers);
2118 }
2119}
2120
2121/// Constant expressions using GOT equivalent globals may not be eligible
2122/// for PC relative GOT entry conversion, in such cases we need to emit such
2123/// globals we previously omitted in EmitGlobalVariable.
2125 if (!getObjFileLowering().supportIndirectSymViaGOTPCRel())
2126 return;
2127
2129 for (auto &I : GlobalGOTEquivs) {
2130 const GlobalVariable *GV = I.second.first;
2131 unsigned Cnt = I.second.second;
2132 if (Cnt)
2133 FailedCandidates.push_back(GV);
2134 }
2135 GlobalGOTEquivs.clear();
2136
2137 for (const auto *GV : FailedCandidates)
2139}
2140
2141void AsmPrinter::emitGlobalAlias(const Module &M, const GlobalAlias &GA) {
2142 MCSymbol *Name = getSymbol(&GA);
2143 bool IsFunction = GA.getValueType()->isFunctionTy();
2144 // Treat bitcasts of functions as functions also. This is important at least
2145 // on WebAssembly where object and function addresses can't alias each other.
2146 if (!IsFunction)
2147 IsFunction = isa<Function>(GA.getAliasee()->stripPointerCasts());
2148
2149 // AIX's assembly directive `.set` is not usable for aliasing purpose,
2150 // so AIX has to use the extra-label-at-definition strategy. At this
2151 // point, all the extra label is emitted, we just have to emit linkage for
2152 // those labels.
2155 "Visibility should be handled with emitLinkage() on AIX.");
2156
2157 // Linkage for alias of global variable has been emitted.
2158 if (isa<GlobalVariable>(GA.getAliaseeObject()))
2159 return;
2160
2161 emitLinkage(&GA, Name);
2162 // If it's a function, also emit linkage for aliases of function entry
2163 // point.
2164 if (IsFunction)
2165 emitLinkage(&GA,
2166 getObjFileLowering().getFunctionEntryPointSymbol(&GA, TM));
2167 return;
2168 }
2169
2171 OutStreamer->emitSymbolAttribute(Name, MCSA_Global);
2172 else if (GA.hasWeakLinkage() || GA.hasLinkOnceLinkage())
2173 OutStreamer->emitSymbolAttribute(Name, MCSA_WeakReference);
2174 else
2175 assert(GA.hasLocalLinkage() && "Invalid alias linkage");
2176
2177 // Set the symbol type to function if the alias has a function type.
2178 // This affects codegen when the aliasee is not a function.
2179 if (IsFunction) {
2180 OutStreamer->emitSymbolAttribute(Name, MCSA_ELF_TypeFunction);
2182 OutStreamer->beginCOFFSymbolDef(Name);
2183 OutStreamer->emitCOFFSymbolStorageClass(
2188 OutStreamer->endCOFFSymbolDef();
2189 }
2190 }
2191
2193
2194 const MCExpr *Expr = lowerConstant(GA.getAliasee());
2195
2196 if (MAI->hasAltEntry() && isa<MCBinaryExpr>(Expr))
2197 OutStreamer->emitSymbolAttribute(Name, MCSA_AltEntry);
2198
2199 // Emit the directives as assignments aka .set:
2200 OutStreamer->emitAssignment(Name, Expr);
2201 MCSymbol *LocalAlias = getSymbolPreferLocal(GA);
2202 if (LocalAlias != Name)
2203 OutStreamer->emitAssignment(LocalAlias, Expr);
2204
2205 // If the aliasee does not correspond to a symbol in the output, i.e. the
2206 // alias is not of an object or the aliased object is private, then set the
2207 // size of the alias symbol from the type of the alias. We don't do this in
2208 // other situations as the alias and aliasee having differing types but same
2209 // size may be intentional.
2210 const GlobalObject *BaseObject = GA.getAliaseeObject();
2212 (!BaseObject || BaseObject->hasPrivateLinkage())) {
2213 const DataLayout &DL = M.getDataLayout();
2214 uint64_t Size = DL.getTypeAllocSize(GA.getValueType());
2216 }
2217}
2218
2219void AsmPrinter::emitGlobalIFunc(Module &M, const GlobalIFunc &GI) {
2221 "IFunc is not supported on AIX.");
2222
2223 auto EmitLinkage = [&](MCSymbol *Sym) {
2225 OutStreamer->emitSymbolAttribute(Sym, MCSA_Global);
2226 else if (GI.hasWeakLinkage() || GI.hasLinkOnceLinkage())
2227 OutStreamer->emitSymbolAttribute(Sym, MCSA_WeakReference);
2228 else
2229 assert(GI.hasLocalLinkage() && "Invalid ifunc linkage");
2230 };
2231
2233 MCSymbol *Name = getSymbol(&GI);
2234 EmitLinkage(Name);
2235 OutStreamer->emitSymbolAttribute(Name, MCSA_ELF_TypeIndFunction);
2237
2238 // Emit the directives as assignments aka .set:
2239 const MCExpr *Expr = lowerConstant(GI.getResolver());
2240 OutStreamer->emitAssignment(Name, Expr);
2241 MCSymbol *LocalAlias = getSymbolPreferLocal(GI);
2242 if (LocalAlias != Name)
2243 OutStreamer->emitAssignment(LocalAlias, Expr);
2244
2245 return;
2246 }
2247
2249 llvm::report_fatal_error("IFuncs are not supported on this platform");
2250
2251 // On Darwin platforms, emit a manually-constructed .symbol_resolver that
2252 // implements the symbol resolution duties of the IFunc.
2253 //
2254 // Normally, this would be handled by linker magic, but unfortunately there
2255 // are a few limitations in ld64 and ld-prime's implementation of
2256 // .symbol_resolver that mean we can't always use them:
2257 //
2258 // * resolvers cannot be the target of an alias
2259 // * resolvers cannot have private linkage
2260 // * resolvers cannot have linkonce linkage
2261 // * resolvers cannot appear in executables
2262 // * resolvers cannot appear in bundles
2263 //
2264 // This works around that by emitting a close approximation of what the
2265 // linker would have done.
2266
2267 MCSymbol *LazyPointer =
2268 GetExternalSymbolSymbol(GI.getName() + ".lazy_pointer");
2269 MCSymbol *StubHelper = GetExternalSymbolSymbol(GI.getName() + ".stub_helper");
2270
2272
2273 const DataLayout &DL = M.getDataLayout();
2274 emitAlignment(Align(DL.getPointerSize()));
2275 OutStreamer->emitLabel(LazyPointer);
2276 emitVisibility(LazyPointer, GI.getVisibility());
2277 OutStreamer->emitValue(MCSymbolRefExpr::create(StubHelper, OutContext), 8);
2278
2280
2281 const TargetSubtargetInfo *STI =
2283 const TargetLowering *TLI = STI->getTargetLowering();
2284 Align TextAlign(TLI->getMinFunctionAlignment());
2285
2286 MCSymbol *Stub = getSymbol(&GI);
2287 EmitLinkage(Stub);
2288 OutStreamer->emitCodeAlignment(TextAlign, getIFuncMCSubtargetInfo());
2289 OutStreamer->emitLabel(Stub);
2290 emitVisibility(Stub, GI.getVisibility());
2291 emitMachOIFuncStubBody(M, GI, LazyPointer);
2292
2293 OutStreamer->emitCodeAlignment(TextAlign, getIFuncMCSubtargetInfo());
2294 OutStreamer->emitLabel(StubHelper);
2295 emitVisibility(StubHelper, GI.getVisibility());
2296 emitMachOIFuncStubHelperBody(M, GI, LazyPointer);
2297}
2298
2300 if (!RS.needsSection())
2301 return;
2302
2303 remarks::RemarkSerializer &RemarkSerializer = RS.getSerializer();
2304
2305 std::optional<SmallString<128>> Filename;
2306 if (std::optional<StringRef> FilenameRef = RS.getFilename()) {
2307 Filename = *FilenameRef;
2308 sys::fs::make_absolute(*Filename);
2309 assert(!Filename->empty() && "The filename can't be empty.");
2310 }
2311
2312 std::string Buf;
2314 std::unique_ptr<remarks::MetaSerializer> MetaSerializer =
2315 Filename ? RemarkSerializer.metaSerializer(OS, Filename->str())
2316 : RemarkSerializer.metaSerializer(OS);
2317 MetaSerializer->emit();
2318
2319 // Switch to the remarks section.
2320 MCSection *RemarksSection =
2322 OutStreamer->switchSection(RemarksSection);
2323
2324 OutStreamer->emitBinaryData(OS.str());
2325}
2326
2328 // Set the MachineFunction to nullptr so that we can catch attempted
2329 // accesses to MF specific features at the module level and so that
2330 // we can conditionalize accesses based on whether or not it is nullptr.
2331 MF = nullptr;
2332
2333 // Gather all GOT equivalent globals in the module. We really need two
2334 // passes over the globals: one to compute and another to avoid its emission
2335 // in EmitGlobalVariable, otherwise we would not be able to handle cases
2336 // where the got equivalent shows up before its use.
2338
2339 // Emit global variables.
2340 for (const auto &G : M.globals())
2342
2343 // Emit remaining GOT equivalent globals.
2345
2347
2348 // Emit linkage(XCOFF) and visibility info for declarations
2349 for (const Function &F : M) {
2350 if (!F.isDeclarationForLinker())
2351 continue;
2352
2353 MCSymbol *Name = getSymbol(&F);
2354 // Function getSymbol gives us the function descriptor symbol for XCOFF.
2355
2357 GlobalValue::VisibilityTypes V = F.getVisibility();
2359 continue;
2360
2361 emitVisibility(Name, V, false);
2362 continue;
2363 }
2364
2365 if (F.isIntrinsic())
2366 continue;
2367
2368 // Handle the XCOFF case.
2369 // Variable `Name` is the function descriptor symbol (see above). Get the
2370 // function entry point symbol.
2371 MCSymbol *FnEntryPointSym = TLOF.getFunctionEntryPointSymbol(&F, TM);
2372 // Emit linkage for the function entry point.
2373 emitLinkage(&F, FnEntryPointSym);
2374
2375 // Emit linkage for the function descriptor.
2376 emitLinkage(&F, Name);
2377 }
2378
2379 // Emit the remarks section contents.
2380 // FIXME: Figure out when is the safest time to emit this section. It should
2381 // not come after debug info.
2382 if (remarks::RemarkStreamer *RS = M.getContext().getMainRemarkStreamer())
2383 emitRemarksSection(*RS);
2384
2386
2389
2390 // Output stubs for external and common global variables.
2392 if (!Stubs.empty()) {
2393 OutStreamer->switchSection(TLOF.getDataSection());
2394 const DataLayout &DL = M.getDataLayout();
2395
2396 emitAlignment(Align(DL.getPointerSize()));
2397 for (const auto &Stub : Stubs) {
2398 OutStreamer->emitLabel(Stub.first);
2399 OutStreamer->emitSymbolValue(Stub.second.getPointer(),
2400 DL.getPointerSize());
2401 }
2402 }
2403 }
2404
2406 MachineModuleInfoCOFF &MMICOFF =
2408
2409 // Output stubs for external and common global variables.
2411 if (!Stubs.empty()) {
2412 const DataLayout &DL = M.getDataLayout();
2413
2414 for (const auto &Stub : Stubs) {
2416 SectionName += Stub.first->getName();
2417 OutStreamer->switchSection(OutContext.getCOFFSection(
2421 Stub.first->getName(), COFF::IMAGE_COMDAT_SELECT_ANY));
2422 emitAlignment(Align(DL.getPointerSize()));
2423 OutStreamer->emitSymbolAttribute(Stub.first, MCSA_Global);
2424 OutStreamer->emitLabel(Stub.first);
2425 OutStreamer->emitSymbolValue(Stub.second.getPointer(),
2426 DL.getPointerSize());
2427 }
2428 }
2429 }
2430
2431 // This needs to happen before emitting debug information since that can end
2432 // arbitrary sections.
2433 if (auto *TS = OutStreamer->getTargetStreamer())
2434 TS->emitConstantPools();
2435
2436 // Emit Stack maps before any debug info. Mach-O requires that no data or
2437 // text sections come after debug info has been emitted. This matters for
2438 // stack maps as they are arbitrary data, and may even have a custom format
2439 // through user plugins.
2440 emitStackMaps();
2441
2442 // Print aliases in topological order, that is, for each alias a = b,
2443 // b must be printed before a.
2444 // This is because on some targets (e.g. PowerPC) linker expects aliases in
2445 // such an order to generate correct TOC information.
2448 for (const auto &Alias : M.aliases()) {
2449 if (Alias.hasAvailableExternallyLinkage())
2450 continue;
2451 for (const GlobalAlias *Cur = &Alias; Cur;
2452 Cur = dyn_cast<GlobalAlias>(Cur->getAliasee())) {
2453 if (!AliasVisited.insert(Cur).second)
2454 break;
2455 AliasStack.push_back(Cur);
2456 }
2457 for (const GlobalAlias *AncestorAlias : llvm::reverse(AliasStack))
2458 emitGlobalAlias(M, *AncestorAlias);
2459 AliasStack.clear();
2460 }
2461
2462 // IFuncs must come before deubginfo in case the backend decides to emit them
2463 // as actual functions, since on Mach-O targets, we cannot create regular
2464 // sections after DWARF.
2465 for (const auto &IFunc : M.ifuncs())
2466 emitGlobalIFunc(M, IFunc);
2467
2468 // Finalize debug and EH information.
2469 for (const HandlerInfo &HI : Handlers) {
2470 NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
2471 HI.TimerGroupDescription, TimePassesIsEnabled);
2472 HI.Handler->endModule();
2473 }
2474
2475 // This deletes all the ephemeral handlers that AsmPrinter added, while
2476 // keeping all the user-added handlers alive until the AsmPrinter is
2477 // destroyed.
2478 Handlers.erase(Handlers.begin() + NumUserHandlers, Handlers.end());
2479 DD = nullptr;
2480
2481 // If the target wants to know about weak references, print them all.
2482 if (MAI->getWeakRefDirective()) {
2483 // FIXME: This is not lazy, it would be nice to only print weak references
2484 // to stuff that is actually used. Note that doing so would require targets
2485 // to notice uses in operands (due to constant exprs etc). This should
2486 // happen with the MC stuff eventually.
2487
2488 // Print out module-level global objects here.
2489 for (const auto &GO : M.global_objects()) {
2490 if (!GO.hasExternalWeakLinkage())
2491 continue;
2492 OutStreamer->emitSymbolAttribute(getSymbol(&GO), MCSA_WeakReference);
2493 }
2495 auto SymbolName = "swift_async_extendedFramePointerFlags";
2496 auto Global = M.getGlobalVariable(SymbolName);
2497 if (!Global) {
2498 auto Int8PtrTy = PointerType::getUnqual(M.getContext());
2499 Global = new GlobalVariable(M, Int8PtrTy, false,
2501 SymbolName);
2502 OutStreamer->emitSymbolAttribute(getSymbol(Global), MCSA_WeakReference);
2503 }
2504 }
2505 }
2506
2507 GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
2508 assert(MI && "AsmPrinter didn't require GCModuleInfo?");
2509 for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; )
2510 if (GCMetadataPrinter *MP = getOrCreateGCPrinter(**--I))
2511 MP->finishAssembly(M, *MI, *this);
2512
2513 // Emit llvm.ident metadata in an '.ident' directive.
2514 emitModuleIdents(M);
2515
2516 // Emit bytes for llvm.commandline metadata.
2517 // The command line metadata is emitted earlier on XCOFF.
2519 emitModuleCommandLines(M);
2520
2521 // Emit .note.GNU-split-stack and .note.GNU-no-split-stack sections if
2522 // split-stack is used.
2523 if (TM.getTargetTriple().isOSBinFormatELF() && HasSplitStack) {
2524 OutStreamer->switchSection(OutContext.getELFSection(".note.GNU-split-stack",
2525 ELF::SHT_PROGBITS, 0));
2526 if (HasNoSplitStack)
2527 OutStreamer->switchSection(OutContext.getELFSection(
2528 ".note.GNU-no-split-stack", ELF::SHT_PROGBITS, 0));
2529 }
2530
2531 // If we don't have any trampolines, then we don't require stack memory
2532 // to be executable. Some targets have a directive to declare this.
2533 Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline");
2534 if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty())
2536 OutStreamer->switchSection(S);
2537
2538 if (TM.Options.EmitAddrsig) {
2539 // Emit address-significance attributes for all globals.
2540 OutStreamer->emitAddrsig();
2541 for (const GlobalValue &GV : M.global_values()) {
2542 if (!GV.use_empty() && !GV.isThreadLocal() &&
2543 !GV.hasDLLImportStorageClass() &&
2544 !GV.getName().starts_with("llvm.") &&
2545 !GV.hasAtLeastLocalUnnamedAddr())
2546 OutStreamer->emitAddrsigSym(getSymbol(&GV));
2547 }
2548 }
2549
2550 // Emit symbol partition specifications (ELF only).
2552 unsigned UniqueID = 0;
2553 for (const GlobalValue &GV : M.global_values()) {
2554 if (!GV.hasPartition() || GV.isDeclarationForLinker() ||
2555 GV.getVisibility() != GlobalValue::DefaultVisibility)
2556 continue;
2557
2558 OutStreamer->switchSection(
2559 OutContext.getELFSection(".llvm_sympart", ELF::SHT_LLVM_SYMPART, 0, 0,
2560 "", false, ++UniqueID, nullptr));
2561 OutStreamer->emitBytes(GV.getPartition());
2562 OutStreamer->emitZeros(1);
2563 OutStreamer->emitValue(
2566 }
2567 }
2568
2569 // Allow the target to emit any magic that it wants at the end of the file,
2570 // after everything else has gone out.
2572
2573 MMI = nullptr;
2574 AddrLabelSymbols = nullptr;
2575
2576 OutStreamer->finish();
2577 OutStreamer->reset();
2578 OwnedMLI.reset();
2579 OwnedMDT.reset();
2580
2581 return false;
2582}
2583
2585 auto Res = MBBSectionExceptionSyms.try_emplace(MBB.getSectionIDNum());
2586 if (Res.second)
2587 Res.first->second = createTempSymbol("exception");
2588 return Res.first->second;
2589}
2590
2592 this->MF = &MF;
2593 const Function &F = MF.getFunction();
2594
2595 // Record that there are split-stack functions, so we will emit a special
2596 // section to tell the linker.
2597 if (MF.shouldSplitStack()) {
2598 HasSplitStack = true;
2599
2601 HasNoSplitStack = true;
2602 } else
2603 HasNoSplitStack = true;
2604
2605 // Get the function symbol.
2606 if (!MAI->needsFunctionDescriptors()) {
2608 } else {
2610 "Only AIX uses the function descriptor hooks.");
2611 // AIX is unique here in that the name of the symbol emitted for the
2612 // function body does not have the same name as the source function's
2613 // C-linkage name.
2614 assert(CurrentFnDescSym && "The function descriptor symbol needs to be"
2615 " initalized first.");
2616
2617 // Get the function entry point symbol.
2619 }
2620
2622 CurrentFnBegin = nullptr;
2623 CurrentFnBeginLocal = nullptr;
2624 CurrentSectionBeginSym = nullptr;
2625 MBBSectionRanges.clear();
2626 MBBSectionExceptionSyms.clear();
2627 bool NeedsLocalForSize = MAI->needsLocalForSize();
2628 if (F.hasFnAttribute("patchable-function-entry") ||
2629 F.hasFnAttribute("function-instrument") ||
2630 F.hasFnAttribute("xray-instruction-threshold") || needFuncLabels(MF) ||
2631 NeedsLocalForSize || MF.getTarget().Options.EmitStackSizeSection ||
2633 CurrentFnBegin = createTempSymbol("func_begin");
2634 if (NeedsLocalForSize)
2636 }
2637
2638 ORE = &getAnalysis<MachineOptimizationRemarkEmitterPass>().getORE();
2639}
2640
2641namespace {
2642
2643// Keep track the alignment, constpool entries per Section.
2644 struct SectionCPs {
2645 MCSection *S;
2646 Align Alignment;
2648
2649 SectionCPs(MCSection *s, Align a) : S(s), Alignment(a) {}
2650 };
2651
2652} // end anonymous namespace
2653
2654/// EmitConstantPool - Print to the current output stream assembly
2655/// representations of the constants in the constant pool MCP. This is
2656/// used to print out constants which have been "spilled to memory" by
2657/// the code generator.
2659 const MachineConstantPool *MCP = MF->getConstantPool();
2660 const std::vector<MachineConstantPoolEntry> &CP = MCP->getConstants();
2661 if (CP.empty()) return;
2662
2663 // Calculate sections for constant pool entries. We collect entries to go into
2664 // the same section together to reduce amount of section switch statements.
2665 SmallVector<SectionCPs, 4> CPSections;
2666 for (unsigned i = 0, e = CP.size(); i != e; ++i) {
2667 const MachineConstantPoolEntry &CPE = CP[i];
2668 Align Alignment = CPE.getAlign();
2669
2671
2672 const Constant *C = nullptr;
2673 if (!CPE.isMachineConstantPoolEntry())
2674 C = CPE.Val.ConstVal;
2675
2677 getDataLayout(), Kind, C, Alignment);
2678
2679 // The number of sections are small, just do a linear search from the
2680 // last section to the first.
2681 bool Found = false;
2682 unsigned SecIdx = CPSections.size();
2683 while (SecIdx != 0) {
2684 if (CPSections[--SecIdx].S == S) {
2685 Found = true;
2686 break;
2687 }
2688 }
2689 if (!Found) {
2690 SecIdx = CPSections.size();
2691 CPSections.push_back(SectionCPs(S, Alignment));
2692 }
2693
2694 if (Alignment > CPSections[SecIdx].Alignment)
2695 CPSections[SecIdx].Alignment = Alignment;
2696 CPSections[SecIdx].CPEs.push_back(i);
2697 }
2698
2699 // Now print stuff into the calculated sections.
2700 const MCSection *CurSection = nullptr;
2701 unsigned Offset = 0;
2702 for (unsigned i = 0, e = CPSections.size(); i != e; ++i) {
2703 for (unsigned j = 0, ee = CPSections[i].CPEs.size(); j != ee; ++j) {
2704 unsigned CPI = CPSections[i].CPEs[j];
2705 MCSymbol *Sym = GetCPISymbol(CPI);
2706 if (!Sym->isUndefined())
2707 continue;
2708
2709 if (CurSection != CPSections[i].S) {
2710 OutStreamer->switchSection(CPSections[i].S);
2711 emitAlignment(Align(CPSections[i].Alignment));
2712 CurSection = CPSections[i].S;
2713 Offset = 0;
2714 }
2715
2716 MachineConstantPoolEntry CPE = CP[CPI];
2717
2718 // Emit inter-object padding for alignment.
2719 unsigned NewOffset = alignTo(Offset, CPE.getAlign());
2720 OutStreamer->emitZeros(NewOffset - Offset);
2721
2722 Offset = NewOffset + CPE.getSizeInBytes(getDataLayout());
2723
2724 OutStreamer->emitLabel(Sym);
2727 else
2729 }
2730 }
2731}
2732
2733// Print assembly representations of the jump tables used by the current
2734// function.
2736 const DataLayout &DL = MF->getDataLayout();
2737 const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
2738 if (!MJTI) return;
2739 if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_Inline) return;
2740 const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
2741 if (JT.empty()) return;
2742
2743 // Pick the directive to use to print the jump table entries, and switch to
2744 // the appropriate section.
2745 const Function &F = MF->getFunction();
2747 bool JTInDiffSection = !TLOF.shouldPutJumpTableInFunctionSection(
2750 F);
2751 if (JTInDiffSection) {
2752 // Drop it in the readonly section.
2753 MCSection *ReadOnlySection = TLOF.getSectionForJumpTable(F, TM);
2754 OutStreamer->switchSection(ReadOnlySection);
2755 }
2756
2758
2759 // Jump tables in code sections are marked with a data_region directive
2760 // where that's supported.
2761 if (!JTInDiffSection)
2762 OutStreamer->emitDataRegion(MCDR_DataRegionJT32);
2763
2764 for (unsigned JTI = 0, e = JT.size(); JTI != e; ++JTI) {
2765 const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
2766
2767 // If this jump table was deleted, ignore it.
2768 if (JTBBs.empty()) continue;
2769
2770 // For the EK_LabelDifference32 entry, if using .set avoids a relocation,
2771 /// emit a .set directive for each unique entry.
2777 for (const MachineBasicBlock *MBB : JTBBs) {
2778 if (!EmittedSets.insert(MBB).second)
2779 continue;
2780
2781 // .set LJTSet, LBB32-base
2782 const MCExpr *LHS =
2784 OutStreamer->emitAssignment(GetJTSetSymbol(JTI, MBB->getNumber()),
2786 OutContext));
2787 }
2788 }
2789
2790 // On some targets (e.g. Darwin) we want to emit two consecutive labels
2791 // before each jump table. The first label is never referenced, but tells
2792 // the assembler and linker the extents of the jump table object. The
2793 // second label is actually referenced by the code.
2794 if (JTInDiffSection && DL.hasLinkerPrivateGlobalPrefix())
2795 // FIXME: This doesn't have to have any specific name, just any randomly
2796 // named and numbered local label started with 'l' would work. Simplify
2797 // GetJTISymbol.
2798 OutStreamer->emitLabel(GetJTISymbol(JTI, true));
2799
2800 MCSymbol* JTISymbol = GetJTISymbol(JTI);
2801 OutStreamer->emitLabel(JTISymbol);
2802
2803 // Defer MCAssembler based constant folding due to a performance issue. The
2804 // label differences will be evaluated at write time.
2805 for (const MachineBasicBlock *MBB : JTBBs)
2806 emitJumpTableEntry(MJTI, MBB, JTI);
2807 }
2808 if (!JTInDiffSection)
2809 OutStreamer->emitDataRegion(MCDR_DataRegionEnd);
2810}
2811
2812/// EmitJumpTableEntry - Emit a jump table entry for the specified MBB to the
2813/// current stream.
2814void AsmPrinter::emitJumpTableEntry(const MachineJumpTableInfo *MJTI,
2815 const MachineBasicBlock *MBB,
2816 unsigned UID) const {
2817 assert(MBB && MBB->getNumber() >= 0 && "Invalid basic block");
2818 const MCExpr *Value = nullptr;
2819 switch (MJTI->getEntryKind()) {
2821 llvm_unreachable("Cannot emit EK_Inline jump table entry");
2824 MJTI, MBB, UID, OutContext);
2825 break;
2827 // EK_BlockAddress - Each entry is a plain address of block, e.g.:
2828 // .word LBB123
2830 break;
2832 // EK_GPRel32BlockAddress - Each entry is an address of block, encoded
2833 // with a relocation as gp-relative, e.g.:
2834 // .gprel32 LBB123
2835 MCSymbol *MBBSym = MBB->getSymbol();
2836 OutStreamer->emitGPRel32Value(MCSymbolRefExpr::create(MBBSym, OutContext));
2837 return;
2838 }
2839
2841 // EK_GPRel64BlockAddress - Each entry is an address of block, encoded
2842 // with a relocation as gp-relative, e.g.:
2843 // .gpdword LBB123
2844 MCSymbol *MBBSym = MBB->getSymbol();
2845 OutStreamer->emitGPRel64Value(MCSymbolRefExpr::create(MBBSym, OutContext));
2846 return;
2847 }
2848
2851 // Each entry is the address of the block minus the address of the jump
2852 // table. This is used for PIC jump tables where gprel32 is not supported.
2853 // e.g.:
2854 // .word LBB123 - LJTI1_2
2855 // If the .set directive avoids relocations, this is emitted as:
2856 // .set L4_5_set_123, LBB123 - LJTI1_2
2857 // .word L4_5_set_123
2861 OutContext);
2862 break;
2863 }
2868 break;
2869 }
2870 }
2871
2872 assert(Value && "Unknown entry kind!");
2873
2874 unsigned EntrySize = MJTI->getEntrySize(getDataLayout());
2875 OutStreamer->emitValue(Value, EntrySize);
2876}
2877
2878/// EmitSpecialLLVMGlobal - Check to see if the specified global is a
2879/// special global used by LLVM. If so, emit it and return true, otherwise
2880/// do nothing and return false.
2882 if (GV->getName() == "llvm.used") {
2883 if (MAI->hasNoDeadStrip()) // No need to emit this at all.
2884 emitLLVMUsedList(cast<ConstantArray>(GV->getInitializer()));
2885 return true;
2886 }
2887
2888 // Ignore debug and non-emitted data. This handles llvm.compiler.used.
2889 if (GV->getSection() == "llvm.metadata" ||
2891 return true;
2892
2893 if (GV->getName() == "llvm.arm64ec.symbolmap") {
2894 // For ARM64EC, print the table that maps between symbols and the
2895 // corresponding thunks to translate between x64 and AArch64 code.
2896 // This table is generated by AArch64Arm64ECCallLowering.
2897 OutStreamer->switchSection(
2899 auto *Arr = cast<ConstantArray>(GV->getInitializer());
2900 for (auto &U : Arr->operands()) {
2901 auto *C = cast<Constant>(U);
2902 auto *Src = cast<Function>(C->getOperand(0)->stripPointerCasts());
2903 auto *Dst = cast<Function>(C->getOperand(1)->stripPointerCasts());
2904 int Kind = cast<ConstantInt>(C->getOperand(2))->getZExtValue();
2905
2906 if (Src->hasDLLImportStorageClass()) {
2907 // For now, we assume dllimport functions aren't directly called.
2908 // (We might change this later to match MSVC.)
2909 OutStreamer->emitCOFFSymbolIndex(
2910 OutContext.getOrCreateSymbol("__imp_" + Src->getName()));
2911 OutStreamer->emitCOFFSymbolIndex(getSymbol(Dst));
2912 OutStreamer->emitInt32(Kind);
2913 } else {
2914 // FIXME: For non-dllimport functions, MSVC emits the same entry
2915 // twice, for reasons I don't understand. I have to assume the linker
2916 // ignores the redundant entry; there aren't any reasonable semantics
2917 // to attach to it.
2918 OutStreamer->emitCOFFSymbolIndex(getSymbol(Src));
2919 OutStreamer->emitCOFFSymbolIndex(getSymbol(Dst));
2920 OutStreamer->emitInt32(Kind);
2921 }
2922 }
2923 return true;
2924 }
2925
2926 if (!GV->hasAppendingLinkage()) return false;
2927
2928 assert(GV->hasInitializer() && "Not a special LLVM global!");
2929
2930 if (GV->getName() == "llvm.global_ctors") {
2932 /* isCtor */ true);
2933
2934 return true;
2935 }
2936
2937 if (GV->getName() == "llvm.global_dtors") {
2939 /* isCtor */ false);
2940
2941 return true;
2942 }
2943
2944 report_fatal_error("unknown special variable with appending linkage");
2945}
2946
2947/// EmitLLVMUsedList - For targets that define a MAI::UsedDirective, mark each
2948/// global in the specified llvm.used list.
2949void AsmPrinter::emitLLVMUsedList(const ConstantArray *InitList) {
2950 // Should be an array of 'i8*'.
2951 for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {
2952 const GlobalValue *GV =
2953 dyn_cast<GlobalValue>(InitList->getOperand(i)->stripPointerCasts());
2954 if (GV)
2955 OutStreamer->emitSymbolAttribute(getSymbol(GV), MCSA_NoDeadStrip);
2956 }
2957}
2958
2960 const Constant *List,
2961 SmallVector<Structor, 8> &Structors) {
2962 // Should be an array of '{ i32, void ()*, i8* }' structs. The first value is
2963 // the init priority.
2964 if (!isa<ConstantArray>(List))
2965 return;
2966
2967 // Gather the structors in a form that's convenient for sorting by priority.
2968 for (Value *O : cast<ConstantArray>(List)->operands()) {
2969 auto *CS = cast<ConstantStruct>(O);
2970 if (CS->getOperand(1)->isNullValue())
2971 break; // Found a null terminator, skip the rest.
2972 ConstantInt *Priority = dyn_cast<ConstantInt>(CS->getOperand(0));
2973 if (!Priority)
2974 continue; // Malformed.
2975 Structors.push_back(Structor());
2976 Structor &S = Structors.back();
2977 S.Priority = Priority->getLimitedValue(65535);
2978 S.Func = CS->getOperand(1);
2979 if (!CS->getOperand(2)->isNullValue()) {
2980 if (TM.getTargetTriple().isOSAIX())
2982 "associated data of XXStructor list is not yet supported on AIX");
2983 S.ComdatKey =
2984 dyn_cast<GlobalValue>(CS->getOperand(2)->stripPointerCasts());
2985 }
2986 }
2987
2988 // Emit the function pointers in the target-specific order
2989 llvm::stable_sort(Structors, [](const Structor &L, const Structor &R) {
2990 return L.Priority < R.Priority;
2991 });
2992}
2993
2994/// EmitXXStructorList - Emit the ctor or dtor list taking into account the init
2995/// priority.
2997 bool IsCtor) {
2998 SmallVector<Structor, 8> Structors;
2999 preprocessXXStructorList(DL, List, Structors);
3000 if (Structors.empty())
3001 return;
3002
3003 // Emit the structors in reverse order if we are using the .ctor/.dtor
3004 // initialization scheme.
3005 if (!TM.Options.UseInitArray)
3006 std::reverse(Structors.begin(), Structors.end());
3007
3008 const Align Align = DL.getPointerPrefAlignment();
3009 for (Structor &S : Structors) {
3011 const MCSymbol *KeySym = nullptr;
3012 if (GlobalValue *GV = S.ComdatKey) {
3013 if (GV->isDeclarationForLinker())
3014 // If the associated variable is not defined in this module
3015 // (it might be available_externally, or have been an
3016 // available_externally definition that was dropped by the
3017 // EliminateAvailableExternally pass), some other TU
3018 // will provide its dynamic initializer.
3019 continue;
3020
3021 KeySym = getSymbol(GV);
3022 }
3023
3024 MCSection *OutputSection =
3025 (IsCtor ? Obj.getStaticCtorSection(S.Priority, KeySym)
3026 : Obj.getStaticDtorSection(S.Priority, KeySym));
3027 OutStreamer->switchSection(OutputSection);
3028 if (OutStreamer->getCurrentSection() != OutStreamer->getPreviousSection())
3030 emitXXStructor(DL, S.Func);
3031 }
3032}
3033
3034void AsmPrinter::emitModuleIdents(Module &M) {
3035 if (!MAI->hasIdentDirective())
3036 return;
3037
3038 if (const NamedMDNode *NMD = M.getNamedMetadata("llvm.ident")) {
3039 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
3040 const MDNode *N = NMD->getOperand(i);
3041 assert(N->getNumOperands() == 1 &&
3042 "llvm.ident metadata entry can have only one operand");
3043 const MDString *S = cast<MDString>(N->getOperand(0));
3044 OutStreamer->emitIdent(S->getString());
3045 }
3046 }
3047}
3048
3049void AsmPrinter::emitModuleCommandLines(Module &M) {
3051 if (!CommandLine)
3052 return;
3053
3054 const NamedMDNode *NMD = M.getNamedMetadata("llvm.commandline");
3055 if (!NMD || !NMD->getNumOperands())
3056 return;
3057
3058 OutStreamer->pushSection();
3059 OutStreamer->switchSection(CommandLine);
3060 OutStreamer->emitZeros(1);
3061 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
3062 const MDNode *N = NMD->getOperand(i);
3063 assert(N->getNumOperands() == 1 &&
3064 "llvm.commandline metadata entry can have only one operand");
3065 const MDString *S = cast<MDString>(N->getOperand(0));
3066 OutStreamer->emitBytes(S->getString());
3067 OutStreamer->emitZeros(1);
3068 }
3069 OutStreamer->popSection();
3070}
3071
3072//===--------------------------------------------------------------------===//
3073// Emission and print routines
3074//
3075
3076/// Emit a byte directive and value.
3077///
3078void AsmPrinter::emitInt8(int Value) const { OutStreamer->emitInt8(Value); }
3079
3080/// Emit a short directive and value.
3081void AsmPrinter::emitInt16(int Value) const { OutStreamer->emitInt16(Value); }
3082
3083/// Emit a long directive and value.
3084void AsmPrinter::emitInt32(int Value) const { OutStreamer->emitInt32(Value); }
3085
3086/// EmitSLEB128 - emit the specified signed leb128 value.
3087void AsmPrinter::emitSLEB128(int64_t Value, const char *Desc) const {
3088 if (isVerbose() && Desc)
3089 OutStreamer->AddComment(Desc);
3090
3091 OutStreamer->emitSLEB128IntValue(Value);
3092}
3093
3095 unsigned PadTo) const {
3096 if (isVerbose() && Desc)
3097 OutStreamer->AddComment(Desc);
3098
3099 OutStreamer->emitULEB128IntValue(Value, PadTo);
3100}
3101
3102/// Emit a long long directive and value.
3104 OutStreamer->emitInt64(Value);
3105}
3106
3107/// Emit something like ".long Hi-Lo" where the size in bytes of the directive
3108/// is specified by Size and Hi/Lo specify the labels. This implicitly uses
3109/// .set if it avoids relocations.
3111 unsigned Size) const {
3112 OutStreamer->emitAbsoluteSymbolDiff(Hi, Lo, Size);
3113}
3114
3115/// Emit something like ".uleb128 Hi-Lo".
3117 const MCSymbol *Lo) const {
3118 OutStreamer->emitAbsoluteSymbolDiffAsULEB128(Hi, Lo);
3119}
3120
3121/// EmitLabelPlusOffset - Emit something like ".long Label+Offset"
3122/// where the size in bytes of the directive is specified by Size and Label
3123/// specifies the label. This implicitly uses .set if it is available.
3125 unsigned Size,
3126 bool IsSectionRelative) const {
3127 if (MAI->needsDwarfSectionOffsetDirective() && IsSectionRelative) {
3128 OutStreamer->emitCOFFSecRel32(Label, Offset);
3129 if (Size > 4)
3130 OutStreamer->emitZeros(Size - 4);
3131 return;
3132 }
3133
3134 // Emit Label+Offset (or just Label if Offset is zero)
3135 const MCExpr *Expr = MCSymbolRefExpr::create(Label, OutContext);
3136 if (Offset)
3139
3140 OutStreamer->emitValue(Expr, Size);
3141}
3142
3143//===----------------------------------------------------------------------===//
3144
3145// EmitAlignment - Emit an alignment directive to the specified power of
3146// two boundary. If a global value is specified, and if that global has
3147// an explicit alignment requested, it will override the alignment request
3148// if required for correctness.
3150 unsigned MaxBytesToEmit) const {
3151 if (GV)
3152 Alignment = getGVAlignment(GV, GV->getDataLayout(), Alignment);
3153
3154 if (Alignment == Align(1))
3155 return; // 1-byte aligned: no need to emit alignment.
3156
3157 if (getCurrentSection()->isText()) {
3158 const MCSubtargetInfo *STI = nullptr;
3159 if (this->MF)
3160 STI = &getSubtargetInfo();
3161 else
3162 STI = TM.getMCSubtargetInfo();
3163 OutStreamer->emitCodeAlignment(Alignment, STI, MaxBytesToEmit);
3164 } else
3165 OutStreamer->emitValueToAlignment(Alignment, 0, 1, MaxBytesToEmit);
3166}
3167
3168//===----------------------------------------------------------------------===//
3169// Constant emission.
3170//===----------------------------------------------------------------------===//
3171
3173 MCContext &Ctx = OutContext;
3174
3175 if (CV->isNullValue() || isa<UndefValue>(CV))
3176 return MCConstantExpr::create(0, Ctx);
3177
3178 if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV))
3179 return MCConstantExpr::create(CI->getZExtValue(), Ctx);
3180
3181 if (const ConstantPtrAuth *CPA = dyn_cast<ConstantPtrAuth>(CV))
3182 return lowerConstantPtrAuth(*CPA);
3183
3184 if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV))
3185 return MCSymbolRefExpr::create(getSymbol(GV), Ctx);
3186
3187 if (const BlockAddress *BA = dyn_cast<BlockAddress>(CV))
3189
3190 if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(CV))
3192
3193 if (const NoCFIValue *NC = dyn_cast<NoCFIValue>(CV))
3194 return MCSymbolRefExpr::create(getSymbol(NC->getGlobalValue()), Ctx);
3195
3196 const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV);
3197 if (!CE) {
3198 llvm_unreachable("Unknown constant value to lower!");
3199 }
3200
3201 // The constant expression opcodes are limited to those that are necessary
3202 // to represent relocations on supported targets. Expressions involving only
3203 // constant addresses are constant folded instead.
3204 switch (CE->getOpcode()) {
3205 default:
3206 break; // Error
3207 case Instruction::AddrSpaceCast: {
3208 const Constant *Op = CE->getOperand(0);
3209 unsigned DstAS = CE->getType()->getPointerAddressSpace();
3210 unsigned SrcAS = Op->getType()->getPointerAddressSpace();
3211 if (TM.isNoopAddrSpaceCast(SrcAS, DstAS))
3212 return lowerConstant(Op);
3213
3214 break; // Error
3215 }
3216 case Instruction::GetElementPtr: {
3217 // Generate a symbolic expression for the byte address
3218 APInt OffsetAI(getDataLayout().getPointerTypeSizeInBits(CE->getType()), 0);
3219 cast<GEPOperator>(CE)->accumulateConstantOffset(getDataLayout(), OffsetAI);
3220
3221 const MCExpr *Base = lowerConstant(CE->getOperand(0));
3222 if (!OffsetAI)
3223 return Base;
3224
3225 int64_t Offset = OffsetAI.getSExtValue();
3227 Ctx);
3228 }
3229
3230 case Instruction::Trunc:
3231 // We emit the value and depend on the assembler to truncate the generated
3232 // expression properly. This is important for differences between
3233 // blockaddress labels. Since the two labels are in the same function, it
3234 // is reasonable to treat their delta as a 32-bit value.
3235 [[fallthrough]];
3236 case Instruction::BitCast:
3237 return lowerConstant(CE->getOperand(0));
3238
3239 case Instruction::IntToPtr: {
3240 const DataLayout &DL = getDataLayout();
3241
3242 // Handle casts to pointers by changing them into casts to the appropriate
3243 // integer type. This promotes constant folding and simplifies this code.
3244 Constant *Op = CE->getOperand(0);
3245 Op = ConstantFoldIntegerCast(Op, DL.getIntPtrType(CV->getType()),
3246 /*IsSigned*/ false, DL);
3247 if (Op)
3248 return lowerConstant(Op);
3249
3250 break; // Error
3251 }
3252
3253 case Instruction::PtrToInt: {
3254 const DataLayout &DL = getDataLayout();
3255
3256 // Support only foldable casts to/from pointers that can be eliminated by
3257 // changing the pointer to the appropriately sized integer type.
3258 Constant *Op = CE->getOperand(0);
3259 Type *Ty = CE->getType();
3260
3261 const MCExpr *OpExpr = lowerConstant(Op);
3262
3263 // We can emit the pointer value into this slot if the slot is an
3264 // integer slot equal to the size of the pointer.
3265 //
3266 // If the pointer is larger than the resultant integer, then
3267 // as with Trunc just depend on the assembler to truncate it.
3268 if (DL.getTypeAllocSize(Ty).getFixedValue() <=
3269 DL.getTypeAllocSize(Op->getType()).getFixedValue())
3270 return OpExpr;
3271
3272 break; // Error
3273 }
3274
3275 case Instruction::Sub: {
3276 GlobalValue *LHSGV;
3277 APInt LHSOffset;
3278 DSOLocalEquivalent *DSOEquiv;
3279 if (IsConstantOffsetFromGlobal(CE->getOperand(0), LHSGV, LHSOffset,
3280 getDataLayout(), &DSOEquiv)) {
3281 GlobalValue *RHSGV;
3282 APInt RHSOffset;
3283 if (IsConstantOffsetFromGlobal(CE->getOperand(1), RHSGV, RHSOffset,
3284 getDataLayout())) {
3285 const MCExpr *RelocExpr =
3287 if (!RelocExpr) {
3288 const MCExpr *LHSExpr =
3290 if (DSOEquiv &&
3291 getObjFileLowering().supportDSOLocalEquivalentLowering())
3292 LHSExpr =
3294 RelocExpr = MCBinaryExpr::createSub(
3295 LHSExpr, MCSymbolRefExpr::create(getSymbol(RHSGV), Ctx), Ctx);
3296 }
3297 int64_t Addend = (LHSOffset - RHSOffset).getSExtValue();
3298 if (Addend != 0)
3299 RelocExpr = MCBinaryExpr::createAdd(
3300 RelocExpr, MCConstantExpr::create(Addend, Ctx), Ctx);
3301 return RelocExpr;
3302 }
3303 }
3304
3305 const MCExpr *LHS = lowerConstant(CE->getOperand(0));
3306 const MCExpr *RHS = lowerConstant(CE->getOperand(1));
3307 return MCBinaryExpr::createSub(LHS, RHS, Ctx);
3308 break;
3309 }
3310
3311 case Instruction::Add: {
3312 const MCExpr *LHS = lowerConstant(CE->getOperand(0));
3313 const MCExpr *RHS = lowerConstant(CE->getOperand(1));
3314 return MCBinaryExpr::createAdd(LHS, RHS, Ctx);
3315 }
3316 }
3317
3318 // If the code isn't optimized, there may be outstanding folding
3319 // opportunities. Attempt to fold the expression using DataLayout as a
3320 // last resort before giving up.
3322 if (C != CE)
3323 return lowerConstant(C);
3324
3325 // Otherwise report the problem to the user.
3326 std::string S;
3328 OS << "Unsupported expression in static initializer: ";
3329 CE->printAsOperand(OS, /*PrintType=*/false,
3330 !MF ? nullptr : MF->getFunction().getParent());
3331 report_fatal_error(Twine(OS.str()));
3332}
3333
3334static void emitGlobalConstantImpl(const DataLayout &DL, const Constant *C,
3335 AsmPrinter &AP,
3336 const Constant *BaseCV = nullptr,
3337 uint64_t Offset = 0,
3338 AsmPrinter::AliasMapTy *AliasList = nullptr);
3339
3340static void emitGlobalConstantFP(const ConstantFP *CFP, AsmPrinter &AP);
3341static void emitGlobalConstantFP(APFloat APF, Type *ET, AsmPrinter &AP);
3342
3343/// isRepeatedByteSequence - Determine whether the given value is
3344/// composed of a repeated sequence of identical bytes and return the
3345/// byte value. If it is not a repeated sequence, return -1.
3347 StringRef Data = V->getRawDataValues();
3348 assert(!Data.empty() && "Empty aggregates should be CAZ node");
3349 char C = Data[0];
3350 for (unsigned i = 1, e = Data.size(); i != e; ++i)
3351 if (Data[i] != C) return -1;
3352 return static_cast<uint8_t>(C); // Ensure 255 is not returned as -1.
3353}
3354
3355/// isRepeatedByteSequence - Determine whether the given value is
3356/// composed of a repeated sequence of identical bytes and return the
3357/// byte value. If it is not a repeated sequence, return -1.
3358static int isRepeatedByteSequence(const Value *V, const DataLayout &DL) {
3359 if (const ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
3360 uint64_t Size = DL.getTypeAllocSizeInBits(V->getType());
3361 assert(Size % 8 == 0);
3362
3363 // Extend the element to take zero padding into account.
3364 APInt Value = CI->getValue().zext(Size);
3365 if (!Value.isSplat(8))
3366 return -1;
3367
3368 return Value.zextOrTrunc(8).getZExtValue();
3369 }
3370 if (const ConstantArray *CA = dyn_cast<ConstantArray>(V)) {
3371 // Make sure all array elements are sequences of the same repeated
3372 // byte.
3373 assert(CA->getNumOperands() != 0 && "Should be a CAZ");
3374 Constant *Op0 = CA->getOperand(0);
3375 int Byte = isRepeatedByteSequence(Op0, DL);
3376 if (Byte == -1)
3377 return -1;
3378
3379 // All array elements must be equal.
3380 for (unsigned i = 1, e = CA->getNumOperands(); i != e; ++i)
3381 if (CA->getOperand(i) != Op0)
3382 return -1;
3383 return Byte;
3384 }
3385
3386 if (const ConstantDataSequential *CDS = dyn_cast<ConstantDataSequential>(V))
3387 return isRepeatedByteSequence(CDS);
3388
3389 return -1;
3390}
3391
3393 AsmPrinter::AliasMapTy *AliasList) {
3394 if (AliasList) {
3395 auto AliasIt = AliasList->find(Offset);
3396 if (AliasIt != AliasList->end()) {
3397 for (const GlobalAlias *GA : AliasIt->second)
3398 AP.OutStreamer->emitLabel(AP.getSymbol(GA));
3399 AliasList->erase(Offset);
3400 }
3401 }
3402}
3403
3405 const DataLayout &DL, const ConstantDataSequential *CDS, AsmPrinter &AP,
3406 AsmPrinter::AliasMapTy *AliasList) {
3407 // See if we can aggregate this into a .fill, if so, emit it as such.
3408 int Value = isRepeatedByteSequence(CDS, DL);
3409 if (Value != -1) {
3410 uint64_t Bytes = DL.getTypeAllocSize(CDS->getType());
3411 // Don't emit a 1-byte object as a .fill.
3412 if (Bytes > 1)
3413 return AP.OutStreamer->emitFill(Bytes, Value);
3414 }
3415
3416 // If this can be emitted with .ascii/.asciz, emit it as such.
3417 if (CDS->isString())
3418 return AP.OutStreamer->emitBytes(CDS->getAsString());
3419
3420 // Otherwise, emit the values in successive locations.
3421 unsigned ElementByteSize = CDS->getElementByteSize();
3422 if (isa<IntegerType>(CDS->getElementType())) {
3423 for (unsigned I = 0, E = CDS->getNumElements(); I != E; ++I) {
3424 emitGlobalAliasInline(AP, ElementByteSize * I, AliasList);
3425 if (AP.isVerbose())
3426 AP.OutStreamer->getCommentOS()
3427 << format("0x%" PRIx64 "\n", CDS->getElementAsInteger(I));
3428 AP.OutStreamer->emitIntValue(CDS->getElementAsInteger(I),
3429 ElementByteSize);
3430 }
3431 } else {
3432 Type *ET = CDS->getElementType();
3433 for (unsigned I = 0, E = CDS->getNumElements(); I != E; ++I) {
3434 emitGlobalAliasInline(AP, ElementByteSize * I, AliasList);
3436 }
3437 }
3438
3439 unsigned Size = DL.getTypeAllocSize(CDS->getType());
3440 unsigned EmittedSize =
3441 DL.getTypeAllocSize(CDS->getElementType()) * CDS->getNumElements();
3442 assert(EmittedSize <= Size && "Size cannot be less than EmittedSize!");
3443 if (unsigned Padding = Size - EmittedSize)
3444 AP.OutStreamer->emitZeros(Padding);
3445}
3446
3448 const ConstantArray *CA, AsmPrinter &AP,
3449 const Constant *BaseCV, uint64_t Offset,
3450 AsmPrinter::AliasMapTy *AliasList) {
3451 // See if we can aggregate some values. Make sure it can be
3452 // represented as a series of bytes of the constant value.
3453 int Value = isRepeatedByteSequence(CA, DL);
3454
3455 if (Value != -1) {
3456 uint64_t Bytes = DL.getTypeAllocSize(CA->getType());
3457 AP.OutStreamer->emitFill(Bytes, Value);
3458 } else {
3459 for (unsigned I = 0, E = CA->getNumOperands(); I != E; ++I) {
3460 emitGlobalConstantImpl(DL, CA->getOperand(I), AP, BaseCV, Offset,
3461 AliasList);
3462 Offset += DL.getTypeAllocSize(CA->getOperand(I)->getType());
3463 }
3464 }
3465}
3466
3467static void emitGlobalConstantLargeInt(const ConstantInt *CI, AsmPrinter &AP);
3468
3470 const ConstantVector *CV, AsmPrinter &AP,
3471 AsmPrinter::AliasMapTy *AliasList) {
3472 Type *ElementType = CV->getType()->getElementType();
3473 uint64_t ElementSizeInBits = DL.getTypeSizeInBits(ElementType);
3474 uint64_t ElementAllocSizeInBits = DL.getTypeAllocSizeInBits(ElementType);
3475 uint64_t EmittedSize;
3476 if (ElementSizeInBits != ElementAllocSizeInBits) {
3477 // If the allocation size of an element is different from the size in bits,
3478 // printing each element separately will insert incorrect padding.
3479 //
3480 // The general algorithm here is complicated; instead of writing it out
3481 // here, just use the existing code in ConstantFolding.
3482 Type *IntT =
3483 IntegerType::get(CV->getContext(), DL.getTypeSizeInBits(CV->getType()));
3484 ConstantInt *CI = dyn_cast_or_null<ConstantInt>(ConstantFoldConstant(
3485 ConstantExpr::getBitCast(const_cast<ConstantVector *>(CV), IntT), DL));
3486 if (!CI) {
3488 "Cannot lower vector global with unusual element type");
3489 }
3490 emitGlobalAliasInline(AP, 0, AliasList);
3492 EmittedSize = DL.getTypeStoreSize(CV->getType());
3493 } else {
3494 for (unsigned I = 0, E = CV->getType()->getNumElements(); I != E; ++I) {
3495 emitGlobalAliasInline(AP, DL.getTypeAllocSize(CV->getType()) * I, AliasList);
3497 }
3498 EmittedSize =
3499 DL.getTypeAllocSize(ElementType) * CV->getType()->getNumElements();
3500 }
3501
3502 unsigned Size = DL.getTypeAllocSize(CV->getType());
3503 if (unsigned Padding = Size - EmittedSize)
3504 AP.OutStreamer->emitZeros(Padding);
3505}
3506
3508 const ConstantStruct *CS, AsmPrinter &AP,
3509 const Constant *BaseCV, uint64_t Offset,
3510 AsmPrinter::AliasMapTy *AliasList) {
3511 // Print the fields in successive locations. Pad to align if needed!
3512 uint64_t Size = DL.getTypeAllocSize(CS->getType());
3513 const StructLayout *Layout = DL.getStructLayout(CS->getType());
3514 uint64_t SizeSoFar = 0;
3515 for (unsigned I = 0, E = CS->getNumOperands(); I != E; ++I) {
3516 const Constant *Field = CS->getOperand(I);
3517
3518 // Print the actual field value.
3519 emitGlobalConstantImpl(DL, Field, AP, BaseCV, Offset + SizeSoFar,
3520 AliasList);
3521
3522 // Check if padding is needed and insert one or more 0s.
3523 uint64_t FieldSize = DL.getTypeAllocSize(Field->getType());
3524 uint64_t PadSize = ((I == E - 1 ? Size : Layout->getElementOffset(I + 1)) -
3525 Layout->getElementOffset(I)) -
3526 FieldSize;
3527 SizeSoFar += FieldSize + PadSize;
3528
3529 // Insert padding - this may include padding to increase the size of the
3530 // current field up to the ABI size (if the struct is not packed) as well
3531 // as padding to ensure that the next field starts at the right offset.
3532 AP.OutStreamer->emitZeros(PadSize);
3533 }
3534 assert(SizeSoFar == Layout->getSizeInBytes() &&
3535 "Layout of constant struct may be incorrect!");
3536}
3537
3538static void emitGlobalConstantFP(APFloat APF, Type *ET, AsmPrinter &AP) {
3539 assert(ET && "Unknown float type");
3540 APInt API = APF.bitcastToAPInt();
3541
3542 // First print a comment with what we think the original floating-point value
3543 // should have been.
3544 if (AP.isVerbose()) {
3545 SmallString<8> StrVal;
3546 APF.toString(StrVal);
3547 ET->print(AP.OutStreamer->getCommentOS());
3548 AP.OutStreamer->getCommentOS() << ' ' << StrVal << '\n';
3549 }
3550
3551 // Now iterate through the APInt chunks, emitting them in endian-correct
3552 // order, possibly with a smaller chunk at beginning/end (e.g. for x87 80-bit
3553 // floats).
3554 unsigned NumBytes = API.getBitWidth() / 8;
3555 unsigned TrailingBytes = NumBytes % sizeof(uint64_t);
3556 const uint64_t *p = API.getRawData();
3557
3558 // PPC's long double has odd notions of endianness compared to how LLVM
3559 // handles it: p[0] goes first for *big* endian on PPC.
3560 if (AP.getDataLayout().isBigEndian() && !ET->isPPC_FP128Ty()) {
3561 int Chunk = API.getNumWords() - 1;
3562
3563 if (TrailingBytes)
3564 AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk--], TrailingBytes);
3565
3566 for (; Chunk >= 0; --Chunk)
3567 AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk], sizeof(uint64_t));
3568 } else {
3569 unsigned Chunk;
3570 for (Chunk = 0; Chunk < NumBytes / sizeof(uint64_t); ++Chunk)
3571 AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk], sizeof(uint64_t));
3572
3573 if (TrailingBytes)
3574 AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk], TrailingBytes);
3575 }
3576
3577 // Emit the tail padding for the long double.
3578 const DataLayout &DL = AP.getDataLayout();
3579 AP.OutStreamer->emitZeros(DL.getTypeAllocSize(ET) - DL.getTypeStoreSize(ET));
3580}
3581
3582static void emitGlobalConstantFP(const ConstantFP *CFP, AsmPrinter &AP) {
3583 emitGlobalConstantFP(CFP->getValueAPF(), CFP->getType(), AP);
3584}
3585
3587 const DataLayout &DL = AP.getDataLayout();
3588 unsigned BitWidth = CI->getBitWidth();
3589
3590 // Copy the value as we may massage the layout for constants whose bit width
3591 // is not a multiple of 64-bits.
3592 APInt Realigned(CI->getValue());
3593 uint64_t ExtraBits = 0;
3594 unsigned ExtraBitsSize = BitWidth & 63;
3595
3596 if (ExtraBitsSize) {
3597 // The bit width of the data is not a multiple of 64-bits.
3598 // The extra bits are expected to be at the end of the chunk of the memory.
3599 // Little endian:
3600 // * Nothing to be done, just record the extra bits to emit.
3601 // Big endian:
3602 // * Record the extra bits to emit.
3603 // * Realign the raw data to emit the chunks of 64-bits.
3604 if (DL.isBigEndian()) {
3605 // Basically the structure of the raw data is a chunk of 64-bits cells:
3606 // 0 1 BitWidth / 64
3607 // [chunk1][chunk2] ... [chunkN].
3608 // The most significant chunk is chunkN and it should be emitted first.
3609 // However, due to the alignment issue chunkN contains useless bits.
3610 // Realign the chunks so that they contain only useful information:
3611 // ExtraBits 0 1 (BitWidth / 64) - 1
3612 // chu[nk1 chu][nk2 chu] ... [nkN-1 chunkN]
3613 ExtraBitsSize = alignTo(ExtraBitsSize, 8);
3614 ExtraBits = Realigned.getRawData()[0] &
3615 (((uint64_t)-1) >> (64 - ExtraBitsSize));
3616 if (BitWidth >= 64)
3617 Realigned.lshrInPlace(ExtraBitsSize);
3618 } else
3619 ExtraBits = Realigned.getRawData()[BitWidth / 64];
3620 }
3621
3622 // We don't expect assemblers to support integer data directives
3623 // for more than 64 bits, so we emit the data in at most 64-bit
3624 // quantities at a time.
3625 const uint64_t *RawData = Realigned.getRawData();
3626 for (unsigned i = 0, e = BitWidth / 64; i != e; ++i) {
3627 uint64_t Val = DL.isBigEndian() ? RawData[e - i - 1] : RawData[i];
3628 AP.OutStreamer->emitIntValue(Val, 8);
3629 }
3630
3631 if (ExtraBitsSize) {
3632 // Emit the extra bits after the 64-bits chunks.
3633
3634 // Emit a directive that fills the expected size.
3636 Size -= (BitWidth / 64) * 8;
3637 assert(Size && Size * 8 >= ExtraBitsSize &&
3638 (ExtraBits & (((uint64_t)-1) >> (64 - ExtraBitsSize)))
3639 == ExtraBits && "Directive too small for extra bits.");
3640 AP.OutStreamer->emitIntValue(ExtraBits, Size);
3641 }
3642}
3643
3644/// Transform a not absolute MCExpr containing a reference to a GOT
3645/// equivalent global, by a target specific GOT pc relative access to the
3646/// final symbol.
3648 const Constant *BaseCst,
3649 uint64_t Offset) {
3650 // The global @foo below illustrates a global that uses a got equivalent.
3651 //
3652 // @bar = global i32 42
3653 // @gotequiv = private unnamed_addr constant i32* @bar
3654 // @foo = i32 trunc (i64 sub (i64 ptrtoint (i32** @gotequiv to i64),
3655 // i64 ptrtoint (i32* @foo to i64))
3656 // to i32)
3657 //
3658 // The cstexpr in @foo is converted into the MCExpr `ME`, where we actually
3659 // check whether @foo is suitable to use a GOTPCREL. `ME` is usually in the
3660 // form:
3661 //
3662 // foo = cstexpr, where
3663 // cstexpr := <gotequiv> - "." + <cst>
3664 // cstexpr := <gotequiv> - (<foo> - <offset from @foo base>) + <cst>
3665 //
3666 // After canonicalization by evaluateAsRelocatable `ME` turns into:
3667 //
3668 // cstexpr := <gotequiv> - <foo> + gotpcrelcst, where
3669 // gotpcrelcst := <offset from @foo base> + <cst>
3670 MCValue MV;
3671 if (!(*ME)->evaluateAsRelocatable(MV, nullptr, nullptr) || MV.isAbsolute())
3672 return;
3673 const MCSymbolRefExpr *SymA = MV.getSymA();
3674 if (!SymA)
3675 return;
3676
3677 // Check that GOT equivalent symbol is cached.
3678 const MCSymbol *GOTEquivSym = &SymA->getSymbol();
3679 if (!AP.GlobalGOTEquivs.count(GOTEquivSym))
3680 return;
3681
3682 const GlobalValue *BaseGV = dyn_cast_or_null<GlobalValue>(BaseCst);
3683 if (!BaseGV)
3684 return;
3685
3686 // Check for a valid base symbol
3687 const MCSymbol *BaseSym = AP.getSymbol(BaseGV);
3688 const MCSymbolRefExpr *SymB = MV.getSymB();
3689
3690 if (!SymB || BaseSym != &SymB->getSymbol())
3691 return;
3692
3693 // Make sure to match:
3694 //
3695 // gotpcrelcst := <offset from @foo base> + <cst>
3696 //
3697 int64_t GOTPCRelCst = Offset + MV.getConstant();
3698 if (!AP.getObjFileLowering().supportGOTPCRelWithOffset() && GOTPCRelCst != 0)
3699 return;
3700
3701 // Emit the GOT PC relative to replace the got equivalent global, i.e.:
3702 //
3703 // bar:
3704 // .long 42
3705 // gotequiv:
3706 // .quad bar
3707 // foo:
3708 // .long gotequiv - "." + <cst>
3709 //
3710 // is replaced by the target specific equivalent to:
3711 //
3712 // bar:
3713 // .long 42
3714 // foo:
3715 // .long bar@GOTPCREL+<gotpcrelcst>
3716 AsmPrinter::GOTEquivUsePair Result = AP.GlobalGOTEquivs[GOTEquivSym];
3717 const GlobalVariable *GV = Result.first;
3718 int NumUses = (int)Result.second;
3719 const GlobalValue *FinalGV = dyn_cast<GlobalValue>(GV->getOperand(0));
3720 const MCSymbol *FinalSym = AP.getSymbol(FinalGV);
3722 FinalGV, FinalSym, MV, Offset, AP.MMI, *AP.OutStreamer);
3723
3724 // Update GOT equivalent usage information
3725 --NumUses;
3726 if (NumUses >= 0)
3727 AP.GlobalGOTEquivs[GOTEquivSym] = std::make_pair(GV, NumUses);
3728}
3729
3730static void emitGlobalConstantImpl(const DataLayout &DL, const Constant *CV,
3731 AsmPrinter &AP, const Constant *BaseCV,
3733 AsmPrinter::AliasMapTy *AliasList) {
3734 emitGlobalAliasInline(AP, Offset, AliasList);
3735 uint64_t Size = DL.getTypeAllocSize(CV->getType());
3736
3737 // Globals with sub-elements such as combinations of arrays and structs
3738 // are handled recursively by emitGlobalConstantImpl. Keep track of the
3739 // constant symbol base and the current position with BaseCV and Offset.
3740 if (!BaseCV && CV->hasOneUse())
3741 BaseCV = dyn_cast<Constant>(CV->user_back());
3742
3743 if (isa<ConstantAggregateZero>(CV) || isa<UndefValue>(CV))
3744 return AP.OutStreamer->emitZeros(Size);
3745
3746 if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
3747 const uint64_t StoreSize = DL.getTypeStoreSize(CV->getType());
3748
3749 if (StoreSize <= 8) {
3750 if (AP.isVerbose())
3751 AP.OutStreamer->getCommentOS()
3752 << format("0x%" PRIx64 "\n", CI->getZExtValue());
3753 AP.OutStreamer->emitIntValue(CI->getZExtValue(), StoreSize);
3754 } else {
3756 }
3757
3758 // Emit tail padding if needed
3759 if (Size != StoreSize)
3760 AP.OutStreamer->emitZeros(Size - StoreSize);
3761
3762 return;
3763 }
3764
3765 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV))
3766 return emitGlobalConstantFP(CFP, AP);
3767
3768 if (isa<ConstantPointerNull>(CV)) {
3769 AP.OutStreamer->emitIntValue(0, Size);
3770 return;
3771 }
3772
3773 if (const ConstantDataSequential *CDS = dyn_cast<ConstantDataSequential>(CV))
3774 return emitGlobalConstantDataSequential(DL, CDS, AP, AliasList);
3775
3776 if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV))
3777 return emitGlobalConstantArray(DL, CVA, AP, BaseCV, Offset, AliasList);
3778
3779 if (const ConstantStruct *CVS = dyn_cast<ConstantStruct>(CV))
3780 return emitGlobalConstantStruct(DL, CVS, AP, BaseCV, Offset, AliasList);
3781
3782 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) {
3783 // Look through bitcasts, which might not be able to be MCExpr'ized (e.g. of
3784 // vectors).
3785 if (CE->getOpcode() == Instruction::BitCast)
3786 return emitGlobalConstantImpl(DL, CE->getOperand(0), AP);
3787
3788 if (Size > 8) {
3789 // If the constant expression's size is greater than 64-bits, then we have
3790 // to emit the value in chunks. Try to constant fold the value and emit it
3791 // that way.
3792 Constant *New = ConstantFoldConstant(CE, DL);
3793 if (New != CE)
3794 return emitGlobalConstantImpl(DL, New, AP);
3795 }
3796 }
3797
3798 if (const ConstantVector *V = dyn_cast<ConstantVector>(CV))
3799 return emitGlobalConstantVector(DL, V, AP, AliasList);
3800
3801 // Otherwise, it must be a ConstantExpr. Lower it to an MCExpr, then emit it
3802 // thread the streamer with EmitValue.
3803 const MCExpr *ME = AP.lowerConstant(CV);
3804
3805 // Since lowerConstant already folded and got rid of all IR pointer and
3806 // integer casts, detect GOT equivalent accesses by looking into the MCExpr
3807 // directly.
3809 handleIndirectSymViaGOTPCRel(AP, &ME, BaseCV, Offset);
3810
3811 AP.OutStreamer->emitValue(ME, Size);
3812}
3813
3814/// EmitGlobalConstant - Print a general LLVM constant to the .s file.
3816 AliasMapTy *AliasList) {
3817 uint64_t Size = DL.getTypeAllocSize(CV->getType());
3818 if (Size)
3819 emitGlobalConstantImpl(DL, CV, *this, nullptr, 0, AliasList);
3820 else if (MAI->hasSubsectionsViaSymbols()) {
3821 // If the global has zero size, emit a single byte so that two labels don't
3822 // look like they are at the same location.
3823 OutStreamer->emitIntValue(0, 1);
3824 }
3825 if (!AliasList)
3826 return;
3827 // TODO: These remaining aliases are not emitted in the correct location. Need
3828 // to handle the case where the alias offset doesn't refer to any sub-element.
3829 for (auto &AliasPair : *AliasList) {
3830 for (const GlobalAlias *GA : AliasPair.second)
3831 OutStreamer->emitLabel(getSymbol(GA));
3832 }
3833}
3834
3836 // Target doesn't support this yet!
3837 llvm_unreachable("Target does not support EmitMachineConstantPoolValue");
3838}
3839
3841 if (Offset > 0)
3842 OS << '+' << Offset;
3843 else if (Offset < 0)
3844 OS << Offset;
3845}
3846
3847void AsmPrinter::emitNops(unsigned N) {
3849 for (; N; --N)
3851}
3852
3853//===----------------------------------------------------------------------===//
3854// Symbol Lowering Routines.
3855//===----------------------------------------------------------------------===//
3856
3858 return OutContext.createTempSymbol(Name, true);
3859}
3860
3862 return const_cast<AsmPrinter *>(this)->getAddrLabelSymbol(
3863 BA->getBasicBlock());
3864}
3865
3867 return const_cast<AsmPrinter *>(this)->getAddrLabelSymbol(BB);
3868}
3869
3870/// GetCPISymbol - Return the symbol for the specified constant pool entry.
3871MCSymbol *AsmPrinter::GetCPISymbol(unsigned CPID) const {
3872 if (getSubtargetInfo().getTargetTriple().isWindowsMSVCEnvironment()) {
3873 const MachineConstantPoolEntry &CPE =
3874 MF->getConstantPool()->getConstants()[CPID];
3875 if (!CPE.isMachineConstantPoolEntry()) {
3876 const DataLayout &DL = MF->getDataLayout();
3877 SectionKind Kind = CPE.getSectionKind(&DL);
3878 const Constant *C = CPE.Val.ConstVal;
3879 Align Alignment = CPE.Alignment;
3880 if (const MCSectionCOFF *S = dyn_cast<MCSectionCOFF>(
3881 getObjFileLowering().getSectionForConstant(DL, Kind, C,
3882 Alignment))) {
3883 if (MCSymbol *Sym = S->getCOMDATSymbol()) {
3884 if (Sym->isUndefined())
3885 OutStreamer->emitSymbolAttribute(Sym, MCSA_Global);
3886 return Sym;
3887 }
3888 }
3889 }
3890 }
3891
3892 const DataLayout &DL = getDataLayout();
3893 return OutContext.getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
3894 "CPI" + Twine(getFunctionNumber()) + "_" +
3895 Twine(CPID));
3896}
3897
3898/// GetJTISymbol - Return the symbol for the specified jump table entry.
3899MCSymbol *AsmPrinter::GetJTISymbol(unsigned JTID, bool isLinkerPrivate) const {
3900 return MF->getJTISymbol(JTID, OutContext, isLinkerPrivate);
3901}
3902
3903/// GetJTSetSymbol - Return the symbol for the specified jump table .set
3904/// FIXME: privatize to AsmPrinter.
3905MCSymbol *AsmPrinter::GetJTSetSymbol(unsigned UID, unsigned MBBID) const {
3906 const DataLayout &DL = getDataLayout();
3907 return OutContext.getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
3908 Twine(getFunctionNumber()) + "_" +
3909 Twine(UID) + "_set_" + Twine(MBBID));
3910}
3911
3913 StringRef Suffix) const {
3915}
3916
3917/// Return the MCSymbol for the specified ExternalSymbol.
3919 SmallString<60> NameStr;
3921 return OutContext.getOrCreateSymbol(NameStr);
3922}
3923
3924/// PrintParentLoopComment - Print comments about parent loops of this one.
3926 unsigned FunctionNumber) {
3927 if (!Loop) return;
3928 PrintParentLoopComment(OS, Loop->getParentLoop(), FunctionNumber);
3930 << "Parent Loop BB" << FunctionNumber << "_"
3931 << Loop->getHeader()->getNumber()
3932 << " Depth=" << Loop->getLoopDepth() << '\n';
3933}
3934
3935/// PrintChildLoopComment - Print comments about child loops within
3936/// the loop for this basic block, with nesting.
3938 unsigned FunctionNumber) {
3939 // Add child loop information
3940 for (const MachineLoop *CL : *Loop) {
3941 OS.indent(CL->getLoopDepth()*2)
3942 << "Child Loop BB" << FunctionNumber << "_"
3943 << CL->getHeader()->getNumber() << " Depth " << CL->getLoopDepth()
3944 << '\n';
3945 PrintChildLoopComment(OS, CL, FunctionNumber);
3946 }
3947}
3948
3949/// emitBasicBlockLoopComments - Pretty-print comments for basic blocks.
3951 const MachineLoopInfo *LI,
3952 const AsmPrinter &AP) {
3953 // Add loop depth information
3954 const MachineLoop *Loop = LI->getLoopFor(&MBB);
3955 if (!Loop) return;
3956
3957 MachineBasicBlock *Header = Loop->getHeader();
3958 assert(Header && "No header for loop");
3959
3960 // If this block is not a loop header, just print out what is the loop header
3961 // and return.
3962 if (Header != &MBB) {
3963 AP.OutStreamer->AddComment(" in Loop: Header=BB" +
3964 Twine(AP.getFunctionNumber())+"_" +
3965 Twine(Loop->getHeader()->getNumber())+
3966 " Depth="+Twine(Loop->getLoopDepth()));
3967 return;
3968 }
3969
3970 // Otherwise, it is a loop header. Print out information about child and
3971 // parent loops.
3972 raw_ostream &OS = AP.OutStreamer->getCommentOS();
3973
3975
3976 OS << "=>";
3977 OS.indent(Loop->getLoopDepth()*2-2);
3978
3979 OS << "This ";
3980 if (Loop->isInnermost())
3981 OS << "Inner ";
3982 OS << "Loop Header: Depth=" + Twine(Loop->getLoopDepth()) << '\n';
3983
3985}
3986
3987/// emitBasicBlockStart - This method prints the label for the specified
3988/// MachineBasicBlock, an alignment (if present) and a comment describing
3989/// it if appropriate.
3991 // End the previous funclet and start a new one.
3992 if (MBB.isEHFuncletEntry()) {
3993 for (const HandlerInfo &HI : Handlers) {
3994 HI.Handler->endFunclet();
3995 HI.Handler->beginFunclet(MBB);
3996 }
3997 }
3998
3999 // Switch to a new section if this basic block must begin a section. The
4000 // entry block is always placed in the function section and is handled
4001 // separately.
4002 if (MBB.isBeginSection() && !MBB.isEntryBlock()) {
4003 OutStreamer->switchSection(
4004 getObjFileLowering().getSectionForMachineBasicBlock(MF->getFunction(),
4005 MBB, TM));
4006 CurrentSectionBeginSym = MBB.getSymbol();
4007 }
4008
4009 // Emit an alignment directive for this block, if needed.
4010 const Align Alignment = MBB.getAlignment();
4011 if (Alignment != Align(1))
4012 emitAlignment(Alignment, nullptr, MBB.getMaxBytesForAlignment());
4013
4014 // If the block has its address taken, emit any labels that were used to
4015 // reference the block. It is possible that there is more than one label
4016 // here, because multiple LLVM BB's may have been RAUW'd to this block after
4017 // the references were generated.
4018 if (MBB.isIRBlockAddressTaken()) {
4019 if (isVerbose())
4020 OutStreamer->AddComment("Block address taken");
4021
4023 assert(BB && BB->hasAddressTaken() && "Missing BB");
4025 OutStreamer->emitLabel(Sym);
4026 } else if (isVerbose() && MBB.isMachineBlockAddressTaken()) {
4027 OutStreamer->AddComment("Block address taken");
4028 }
4029
4030 // Print some verbose block comments.
4031 if (isVerbose()) {
4032 if (const BasicBlock *BB = MBB.getBasicBlock()) {
4033 if (BB->hasName()) {
4034 BB->printAsOperand(OutStreamer->getCommentOS(),
4035 /*PrintType=*/false, BB->getModule());
4036 OutStreamer->getCommentOS() << '\n';
4037 }
4038 }
4039
4040 assert(MLI != nullptr && "MachineLoopInfo should has been computed");
4042 }
4043
4044 // Print the main label for the block.
4045 if (shouldEmitLabelForBasicBlock(MBB)) {
4047 OutStreamer->AddComment("Label of block must be emitted");
4048 OutStreamer->emitLabel(MBB.getSymbol());
4049 } else {
4050 if (isVerbose()) {
4051 // NOTE: Want this comment at start of line, don't emit with AddComment.
4052 OutStreamer->emitRawComment(" %bb." + Twine(MBB.getNumber()) + ":",
4053 false);
4054 }
4055 }
4056
4057 if (MBB.isEHCatchretTarget() &&
4059 OutStreamer->emitLabel(MBB.getEHCatchretSymbol());
4060 }
4061
4062 // With BB sections, each basic block must handle CFI information on its own
4063 // if it begins a section (Entry block call is handled separately, next to
4064 // beginFunction).
4065 if (MBB.isBeginSection() && !MBB.isEntryBlock())
4066 for (const HandlerInfo &HI : Handlers)
4067 HI.Handler->beginBasicBlockSection(MBB);
4068}
4069
4071 // Check if CFI information needs to be updated for this MBB with basic block
4072 // sections.
4073 if (MBB.isEndSection())
4074 for (const HandlerInfo &HI : Handlers)
4075 HI.Handler->endBasicBlockSection(MBB);
4076}
4077
4078void AsmPrinter::emitVisibility(MCSymbol *Sym, unsigned Visibility,
4079 bool IsDefinition) const {
4081
4082 switch (Visibility) {
4083 default: break;
4085 if (IsDefinition)
4086 Attr = MAI->getHiddenVisibilityAttr();
4087 else
4089 break;
4092 break;
4093 }
4094
4095 if (Attr != MCSA_Invalid)
4096 OutStreamer->emitSymbolAttribute(Sym, Attr);
4097}
4098
4099bool AsmPrinter::shouldEmitLabelForBasicBlock(
4100 const MachineBasicBlock &MBB) const {
4101 // With `-fbasic-block-sections=`, a label is needed for every non-entry block
4102 // in the labels mode (option `=labels`) and every section beginning in the
4103 // sections mode (`=all` and `=list=`).
4104 if ((MF->hasBBLabels() || MF->getTarget().Options.BBAddrMap ||
4105 MBB.isBeginSection()) &&
4106 !MBB.isEntryBlock())
4107 return true;
4108 // A label is needed for any block with at least one predecessor (when that
4109 // predecessor is not the fallthrough predecessor, or if it is an EH funclet
4110 // entry, or if a label is forced).
4111 return !MBB.pred_empty() &&
4114}
4115
4116/// isBlockOnlyReachableByFallthough - Return true if the basic block has
4117/// exactly one predecessor and the control transfer mechanism between
4118/// the predecessor and this block is a fall-through.
4121 // If this is a landing pad, it isn't a fall through. If it has no preds,
4122 // then nothing falls through to it.
4123 if (MBB->isEHPad() || MBB->pred_empty())
4124 return false;
4125
4126 // If there isn't exactly one predecessor, it can't be a fall through.
4127 if (MBB->pred_size() > 1)
4128 return false;
4129
4130 // The predecessor has to be immediately before this block.
4131 MachineBasicBlock *Pred = *MBB->pred_begin();
4132 if (!Pred->isLayoutSuccessor(MBB))
4133 return false;
4134
4135 // If the block is completely empty, then it definitely does fall through.
4136 if (Pred->empty())
4137 return true;
4138
4139 // Check the terminators in the previous blocks
4140 for (const auto &MI : Pred->terminators()) {
4141 // If it is not a simple branch, we are in a table somewhere.
4142 if (!MI.isBranch() || MI.isIndirectBranch())
4143 return false;
4144
4145 // If we are the operands of one of the branches, this is not a fall
4146 // through. Note that targets with delay slots will usually bundle
4147 // terminators with the delay slot instruction.
4148 for (ConstMIBundleOperands OP(MI); OP.isValid(); ++OP) {
4149 if (OP->isJTI())
4150 return false;
4151 if (OP->isMBB() && OP->getMBB() == MBB)
4152 return false;
4153 }
4154 }
4155
4156 return true;
4157}
4158
4159GCMetadataPrinter *AsmPrinter::getOrCreateGCPrinter(GCStrategy &S) {
4160 if (!S.usesMetadata())
4161 return nullptr;
4162
4163 auto [GCPI, Inserted] = GCMetadataPrinters.insert({&S, nullptr});
4164 if (!Inserted)
4165 return GCPI->second.get();
4166
4167 auto Name = S.getName();
4168
4169 for (const GCMetadataPrinterRegistry::entry &GCMetaPrinter :
4171 if (Name == GCMetaPrinter.getName()) {
4172 std::unique_ptr<GCMetadataPrinter> GMP = GCMetaPrinter.instantiate();
4173 GMP->S = &S;
4174 GCPI->second = std::move(GMP);
4175 return GCPI->second.get();
4176 }
4177
4178 report_fatal_error("no GCMetadataPrinter registered for GC: " + Twine(Name));
4179}
4180
4182 GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
4183 assert(MI && "AsmPrinter didn't require GCModuleInfo?");
4184 bool NeedsDefault = false;
4185 if (MI->begin() == MI->end())
4186 // No GC strategy, use the default format.
4187 NeedsDefault = true;
4188 else
4189 for (const auto &I : *MI) {
4190 if (GCMetadataPrinter *MP = getOrCreateGCPrinter(*I))
4191 if (MP->emitStackMaps(SM, *this))
4192 continue;
4193 // The strategy doesn't have printer or doesn't emit custom stack maps.
4194 // Use the default format.
4195 NeedsDefault = true;
4196 }
4197
4198 if (NeedsDefault)
4200}
4201
4202/// Pin vtable to this file.
4204
4206
4207// In the binary's "xray_instr_map" section, an array of these function entries
4208// describes each instrumentation point. When XRay patches your code, the index
4209// into this table will be given to your handler as a patch point identifier.
4211 auto Kind8 = static_cast<uint8_t>(Kind);
4212 Out->emitBinaryData(StringRef(reinterpret_cast<const char *>(&Kind8), 1));
4213 Out->emitBinaryData(
4214 StringRef(reinterpret_cast<const char *>(&AlwaysInstrument), 1));
4215 Out->emitBinaryData(StringRef(reinterpret_cast<const char *>(&Version), 1));
4216 auto Padding = (4 * Bytes) - ((2 * Bytes) + 3);
4217 assert(Padding >= 0 && "Instrumentation map entry > 4 * Word Size");
4218 Out->emitZeros(Padding);
4219}
4220
4222 if (Sleds.empty())
4223 return;
4224
4225 auto PrevSection = OutStreamer->getCurrentSectionOnly();
4226 const Function &F = MF->getFunction();
4227 MCSection *InstMap = nullptr;
4228 MCSection *FnSledIndex = nullptr;
4229 const Triple &TT = TM.getTargetTriple();
4230 // Use PC-relative addresses on all targets.
4231 if (TT.isOSBinFormatELF()) {
4232 auto LinkedToSym = cast<MCSymbolELF>(CurrentFnSym);
4233 auto Flags = ELF::SHF_ALLOC | ELF::SHF_LINK_ORDER;
4234 StringRef GroupName;
4235 if (F.hasComdat()) {
4236 Flags |= ELF::SHF_GROUP;
4237 GroupName = F.getComdat()->getName();
4238 }
4239 InstMap = OutContext.getELFSection("xray_instr_map", ELF::SHT_PROGBITS,
4240 Flags, 0, GroupName, F.hasComdat(),
4241 MCSection::NonUniqueID, LinkedToSym);
4242
4244 FnSledIndex = OutContext.getELFSection(
4245 "xray_fn_idx", ELF::SHT_PROGBITS, Flags, 0, GroupName, F.hasComdat(),
4246 MCSection::NonUniqueID, LinkedToSym);
4248 InstMap = OutContext.getMachOSection("__DATA", "xray_instr_map",
4252 FnSledIndex = OutContext.getMachOSection("__DATA", "xray_fn_idx",
4255 } else {
4256 llvm_unreachable("Unsupported target");
4257 }
4258
4259 auto WordSizeBytes = MAI->getCodePointerSize();
4260
4261 // Now we switch to the instrumentation map section. Because this is done
4262 // per-function, we are able to create an index entry that will represent the
4263 // range of sleds associated with a function.
4264 auto &Ctx = OutContext;
4265 MCSymbol *SledsStart =
4266 OutContext.createLinkerPrivateSymbol("xray_sleds_start");
4267 OutStreamer->switchSection(InstMap);
4268 OutStreamer->emitLabel(SledsStart);
4269 for (const auto &Sled : Sleds) {
4270 MCSymbol *Dot = Ctx.createTempSymbol();
4271 OutStreamer->emitLabel(Dot);
4272 OutStreamer->emitValueImpl(
4274 MCSymbolRefExpr::create(Dot, Ctx), Ctx),
4275 WordSizeBytes);
4276 OutStreamer->emitValueImpl(
4280 MCConstantExpr::create(WordSizeBytes, Ctx),
4281 Ctx),
4282 Ctx),
4283 WordSizeBytes);
4284 Sled.emit(WordSizeBytes, OutStreamer.get());
4285 }
4286 MCSymbol *SledsEnd = OutContext.createTempSymbol("xray_sleds_end", true);
4287 OutStreamer->emitLabel(SledsEnd);
4288
4289 // We then emit a single entry in the index per function. We use the symbols
4290 // that bound the instrumentation map as the range for a specific function.
4291 // Each entry here will be 2 * word size aligned, as we're writing down two
4292 // pointers. This should work for both 32-bit and 64-bit platforms.
4293 if (FnSledIndex) {
4294 OutStreamer->switchSection(FnSledIndex);
4295 OutStreamer->emitCodeAlignment(Align(2 * WordSizeBytes),
4296 &getSubtargetInfo());
4297 // For Mach-O, use an "l" symbol as the atom of this subsection. The label
4298 // difference uses a SUBTRACTOR external relocation which references the
4299 // symbol.
4300 MCSymbol *Dot = Ctx.createLinkerPrivateSymbol("xray_fn_idx");
4301 OutStreamer->emitLabel(Dot);
4302 OutStreamer->emitValueImpl(
4304 MCSymbolRefExpr::create(Dot, Ctx), Ctx),
4305 WordSizeBytes);
4306 OutStreamer->emitValueImpl(MCConstantExpr::create(Sleds.size(), Ctx),
4307 WordSizeBytes);
4308 OutStreamer->switchSection(PrevSection);
4309 }
4310 Sleds.clear();
4311}
4312
4314 SledKind Kind, uint8_t Version) {
4315 const Function &F = MI.getMF()->getFunction();
4316 auto Attr = F.getFnAttribute("function-instrument");
4317 bool LogArgs = F.hasFnAttribute("xray-log-args");
4318 bool AlwaysInstrument =
4319 Attr.isStringAttribute() && Attr.getValueAsString() == "xray-always";
4320 if (Kind == SledKind::FUNCTION_ENTER && LogArgs)
4322 Sleds.emplace_back(XRayFunctionEntry{Sled, CurrentFnSym, Kind,
4323 AlwaysInstrument, &F, Version});
4324}
4325
4327 const Function &F = MF->getFunction();
4328 unsigned PatchableFunctionPrefix = 0, PatchableFunctionEntry = 0;
4329 (void)F.getFnAttribute("patchable-function-prefix")
4330 .getValueAsString()
4331 .getAsInteger(10, PatchableFunctionPrefix);
4332 (void)F.getFnAttribute("patchable-function-entry")
4333 .getValueAsString()
4334 .getAsInteger(10, PatchableFunctionEntry);
4335 if (!PatchableFunctionPrefix && !PatchableFunctionEntry)
4336 return;
4337 const unsigned PointerSize = getPointerSize();
4339 auto Flags = ELF::SHF_WRITE | ELF::SHF_ALLOC;
4340 const MCSymbolELF *LinkedToSym = nullptr;
4341 StringRef GroupName;
4342
4343 // GNU as < 2.35 did not support section flag 'o'. GNU ld < 2.36 did not
4344 // support mixed SHF_LINK_ORDER and non-SHF_LINK_ORDER sections.
4345 if (MAI->useIntegratedAssembler() || MAI->binutilsIsAtLeast(2, 36)) {
4346 Flags |= ELF::SHF_LINK_ORDER;
4347 if (F.hasComdat()) {
4348 Flags |= ELF::SHF_GROUP;
4349 GroupName = F.getComdat()->getName();
4350 }
4351 LinkedToSym = cast<MCSymbolELF>(CurrentFnSym);
4352 }
4353 OutStreamer->switchSection(OutContext.getELFSection(
4354 "__patchable_function_entries", ELF::SHT_PROGBITS, Flags, 0, GroupName,
4355 F.hasComdat(), MCSection::NonUniqueID, LinkedToSym));
4356 emitAlignment(Align(PointerSize));
4357 OutStreamer->emitSymbolValue(CurrentPatchableFunctionEntrySym, PointerSize);
4358 }
4359}
4360
4362 return OutStreamer->getContext().getDwarfVersion();
4363}
4364
4366 OutStreamer->getContext().setDwarfVersion(Version);
4367}
4368
4370 return OutStreamer->getContext().getDwarfFormat() == dwarf::DWARF64;
4371}
4372
4375 OutStreamer->getContext().getDwarfFormat());
4376}
4377
4379 return {getDwarfVersion(), uint8_t(MAI->getCodePointerSize()),
4380 OutStreamer->getContext().getDwarfFormat(),
4382}
4383
4386 OutStreamer->getContext().getDwarfFormat());
4387}
4388
4389std::tuple<const MCSymbol *, uint64_t, const MCSymbol *,
4392 const MCSymbol *BranchLabel) const {
4393 const auto TLI = MF->getSubtarget().getTargetLowering();
4394 const auto BaseExpr =
4396 const auto Base = &cast<MCSymbolRefExpr>(BaseExpr)->getSymbol();
4397
4398 // By default, for the architectures that support CodeView,
4399 // EK_LabelDifference32 is implemented as an Int32 from the base address.
4400 return std::make_tuple(Base, 0, BranchLabel,
4402}
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
static bool emitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP)
emitDebugValueComment - This method handles the target-independent form of DBG_VALUE,...
static llvm::object::BBAddrMap::Features getBBAddrMapFeature(const MachineFunction &MF, int NumMBBSectionRanges)
const char CFGuardDescription[]
Definition: AsmPrinter.cpp:166
const char CFGuardName[]
Definition: AsmPrinter.cpp:165
static void emitGlobalConstantVector(const DataLayout &DL, const ConstantVector *CV, AsmPrinter &AP, AsmPrinter::AliasMapTy *AliasList)
static cl::bits< PGOMapFeaturesEnum > PgoAnalysisMapFeatures("pgo-analysis-map", cl::Hidden, cl::CommaSeparated, cl::values(clEnumValN(PGOMapFeaturesEnum::FuncEntryCount, "func-entry-count", "Function Entry Count"), clEnumValN(PGOMapFeaturesEnum::BBFreq, "bb-freq", "Basic Block Frequency"), clEnumValN(PGOMapFeaturesEnum::BrProb, "br-prob", "Branch Probability")), cl::desc("Enable extended information within the SHT_LLVM_BB_ADDR_MAP that is " "extracted from PGO related analysis."))
static uint32_t getBBAddrMapMetadata(const MachineBasicBlock &MBB)
Returns the BB metadata to be emitted in the SHT_LLVM_BB_ADDR_MAP section for a given basic block.
static void emitGlobalConstantFP(const ConstantFP *CFP, AsmPrinter &AP)
static bool isGOTEquivalentCandidate(const GlobalVariable *GV, unsigned &NumGOTEquivUsers)
Only consider global GOT equivalents if at least one user is a cstexpr inside an initializer of anoth...
static unsigned getNumGlobalVariableUses(const Constant *C)
Compute the number of Global Variables that uses a Constant.
const char EHTimerDescription[]
Definition: AsmPrinter.cpp:164
const char PPTimerName[]
Definition: AsmPrinter.cpp:169
const char CodeViewLineTablesGroupDescription[]
Definition: AsmPrinter.cpp:168
static void emitBasicBlockLoopComments(const MachineBasicBlock &MBB, const MachineLoopInfo *LI, const AsmPrinter &AP)
emitBasicBlockLoopComments - Pretty-print comments for basic blocks.
static bool needFuncLabels(const MachineFunction &MF)
Returns true if function begin and end labels should be emitted.
static void handleIndirectSymViaGOTPCRel(AsmPrinter &AP, const MCExpr **ME, const Constant *BaseCst, uint64_t Offset)
Transform a not absolute MCExpr containing a reference to a GOT equivalent global,...
static int isRepeatedByteSequence(const ConstantDataSequential *V)
isRepeatedByteSequence - Determine whether the given value is composed of a repeated sequence of iden...
static void emitGlobalAliasInline(AsmPrinter &AP, uint64_t Offset, AsmPrinter::AliasMapTy *AliasList)
const char PPGroupDescription[]
Definition: AsmPrinter.cpp:172
const char PPTimerDescription[]
Definition: AsmPrinter.cpp:170
const char EHTimerName[]
Definition: AsmPrinter.cpp:163
const char PPGroupName[]
Definition: AsmPrinter.cpp:171
const char DWARFGroupDescription[]
Definition: AsmPrinter.cpp:160
static void PrintChildLoopComment(raw_ostream &OS, const MachineLoop *Loop, unsigned FunctionNumber)
PrintChildLoopComment - Print comments about child loops within the loop for this basic block,...
PGOMapFeaturesEnum
Definition: AsmPrinter.cpp:142
const char CodeViewLineTablesGroupName[]
Definition: AsmPrinter.cpp:167
static void PrintParentLoopComment(raw_ostream &OS, const MachineLoop *Loop, unsigned FunctionNumber)
PrintParentLoopComment - Print comments about parent loops of this one.
static void emitGlobalConstantStruct(const DataLayout &DL, const ConstantStruct *CS, AsmPrinter &AP, const Constant *BaseCV, uint64_t Offset, AsmPrinter::AliasMapTy *AliasList)
static void emitGlobalConstantDataSequential(const DataLayout &DL, const ConstantDataSequential *CDS, AsmPrinter &AP, AsmPrinter::AliasMapTy *AliasList)
static void emitKill(const MachineInstr *MI, AsmPrinter &AP)
const char DbgTimerName[]
Definition: AsmPrinter.cpp:161
const char DbgTimerDescription[]
Definition: AsmPrinter.cpp:162
static void emitGlobalConstantImpl(const DataLayout &DL, const Constant *C, AsmPrinter &AP, const Constant *BaseCV=nullptr, uint64_t Offset=0, AsmPrinter::AliasMapTy *AliasList=nullptr)
const char DWARFGroupName[]
Definition: AsmPrinter.cpp:159
static void emitComments(const MachineInstr &MI, raw_ostream &CommentOS)
emitComments - Pretty-print comments for instructions.
static bool emitDebugLabelComment(const MachineInstr *MI, AsmPrinter &AP)
This method handles the target-independent form of DBG_LABEL, returning true if it was able to do so.
static bool canBeHidden(const GlobalValue *GV, const MCAsmInfo &MAI)
Definition: AsmPrinter.cpp:654
static void emitGlobalConstantArray(const DataLayout &DL, const ConstantArray *CA, AsmPrinter &AP, const Constant *BaseCV, uint64_t Offset, AsmPrinter::AliasMapTy *AliasList)
static void emitGlobalConstantLargeInt(const ConstantInt *CI, AsmPrinter &AP)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
Definition: CommandLine.h:686
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Looks at all the uses of the given value Returns the Liveness deduced from the uses of this value Adds all uses that cause the result to be MaybeLive to MaybeLiveRetUses If the result is MaybeLiveUses might be modified but its content should be ignored(since it might not be complete). DeadArgumentEliminationPass
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
std::string Name
uint64_t Size
Symbol * Sym
Definition: ELF_riscv.cpp:479
#define DEBUG_TYPE
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
===- LazyMachineBlockFrequencyInfo.h - Lazy Block Frequency -*- C++ -*–===//
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
#define G(x, y, z)
Definition: MD5.cpp:56
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
===- MachineOptimizationRemarkEmitter.h - Opt Diagnostics -*- C++ -*-—===//
static cl::opt< std::string > OutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename"), cl::init("-"))
This file provides utility analysis objects describing memory locations.
This file contains the declarations for metadata subclasses.
Module.h This file contains the declarations for the Module class.
if(VerifyEach)
const char LLVMTargetMachineRef TM
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file contains some templates that are useful if you are working with the STL at all.
raw_pwrite_stream & OS
This file defines the SmallPtrSet class.
This file defines the SmallString class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition: Statistic.h:167
This file contains some functions that are useful when dealing with strings.
This file describes how to lower LLVM code to machine code.
Value * RHS
Value * LHS
opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition: APFloat.cpp:5282
double convertToDouble() const
Converts this APFloat to host double value.
Definition: APFloat.cpp:5341
void toString(SmallVectorImpl< char > &Str, unsigned FormatPrecision=0, unsigned FormatMaxPadding=3, bool TruncateZero=true) const
Definition: APFloat.h:1378
APInt bitcastToAPInt() const
Definition: APFloat.h:1254
Class for arbitrary precision integers.
Definition: APInt.h:77
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition: APInt.h:1447
unsigned getNumWords() const
Get the number of words.
Definition: APInt.h:1454
const uint64_t * getRawData() const
This function returns a pointer to the internal storage of the APInt.
Definition: APInt.h:548
int64_t getSExtValue() const
Get sign extended value.
Definition: APInt.h:1521
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition: APInt.h:837
AddrLabelMap(MCContext &context)
Definition: AsmPrinter.cpp:220
void UpdateForRAUWBlock(BasicBlock *Old, BasicBlock *New)
Definition: AsmPrinter.cpp:321
void takeDeletedSymbolsForFunction(Function *F, std::vector< MCSymbol * > &Result)
If we have any deleted symbols for F, return them.
Definition: AsmPrinter.cpp:260
void UpdateForDeletedBlock(BasicBlock *BB)
Definition: AsmPrinter.cpp:294
ArrayRef< MCSymbol * > getAddrLabelSymbolToEmit(BasicBlock *BB)
Definition: AsmPrinter.cpp:236
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
virtual ~AsmPrinterHandler()
Pin vtable to this file.
virtual void markFunctionEnd()
This class is intended to be used as a driving class for all asm writers.
Definition: AsmPrinter.h:85
virtual void emitInstruction(const MachineInstr *)
Targets should implement this to emit instructions.
Definition: AsmPrinter.h:568
const TargetLoweringObjectFile & getObjFileLowering() const
Return information about object file lowering.
Definition: AsmPrinter.cpp:399
MCSymbol * getSymbolWithGlobalValueBase(const GlobalValue *GV, StringRef Suffix) const
Return the MCSymbol for a private symbol with global value name as its base, with the specified suffi...
MCSymbol * getSymbol(const GlobalValue *GV) const
Definition: AsmPrinter.cpp:706
void emitULEB128(uint64_t Value, const char *Desc=nullptr, unsigned PadTo=0) const
Emit the specified unsigned leb128 value.
SmallVector< XRayFunctionEntry, 4 > Sleds
Definition: AsmPrinter.h:369
bool isDwarf64() const
void emitNops(unsigned N)
Emit N NOP instructions.
MCSymbol * CurrentFnBegin
Definition: AsmPrinter.h:201
MachineLoopInfo * MLI
This is a pointer to the current MachineLoopInfo.
Definition: AsmPrinter.h:112
virtual void emitDebugValue(const MCExpr *Value, unsigned Size) const
Emit the directive and value for debug thread local expression.
Definition: AsmPrinter.cpp:930
void EmitToStreamer(MCStreamer &S, const MCInst &Inst)
Definition: AsmPrinter.cpp:419
virtual void emitConstantPool()
Print to the current output stream assembly representations of the constants in the constant pool MCP...
virtual void emitGlobalVariable(const GlobalVariable *GV)
Emit the specified global variable to the .s file.
Definition: AsmPrinter.cpp:728
virtual const MCExpr * lowerConstantPtrAuth(const ConstantPtrAuth &CPA)
Definition: AsmPrinter.h:589
unsigned int getUnitLengthFieldByteSize() const
Returns 4 for DWARF32 and 12 for DWARF64.
void emitLabelPlusOffset(const MCSymbol *Label, uint64_t Offset, unsigned Size, bool IsSectionRelative=false) const
Emit something like ".long Label+Offset" where the size in bytes of the directive is specified by Siz...
~AsmPrinter() override
Definition: AsmPrinter.cpp:385
TargetMachine & TM
Target machine description.
Definition: AsmPrinter.h:88
void emitXRayTable()
Emit a table with all XRay instrumentation points.
virtual void emitBasicBlockEnd(const MachineBasicBlock &MBB)
Targets can override this to emit stuff at the end of a basic block.
MCSymbol * CurrentFnDescSym
The symbol for the current function descriptor on AIX.
Definition: AsmPrinter.h:126
MCSymbol * CurrentFnBeginLocal
For dso_local functions, the current $local alias for the function.
Definition: AsmPrinter.h:204
MapVector< const MCSymbol *, GOTEquivUsePair > GlobalGOTEquivs
Definition: AsmPrinter.h:144
virtual MCSymbol * GetCPISymbol(unsigned CPID) const
Return the symbol for the specified constant pool entry.
void emitGlobalGOTEquivs()
Constant expressions using GOT equivalent globals may not be eligible for PC relative GOT entry conve...
MCSymbol * getFunctionBegin() const
Definition: AsmPrinter.h:275
void emitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo, unsigned Size) const
Emit something like ".long Hi-Lo" where the size in bytes of the directive is specified by Size and H...
void emitKCFITrapEntry(const MachineFunction &MF, const MCSymbol *Symbol)
virtual void emitMachOIFuncStubHelperBody(Module &M, const GlobalIFunc &GI, MCSymbol *LazyPointer)
Definition: AsmPrinter.h:617
MCSymbol * getMBBExceptionSym(const MachineBasicBlock &MBB)
MCSymbol * getAddrLabelSymbol(const BasicBlock *BB)
Return the symbol to be used for the specified basic block when its address is taken.
Definition: AsmPrinter.h:285
const MCAsmInfo * MAI
Target Asm Printer information.
Definition: AsmPrinter.h:91
bool emitSpecialLLVMGlobal(const GlobalVariable *GV)
Check to see if the specified global is a special global used by LLVM.
MachineFunction * MF
The current machine function.
Definition: AsmPrinter.h:103
virtual void emitJumpTableInfo()
Print assembly representations of the jump tables used by the current function to the current output ...
void computeGlobalGOTEquivs(Module &M)
Unnamed constant global variables solely contaning a pointer to another globals variable act like a g...
static Align getGVAlignment(const GlobalObject *GV, const DataLayout &DL, Align InAlign=Align(1))
Return the alignment for the specified GV.
Definition: AsmPrinter.cpp:352
void emitInt8(int Value) const
Emit a byte directive and value.
CFISection getFunctionCFISectionType(const Function &F) const
Get the CFISection type for a function.
virtual void SetupMachineFunction(MachineFunction &MF)
This should be called when a new MachineFunction is being processed from runOnMachineFunction.
void emitFunctionBody()
This method emits the body and trailer for a function.
virtual bool isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const
Return true if the basic block has exactly one predecessor and the control transfer mechanism between...
void emitBBAddrMapSection(const MachineFunction &MF)
void emitPCSections(const MachineFunction &MF)
Emits the PC sections collected from instructions.
MapVector< unsigned, MBBSectionRange > MBBSectionRanges
Definition: AsmPrinter.h:139
MachineDominatorTree * MDT
This is a pointer to the current MachineDominatorTree.
Definition: AsmPrinter.h:109
virtual void emitStartOfAsmFile(Module &)
This virtual method can be overridden by targets that want to emit something at the start of their fi...
Definition: AsmPrinter.h:544
MCSymbol * GetJTISymbol(unsigned JTID, bool isLinkerPrivate=false) const
Return the symbol for the specified jump table entry.
virtual void emitMachineConstantPoolValue(MachineConstantPoolValue *MCPV)
void emitStackMaps()
Emit the stack maps.
virtual void emitFunctionBodyStart()
Targets can override this to emit stuff before the first basic block in the function.
Definition: AsmPrinter.h:552
std::pair< const GlobalVariable *, unsigned > GOTEquivUsePair
Map global GOT equivalent MCSymbols to GlobalVariables and keep track of its number of uses by other ...
Definition: AsmPrinter.h:143
void emitPatchableFunctionEntries()
void recordSled(MCSymbol *Sled, const MachineInstr &MI, SledKind Kind, uint8_t Version=0)
virtual void emitEndOfAsmFile(Module &)
This virtual method can be overridden by targets that want to emit something at the end of their file...
Definition: AsmPrinter.h:548
bool doInitialization(Module &M) override
Set up the AsmPrinter when we are working on a new module.
Definition: AsmPrinter.cpp:450
MCSymbol * GetJTSetSymbol(unsigned UID, unsigned MBBID) const
Return the symbol for the specified jump table .set FIXME: privatize to AsmPrinter.
virtual void emitMachOIFuncStubBody(Module &M, const GlobalIFunc &GI, MCSymbol *LazyPointer)
Definition: AsmPrinter.h:611
virtual void emitImplicitDef(const MachineInstr *MI) const
Targets can override this to customize the output of IMPLICIT_DEF instructions in verbose mode.
virtual void emitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const
This emits linkage information about GVSym based on GV, if this is supported by the target.
Definition: AsmPrinter.cpp:661
void getAnalysisUsage(AnalysisUsage &AU) const override
Record analysis usage.
Definition: AsmPrinter.cpp:441
unsigned getFunctionNumber() const
Return a unique ID for the current function.
Definition: AsmPrinter.cpp:395
MachineOptimizationRemarkEmitter * ORE
Optimization remark emitter.
Definition: AsmPrinter.h:115
virtual bool shouldEmitWeakSwiftAsyncExtendedFramePointerFlags() const
Definition: AsmPrinter.h:916
void printOffset(int64_t Offset, raw_ostream &OS) const
This is just convenient handler for printing offsets.
void emitGlobalConstant(const DataLayout &DL, const Constant *CV, AliasMapTy *AliasList=nullptr)
EmitGlobalConstant - Print a general LLVM constant to the .s file.
void emitFrameAlloc(const MachineInstr &MI)
void emitStackSizeSection(const MachineFunction &MF)
MCSymbol * getSymbolPreferLocal(const GlobalValue &GV) const
Similar to getSymbol() but preferred for references.
Definition: AsmPrinter.cpp:710
MCSymbol * CurrentFnSym
The symbol for the current function.
Definition: AsmPrinter.h:122
MachineModuleInfo * MMI
This is a pointer to the current MachineModuleInfo.
Definition: AsmPrinter.h:106
void emitSLEB128(int64_t Value, const char *Desc=nullptr) const
Emit the specified signed leb128 value.
void emitAlignment(Align Alignment, const GlobalObject *GV=nullptr, unsigned MaxBytesToEmit=0) const
Emit an alignment directive to the specified power of two boundary.
MCContext & OutContext
This is the context for the output file that we are streaming.
Definition: AsmPrinter.h:95
void emitCFIInstruction(const MachineInstr &MI)
MCSymbol * createTempSymbol(const Twine &Name) const
bool doFinalization(Module &M) override
Shut down the asmprinter.
MCSymbol * GetExternalSymbolSymbol(Twine Sym) const
Return the MCSymbol for the specified ExternalSymbol.
virtual const MCSubtargetInfo * getIFuncMCSubtargetInfo() const
getSubtargetInfo() cannot be used where this is needed because we don't have a MachineFunction when w...
Definition: AsmPrinter.h:607
void emitStackUsage(const MachineFunction &MF)
virtual void emitKCFITypeId(const MachineFunction &MF)
bool isPositionIndependent() const
Definition: AsmPrinter.cpp:390
virtual void emitXXStructorList(const DataLayout &DL, const Constant *List, bool IsCtor)
This method emits llvm.global_ctors or llvm.global_dtors list.
void emitPCSectionsLabel(const MachineFunction &MF, const MDNode &MD)
Emits a label as reference for PC sections.
MCSymbol * CurrentPatchableFunctionEntrySym
The symbol for the entry in __patchable_function_entires.
Definition: AsmPrinter.h:118
virtual void emitBasicBlockStart(const MachineBasicBlock &MBB)
Targets can override this to emit stuff at the start of a basic block.
void takeDeletedSymbolsForFunction(const Function *F, std::vector< MCSymbol * > &Result)
If the specified function has had any references to address-taken blocks generated,...
Definition: AsmPrinter.cpp:285
void emitVisibility(MCSymbol *Sym, unsigned Visibility, bool IsDefinition=true) const
This emits visibility information about symbol, if this is supported by the target.
void emitInt32(int Value) const
Emit a long directive and value.
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
Definition: AsmPrinter.h:100
virtual const MCExpr * lowerConstant(const Constant *CV)
Lower the specified LLVM Constant to an MCExpr.
virtual void emitFunctionDescriptor()
Definition: AsmPrinter.h:577
const MCSection * getCurrentSection() const
Return the current section we are emitting to.
Definition: AsmPrinter.cpp:437
unsigned int getDwarfOffsetByteSize() const
Returns 4 for DWARF32 and 8 for DWARF64.
size_t NumUserHandlers
Definition: AsmPrinter.h:209
MCSymbol * CurrentFnSymForSize
The symbol used to represent the start of the current function for the purpose of calculating its siz...
Definition: AsmPrinter.h:131
bool isVerbose() const
Return true if assembly output should contain comments.
Definition: AsmPrinter.h:266
MCSymbol * getFunctionEnd() const
Definition: AsmPrinter.h:276
virtual void emitXXStructor(const DataLayout &DL, const Constant *CV)
Targets can override this to change how global constants that are part of a C++ static/global constru...
Definition: AsmPrinter.h:585
void preprocessXXStructorList(const DataLayout &DL, const Constant *List, SmallVector< Structor, 8 > &Structors)
This method gathers an array of Structors and then sorts them out by Priority.
void emitInt16(int Value) const
Emit a short directive and value.
void setDwarfVersion(uint16_t Version)
void getNameWithPrefix(SmallVectorImpl< char > &Name, const GlobalValue *GV) const
Definition: AsmPrinter.cpp:701
void emitPseudoProbe(const MachineInstr &MI)
unsigned getPointerSize() const
Return the pointer size from the TargetMachine.
Definition: AsmPrinter.cpp:410
void emitRemarksSection(remarks::RemarkStreamer &RS)
StackMaps SM
Definition: AsmPrinter.h:211
MCSymbol * GetBlockAddressSymbol(const BlockAddress *BA) const
Return the MCSymbol used to satisfy BlockAddress uses of the specified basic block.
ArrayRef< MCSymbol * > getAddrLabelSymbolToEmit(const BasicBlock *BB)
Return the symbol to be used for the specified basic block when its address is taken.
Definition: AsmPrinter.cpp:277
virtual void emitFunctionBodyEnd()
Targets can override this to emit stuff after the last basic block in the function.
Definition: AsmPrinter.h:556
const DataLayout & getDataLayout() const
Return information about data layout.
Definition: AsmPrinter.cpp:403
virtual void emitFunctionEntryLabel()
EmitFunctionEntryLabel - Emit the label that is the entrypoint for the function.
void emitInitialRawDwarfLocDirective(const MachineFunction &MF)
Emits inital debug location directive.
Definition: AsmPrinter.cpp:423
void emitInt64(uint64_t Value) const
Emit a long long directive and value.
uint16_t getDwarfVersion() const
dwarf::FormParams getDwarfFormParams() const
Returns information about the byte size of DW_FORM values.
const MCSubtargetInfo & getSubtargetInfo() const
Return information about subtarget.
Definition: AsmPrinter.cpp:414
bool usesCFIWithoutEH() const
Since emitting CFI unwind information is entangled with supporting the exceptions,...
bool doesDwarfUseRelocationsAcrossSections() const
Definition: AsmPrinter.h:331
@ None
Do not emit either .eh_frame or .debug_frame.
@ Debug
Emit .debug_frame.
virtual std::tuple< const MCSymbol *, uint64_t, const MCSymbol *, codeview::JumpTableEntrySize > getCodeViewJumpTableInfo(int JTI, const MachineInstr *BranchInstr, const MCSymbol *BranchLabel) const
Gets information required to create a CodeView debug symbol for a jump table.
void emitLabelDifferenceAsULEB128(const MCSymbol *Hi, const MCSymbol *Lo) const
Emit something like ".uleb128 Hi-Lo".
AsmPrinter(TargetMachine &TM, std::unique_ptr< MCStreamer > Streamer)
Definition: AsmPrinter.cpp:376
std::vector< HandlerInfo > Handlers
A vector of all debug/EH info emitters we should use.
Definition: AsmPrinter.h:208
LLVM Basic Block Representation.
Definition: BasicBlock.h:61
bool hasAddressTaken() const
Returns true if there are any uses of this basic block other than direct branches,...
Definition: BasicBlock.h:648
const Function * getParent() const
Return the enclosing method, or null if none.
Definition: BasicBlock.h:209
The address of a basic block.
Definition: Constants.h:890
BasicBlock * getBasicBlock() const
Definition: Constants.h:919
uint64_t getFrequency() const
Returns the frequency as a fixpoint number scaled by the entry frequency.
uint32_t getNumerator() const
Value handle with callbacks on RAUW and destruction.
Definition: ValueHandle.h:383
virtual void allUsesReplacedWith(Value *)
Callback for Value RAUW.
Definition: ValueHandle.h:423
virtual void deleted()
Callback for Value destruction.
Definition: ValueHandle.h:414
ConstMIBundleOperands - Iterate over all operands in a const bundle of machine instructions.
ConstantArray - Constant Array Declarations.
Definition: Constants.h:424
ArrayType * getType() const
Specialize the getType() method to always return an ArrayType, which reduces the amount of casting ne...
Definition: Constants.h:443
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
Definition: Constants.h:584
StringRef getAsString() const
If this array is isString(), then this method returns the array as a StringRef.
Definition: Constants.h:659
uint64_t getElementByteSize() const
Return the size (in bytes) of each element in the array/vector.
Definition: Constants.cpp:2774
bool isString(unsigned CharSize=8) const
This method returns true if this is an array of CharSize integers.
Definition: Constants.cpp:3117
uint64_t getElementAsInteger(unsigned i) const
If this is a sequential container of integers (of any size), return the specified element in the low ...
Definition: Constants.cpp:3024
unsigned getNumElements() const
Return the number of elements in the array or vector.
Definition: Constants.cpp:2767
Type * getElementType() const
Return the element type of the array/vector.
Definition: Constants.cpp:2741
APFloat getElementAsAPFloat(unsigned i) const
If this is a sequential container of floating point type, return the specified element as an APFloat.
Definition: Constants.cpp:3072
A constant value that is initialized with an expression using other constant values.
Definition: Constants.h:1084
static Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
Definition: Constants.cpp:2245
ConstantFP - Floating Point Values [float, double].
Definition: Constants.h:269
const APFloat & getValueAPF() const
Definition: Constants.h:312
This is the shared class of boolean and integer constants.
Definition: Constants.h:81
uint64_t getLimitedValue(uint64_t Limit=~0ULL) const
getLimitedValue - If the value is smaller than the specified limit, return it, otherwise return the l...
Definition: Constants.h:256
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition: Constants.h:149
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition: Constants.h:146
A signed pointer, in the ptrauth sense.
Definition: Constants.h:1012
StructType * getType() const
Specialization - reduce amount of casting.
Definition: Constants.h:495
Constant Vector Declarations.
Definition: Constants.h:508
FixedVectorType * getType() const
Specialize the getType() method to always return a FixedVectorType, which reduces the amount of casti...
Definition: Constants.h:531
This is an important base class in LLVM.
Definition: Constant.h:41
const Constant * stripPointerCasts() const
Definition: Constant.h:213
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition: Constants.cpp:90
DWARF expression.
iterator_range< expr_op_iterator > expr_ops() const
unsigned getNumElements() const
static std::optional< const DIExpression * > convertToNonVariadicExpression(const DIExpression *Expr)
If Expr is a valid single-location expression, i.e.
Debug location.
Subprogram description.
Wrapper for a function that represents a value that functionally represents the original function.
Definition: Constants.h:936
This class represents an Operation in the Expression.
bool print(raw_ostream &OS, DIDumpOptions DumpOpts, const DWARFExpression *Expr, DWARFUnit *U) const
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:110
bool isBigEndian() const
Definition: DataLayout.h:239
TypeSize getTypeStoreSize(Type *Ty) const
Returns the maximum number of bytes that may be overwritten by storing the specified type.
Definition: DataLayout.h:472
A debug info location.
Definition: DebugLoc.h:33
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:155
bool erase(const KeyT &Val)
Definition: DenseMap.h:345
bool empty() const
Definition: DenseMap.h:98
iterator end()
Definition: DenseMap.h:84
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition: DenseMap.h:220
Collects and handles dwarf debug information.
Definition: DwarfDebug.h:351
DebugLoc emitInitialLocDirective(const MachineFunction &MF, unsigned CUID)
Emits inital debug location directive.
Emits exception handling directives.
Definition: EHStreamer.h:30
unsigned getNumElements() const
Definition: DerivedTypes.h:582
DISubprogram * getSubprogram() const
Get the attached subprogram.
Definition: Metadata.cpp:1830
bool hasPersonalityFn() const
Check whether this function has a personality function.
Definition: Function.h:868
Constant * getPersonalityFn() const
Get the personality function associated with this function.
Definition: Function.cpp:1934
std::optional< ProfileCount > getEntryCount(bool AllowSynthetic=false) const
Get the entry count for this function.
Definition: Function.cpp:2019
bool needsUnwindTableEntry() const
True if this function needs an unwind table.
Definition: Function.h:673
GCMetadataPrinter - Emits GC metadata as assembly code.
An analysis pass which caches information about the entire Module.
Definition: GCMetadata.h:203
GCStrategy describes a garbage collector algorithm's code generation requirements,...
Definition: GCStrategy.h:63
bool usesMetadata() const
If set, appropriate metadata tables must be emitted by the back-end (assembler, JIT,...
Definition: GCStrategy.h:118
const std::string & getName() const
Return the name of the GC strategy.
Definition: GCStrategy.h:88
const GlobalObject * getAliaseeObject() const
Definition: Globals.cpp:582
const Constant * getAliasee() const
Definition: GlobalAlias.h:84
const Function * getResolverFunction() const
Definition: Globals.cpp:611
const Constant * getResolver() const
Definition: GlobalIFunc.h:70
StringRef getSection() const
Get the custom section of this global if it has one.
Definition: GlobalObject.h:118
MaybeAlign getAlign() const
Returns the alignment of the given variable or function.
Definition: GlobalObject.h:80
bool hasMetadata() const
Return true if this value has any metadata attached to it.
Definition: Value.h:589
bool hasSection() const
Check if this global has a custom object file section.
Definition: GlobalObject.h:110
bool hasLinkOnceLinkage() const
Definition: GlobalValue.h:515
bool hasExternalLinkage() const
Definition: GlobalValue.h:511
bool isDSOLocal() const
Definition: GlobalValue.h:305
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
Definition: GlobalValue.h:263
VisibilityTypes getVisibility() const
Definition: GlobalValue.h:248
bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
Definition: Globals.cpp:290
LinkageTypes getLinkage() const
Definition: GlobalValue.h:546
bool hasLocalLinkage() const
Definition: GlobalValue.h:528
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
Definition: GlobalValue.h:567
bool hasPrivateLinkage() const
Definition: GlobalValue.h:527
bool isTagged() const
Definition: GlobalValue.h:365
bool isDeclarationForLinker() const
Definition: GlobalValue.h:618
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:656
PointerType * getType() const
Global values are always pointers.
Definition: GlobalValue.h:294
VisibilityTypes
An enumeration for the kinds of visibility of global values.
Definition: GlobalValue.h:66
@ DefaultVisibility
The GV is visible.
Definition: GlobalValue.h:67
@ HiddenVisibility
The GV is hidden.
Definition: GlobalValue.h:68
@ ProtectedVisibility
The GV is protected.
Definition: GlobalValue.h:69
const DataLayout & getDataLayout() const
Get the data layout of the module this global belongs to.
Definition: Globals.cpp:124
bool canBenefitFromLocalAlias() const
Definition: Globals.cpp:112
bool hasComdat() const
Definition: GlobalValue.h:241
bool hasWeakLinkage() const
Definition: GlobalValue.h:522
bool hasCommonLinkage() const
Definition: GlobalValue.h:532
bool hasGlobalUnnamedAddr() const
Definition: GlobalValue.h:215
bool hasAppendingLinkage() const
Definition: GlobalValue.h:525
static bool isDiscardableIfUnused(LinkageTypes Linkage)
Whether the definition of this global may be discarded if it is not used in its compilation unit.
Definition: GlobalValue.h:449
bool canBeOmittedFromSymbolTable() const
True if GV can be left out of the object symbol table.
Definition: Globals.cpp:419
bool hasAvailableExternallyLinkage() const
Definition: GlobalValue.h:512
LinkageTypes
An enumeration for the kinds of linkage for global values.
Definition: GlobalValue.h:51
@ PrivateLinkage
Like Internal, but omit from symbol table.
Definition: GlobalValue.h:60
@ CommonLinkage
Tentative definitions.
Definition: GlobalValue.h:62
@ InternalLinkage
Rename collisions when linking (static functions).
Definition: GlobalValue.h:59
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
Definition: GlobalValue.h:54
@ WeakODRLinkage
Same, but only replaced by something equivalent.
Definition: GlobalValue.h:57
@ ExternalLinkage
Externally visible function.
Definition: GlobalValue.h:52
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
Definition: GlobalValue.h:56
@ AppendingLinkage
Special purpose, only applies to global arrays.
Definition: GlobalValue.h:58
@ AvailableExternallyLinkage
Available for inspection, not emission.
Definition: GlobalValue.h:53
@ ExternalWeakLinkage
ExternalWeak linkage description.
Definition: GlobalValue.h:61
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
Definition: GlobalValue.h:55
Type * getValueType() const
Definition: GlobalValue.h:296
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool hasInitializer() const
Definitions have initializers, declarations don't.
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
bool isTailCall(const MachineInstr &MI) const override
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition: Type.cpp:278
This is an alternative analysis pass to MachineBlockFrequencyInfo.
bool isInnermost() const
Return true if the loop does not contain any (natural) loops.
BlockT * getHeader() const
unsigned getLoopDepth() const
Return the nesting level of this loop.
LoopT * getParentLoop() const
Return the parent loop if it exists or nullptr for top level loops.
Represents a single loop in the control flow graph.
Definition: LoopInfo.h:44
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition: MCAsmInfo.h:56
bool needsFunctionDescriptors() const
Definition: MCAsmInfo.h:875
bool hasDotTypeDotSizeDirective() const
Definition: MCAsmInfo.h:748
bool useIntegratedAssembler() const
Return true if assembly (inline or otherwise) should be parsed.
Definition: MCAsmInfo.h:842
bool hasBasenameOnlyForFileDirective() const
Definition: MCAsmInfo.h:741
MCSymbolAttr getProtectedVisibilityAttr() const
Definition: MCAsmInfo.h:772
bool hasFourStringsDotFile() const
Definition: MCAsmInfo.h:750
unsigned getAssemblerDialect() const
Definition: MCAsmInfo.h:682
bool useAssignmentForEHBegin() const
Definition: MCAsmInfo.h:662
bool usesCFIWithoutEH() const
Definition: MCAsmInfo.h:787
bool hasAltEntry() const
Definition: MCAsmInfo.h:753
bool avoidWeakIfComdat() const
Definition: MCAsmInfo.h:762
bool hasVisibilityOnlyWithLinkage() const
Definition: MCAsmInfo.h:631
bool hasMachoZeroFillDirective() const
Definition: MCAsmInfo.h:627
MCSymbolAttr getHiddenDeclarationVisibilityAttr() const
Definition: MCAsmInfo.h:768
bool hasWeakDefDirective() const
Definition: MCAsmInfo.h:756
bool hasWeakDefCanBeHiddenDirective() const
Definition: MCAsmInfo.h:758
LCOMM::LCOMMType getLCOMMDirectiveAlignmentType() const
Definition: MCAsmInfo.h:737
bool needsDwarfSectionOffsetDirective() const
Definition: MCAsmInfo.h:621
bool doesSupportDebugInformation() const
Definition: MCAsmInfo.h:778
bool doesSetDirectiveSuppressReloc() const
Definition: MCAsmInfo.h:727
WinEH::EncodingType getWinEHEncodingType() const
Definition: MCAsmInfo.h:781
bool doesDwarfUseRelocationsAcrossSections() const
Definition: MCAsmInfo.h:805
MCSymbolAttr getMemtagAttr() const
Definition: MCAsmInfo.h:776
bool hasSubsectionsViaSymbols() const
Definition: MCAsmInfo.h:560
bool hasMachoTBSSDirective() const
Definition: MCAsmInfo.h:628
bool usesWindowsCFI() const
Definition: MCAsmInfo.h:799
bool binutilsIsAtLeast(int Major, int Minor) const
Definition: MCAsmInfo.h:849
MCSymbolAttr getHiddenVisibilityAttr() const
Definition: MCAsmInfo.h:764
bool hasSingleParameterDotFile() const
Definition: MCAsmInfo.h:749
const char * getWeakRefDirective() const
Definition: MCAsmInfo.h:755
bool hasNoDeadStrip() const
Definition: MCAsmInfo.h:752
virtual MCSection * getNonexecutableStackSection(MCContext &Ctx) const
Targets can implement this method to specify a section to switch to if the translation unit doesn't h...
Definition: MCAsmInfo.h:579
ExceptionHandling getExceptionHandlingType() const
Definition: MCAsmInfo.h:780
bool needsLocalForSize() const
Definition: MCAsmInfo.h:663
bool hasFunctionAlignment() const
Definition: MCAsmInfo.h:747
bool hasIdentDirective() const
Definition: MCAsmInfo.h:751
unsigned getCodePointerSize() const
Get the code pointer size in bytes.
Definition: MCAsmInfo.h:546
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Definition: MCExpr.h:536
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Definition: MCExpr.h:621
static const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Definition: MCExpr.cpp:194
Context object for machine code objects.
Definition: MCContext.h:83
const MCObjectFileInfo * getObjectFileInfo() const
Definition: MCContext.h:416
MCSectionMachO * getMachOSection(StringRef Segment, StringRef Section, unsigned TypeAndAttributes, unsigned Reserved2, SectionKind K, const char *BeginSymName=nullptr)
Return the MCSection for the specified mach-o section.
Definition: MCContext.cpp:483
MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
Definition: MCContext.cpp:345
MCSymbol * createLinkerPrivateTempSymbol()
Create a new linker temporary symbol with the specified prefix (Name) or "tmp".
Definition: MCContext.cpp:335
MCSectionELF * getELFSection(const Twine &Section, unsigned Type, unsigned Flags)
Definition: MCContext.h:547
MCSectionCOFF * getCOFFSection(StringRef Section, unsigned Characteristics, StringRef COMDATSymName, int Selection, unsigned UniqueID=GenericSectionID)
Definition: MCContext.cpp:687
void reportWarning(SMLoc L, const Twine &Msg)
Definition: MCContext.cpp:1077
void reportError(SMLoc L, const Twine &Msg)
Definition: MCContext.cpp:1070
MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
Definition: MCContext.cpp:212
MCSymbol * createLinkerPrivateSymbol(const Twine &Name)
Definition: MCContext.cpp:339
MCSymbol * createNamedTempSymbol()
Create a temporary symbol with a unique name whose name cannot be omitted in the symbol table.
Definition: MCContext.cpp:347
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:35
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:184
unsigned getOpcode() const
Definition: MCInst.h:198
void setOpcode(unsigned Op)
Definition: MCInst.h:197
MCSection * getTLSBSSSection() const
MCSection * getStackSizesSection(const MCSection &TextSec) const
MCSection * getBBAddrMapSection(const MCSection &TextSec) const
MCSection * getRemarksSection() const
MCSection * getTLSExtraDataSection() const
MCSection * getKCFITrapSection(const MCSection &TextSec) const
MCSection * getPCSection(StringRef Name, const MCSection *TextSec) const
MCSection * getTextSection() const
MCSection * getDataSection() const
This represents a section on Windows.
Definition: MCSectionCOFF.h:27
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition: MCSection.h:36
static constexpr unsigned NonUniqueID
Definition: MCSection.h:40
bool isVirtualSection() const
Check whether this section is "virtual", that is has no actual object file contents.
Definition: MCSection.h:225
Streaming machine code generation interface.
Definition: MCStreamer.h:213
virtual void emitBinaryData(StringRef Data)
Functionally identical to EmitBytes.
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
void emitZeros(uint64_t NumBytes)
Emit NumBytes worth of zeros.
Definition: MCStreamer.cpp:230
Generic base class for all target subtargets.
const Triple & getTargetTriple() const
Represent a reference to a symbol from inside an expression.
Definition: MCExpr.h:192
const MCSymbol & getSymbol() const
Definition: MCExpr.h:410
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
Definition: MCExpr.h:397
StringRef getSymbolTableName() const
Definition: MCSymbolXCOFF.h:68
bool hasRename() const
Definition: MCSymbolXCOFF.h:61
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
bool isDefined() const
isDefined - Check if this symbol is defined (i.e., it has an address).
Definition: MCSymbol.h:250
StringRef getName() const
getName - Get the symbol name.
Definition: MCSymbol.h:205
bool isVariable() const
isVariable - Check if this is a variable symbol.
Definition: MCSymbol.h:300
void redefineIfPossible()
Prepare this symbol to be redefined.
Definition: MCSymbol.h:232
This represents an "assembler immediate".
Definition: MCValue.h:36
int64_t getConstant() const
Definition: MCValue.h:43
const MCSymbolRefExpr * getSymB() const
Definition: MCValue.h:45
const MCSymbolRefExpr * getSymA() const
Definition: MCValue.h:44
bool isAbsolute() const
Is this an absolute (as opposed to relocatable) value.
Definition: MCValue.h:49
Metadata node.
Definition: Metadata.h:1067
const MDOperand & getOperand(unsigned I) const
Definition: Metadata.h:1428
ArrayRef< MDOperand > operands() const
Definition: Metadata.h:1426
Tracking metadata reference owned by Metadata.
Definition: Metadata.h:889
A single uniqued string.
Definition: Metadata.h:720
StringRef getString() const
Definition: Metadata.cpp:610
unsigned pred_size() const
bool isEHPad() const
Returns true if the block is a landing pad.
MCSymbol * getSymbol() const
Return the MCSymbol for this basic block.
MCSymbol * getEHCatchretSymbol() const
Return the EHCatchret Symbol for this basic block.
bool hasLabelMustBeEmitted() const
Test whether this block must have its label emitted.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
std::optional< UniqueBBID > getBBID() const
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
unsigned getMaxBytesForAlignment() const
Return the maximum amount of padding allowed for aligning the basic block.
bool isIRBlockAddressTaken() const
Test whether this block is the target of an IR BlockAddress.
MCSymbol * getEndSymbol() const
Returns the MCSymbol marking the end of this basic block.
bool isEHFuncletEntry() const
Returns true if this is the entry block of an EH funclet.
bool sameSection(const MachineBasicBlock *MBB) const
Returns true if this and MBB belong to the same section.
unsigned succ_size() const
bool isReturnBlock() const
Convenience function that returns true if the block ends in a return instruction.
bool isEntryBlock() const
Returns true if this is the entry block of the function.
BasicBlock * getAddressTakenIRBlock() const
Retrieves the BasicBlock which corresponds to this MachineBasicBlock.
unsigned getSectionIDNum() const
Returns the unique section ID number of this basic block.
bool isEHCatchretTarget() const
Returns true if this is a target block of a catchret.
bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB will be emitted immediately after this block, such that if this bloc...
instr_iterator instr_end()
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
bool isBeginSection() const
Returns true if this block begins any section.
iterator_range< iterator > terminators()
iterator_range< succ_iterator > successors()
reverse_iterator rbegin()
bool isMachineBlockAddressTaken() const
Test whether this block is used as something other than the target of a terminator,...
bool isEndSection() const
Returns true if this block ends any section.
Align getAlignment() const
Return alignment of the basic block.
StringRef getName() const
Return the name of the corresponding LLVM basic block, or an empty string.
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
BlockFrequency getBlockFreq(const MachineBasicBlock *MBB) const
getblockFreq - Return block frequency.
BranchProbability getEdgeProbability(const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const
This class is a data container for one entry in a MachineConstantPool.
bool isMachineConstantPoolEntry() const
isMachineConstantPoolEntry - Return true if the MachineConstantPoolEntry is indeed a target specific ...
MachineConstantPoolValue * MachineCPVal
Align Alignment
The required alignment for this entry.
unsigned getSizeInBytes(const DataLayout &DL) const
union llvm::MachineConstantPoolEntry::@198 Val
The constant itself.
SectionKind getSectionKind(const DataLayout *DL) const
Abstract base class for all machine specific constantpool value subclasses.
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
const std::vector< MachineConstantPoolEntry > & getConstants() const
MachineDominatorTree & getBase()
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool needsSplitStackProlog() const
Return true if this function requires a split stack prolog, even if it uses no stack space.
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects.
uint64_t getUnsafeStackSize() const
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
unsigned getFunctionNumber() const
getFunctionNumber - Return a unique ID for the current function.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
const std::vector< MCCFIInstruction > & getFrameInstructions() const
Returns a reference to a list of cfi instructions in the function's prologue.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
void setSection(MCSection *S)
Indicates the Section this function belongs to.
MCSymbol * getJTISymbol(unsigned JTI, MCContext &Ctx, bool isLinkerPrivate=false) const
getJTISymbol - Return the MCSymbol for the specified non-empty jump table.
reverse_iterator rbegin()
bool hasBBSections() const
Returns true if this function has basic block sections enabled.
MCContext & getContext() const
unsigned size() const
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
Align getAlignment() const
getAlignment - Return the alignment of the function.
Function & getFunction()
Return the LLVM function that this machine code represents.
const LLVMTargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
const std::vector< LandingPadInfo > & getLandingPads() const
Return a reference to the landing pad info for the current function.
MCSection * getSection() const
Returns the Section this function belongs to.
const MachineBasicBlock & back() const
MachineModuleInfo & getMMI() const
bool shouldSplitStack() const
Should we be emitting segmented stack stuff for the function.
MachineConstantPool * getConstantPool()
getConstantPool - Return the constant pool object for the current function.
const MachineBasicBlock & front() const
bool hasBBLabels() const
Returns true if basic block labels are to be generated for this function.
const MachineJumpTableInfo * getJumpTableInfo() const
getJumpTableInfo - Return the jump table info object for the current function.
Representation of each machine instruction.
Definition: MachineInstr.h:69
unsigned getEntrySize(const DataLayout &TD) const
getEntrySize - Return the size of each entry in the jump table.
@ EK_GPRel32BlockAddress
EK_GPRel32BlockAddress - Each entry is an address of block, encoded with a relocation as gp-relative,...
@ EK_Inline
EK_Inline - Jump table entries are emitted inline at their point of use.
@ EK_LabelDifference32
EK_LabelDifference32 - Each entry is the address of the block minus the address of the jump table.
@ EK_Custom32
EK_Custom32 - Each entry is a 32-bit value that is custom lowered by the TargetLowering::LowerCustomJ...
@ EK_LabelDifference64
EK_LabelDifference64 - Each entry is the address of the block minus the address of the jump table.
@ EK_BlockAddress
EK_BlockAddress - Each entry is a plain address of block, e.g.: .word LBB123.
@ EK_GPRel64BlockAddress
EK_GPRel64BlockAddress - Each entry is an address of block, encoded with a relocation as gp-relative,...
unsigned getEntryAlignment(const DataLayout &TD) const
getEntryAlignment - Return the alignment of each entry in the jump table.
JTEntryKind getEntryKind() const
const std::vector< MachineJumpTableEntry > & getJumpTables() const
MachineLoop * getLoopFor(const MachineBasicBlock *BB) const
Return the innermost loop that BB lives in.
MachineModuleInfoCOFF - This is a MachineModuleInfoImpl implementation for COFF targets.
SymbolListTy GetGVStubList()
Accessor methods to return the set of stubs in sorted order.
MachineModuleInfoELF - This is a MachineModuleInfoImpl implementation for ELF targets.
SymbolListTy GetGVStubList()
Accessor methods to return the set of stubs in sorted order.
std::vector< std::pair< MCSymbol *, StubValueTy > > SymbolListTy
This class contains meta information specific to a module.
const MCContext & getContext() const
const Module * getModule() const
Ty & getObjFileInfo()
Keep track of various per-module pieces of information for backends that would like to do so.
bool hasDebugInfo() const
Returns true if valid debug info is present.
MachineOperand class - Representation of each machine instruction operand.
@ MO_Immediate
Immediate operand.
@ MO_CImmediate
Immediate >64bit operand.
@ MO_FrameIndex
Abstract Stack Frame Index.
@ MO_Register
Register operand.
@ MO_TargetIndex
Target-dependent index+offset operand.
@ MO_FPImmediate
Floating-point immediate operand.
Diagnostic information for optimization analysis remarks.
void emit(DiagnosticInfoOptimizationBase &OptDiag)
Emit an optimization remark.
bool allowExtraAnalysis(StringRef PassName) const
Whether we allow for extra compile-time budget to perform more analysis to be more informative.
void getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV, bool CannotUsePrivateLabel) const
Print the appropriate prefix and the specified global variable's name.
Definition: Mangler.cpp:120
This class implements a map that also provides access to all stored values in a deterministic order.
Definition: MapVector.h:36
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
StringRef getName() const
Get a short "name" for the module.
Definition: Module.h:284
const DataLayout & getDataLayout() const
Get the data layout for the module's target platform.
Definition: Module.h:293
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
Definition: Module.cpp:333
A tuple of MDNodes.
Definition: Metadata.h:1729
MDNode * getOperand(unsigned i) const
Definition: Metadata.cpp:1381
unsigned getNumOperands() const
Definition: Metadata.cpp:1377
Wrapper for a value that won't be replaced with a CFI jump table pointer in LowerTypeTestsModule.
Definition: Constants.h:973
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
Definition: DerivedTypes.h:662
void emitPseudoProbe(uint64_t Guid, uint64_t Index, uint64_t Type, uint64_t Attr, const DILocation *DebugLoc)
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
static iterator_range< iterator > entries()
Definition: Registry.h:101
SimpleRegistryEntry< T > entry
Definition: Registry.h:47
Represents a location in source code.
Definition: SMLoc.h:23
SectionKind - This is a simple POD value that classifies the properties of a section.
Definition: SectionKind.h:22
bool isCommon() const
Definition: SectionKind.h:173
bool isBSS() const
Definition: SectionKind.h:169
static SectionKind getReadOnlyWithRel()
Definition: SectionKind.h:214
bool isBSSLocal() const
Definition: SectionKind.h:170
bool isThreadBSS() const
Definition: SectionKind.h:161
bool isThreadLocal() const
Definition: SectionKind.h:157
bool isThreadData() const
Definition: SectionKind.h:162
static SectionKind getReadOnly()
Definition: SectionKind.h:192
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:344
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:479
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition: SmallString.h:26
bool empty() const
Definition: SmallVector.h:94
size_t size() const
Definition: SmallVector.h:91
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:586
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:950
void push_back(const T &Elt)
Definition: SmallVector.h:426
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1209
void serializeToStackMapSection()
If there is any stack map data, create a stack map section and serialize the map info into it.
Definition: StackMaps.cpp:722
int64_t getFixed() const
Returns the fixed component of the stack.
Definition: TypeSize.h:49
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition: StringRef.h:564
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
Definition: StringRef.h:417
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
Definition: StringRef.h:290
Used to lazily calculate structure layout information for a target machine, based on the DataLayout s...
Definition: DataLayout.h:622
TypeSize getSizeInBytes() const
Definition: DataLayout.h:629
TypeSize getElementOffset(unsigned Idx) const
Definition: DataLayout.h:651
Information about stack frame layout on the target.
virtual StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, Register &FrameReg) const
getFrameIndexReference - This method should return the base register and offset used to reference a f...
TargetInstrInfo - Interface to description of machine instruction set.
virtual MCInst getNop() const
Return the noop instruction to use for a noop.
Align getMinFunctionAlignment() const
Return the minimum function alignment.
virtual MCSection * getSectionForCommandLines() const
If supported, return the section to use for the llvm.commandline metadata.
static SectionKind getKindForGlobal(const GlobalObject *GO, const TargetMachine &TM)
Classify the specified global variable into a set of target independent categories embodied in Sectio...
virtual MCSection * getSectionForJumpTable(const Function &F, const TargetMachine &TM) const
virtual MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const
virtual bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const
virtual const MCExpr * getIndirectSymViaGOTPCRel(const GlobalValue *GV, const MCSymbol *Sym, const MCValue &MV, int64_t Offset, MachineModuleInfo *MMI, MCStreamer &Streamer) const
Get the target specific PC relative GOT entry relocation.
virtual void emitModuleMetadata(MCStreamer &Streamer, Module &M) const
Emit the module-level metadata that the platform cares about.
virtual MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment) const
Given a constant with the SectionKind, return a section that it should be placed in.
MCSymbol * getSymbolWithGlobalValueBase(const GlobalValue *GV, StringRef Suffix, const TargetMachine &TM) const
Return the MCSymbol for a private symbol with global value name as its base, with the specified suffi...
virtual MCSection * getStaticCtorSection(unsigned Priority, const MCSymbol *KeySym) const
virtual const MCExpr * lowerDSOLocalEquivalent(const DSOLocalEquivalent *Equiv, const TargetMachine &TM) const
bool supportGOTPCRelWithOffset() const
Target GOT "PC"-relative relocation supports encoding an additional binary expression with an offset?
bool supportIndirectSymViaGOTPCRel() const
Target supports replacing a data "PC"-relative access to a symbol through another symbol,...
virtual MCSymbol * getFunctionEntryPointSymbol(const GlobalValue *Func, const TargetMachine &TM) const
If supported, return the function entry point symbol.
virtual const MCExpr * lowerRelativeReference(const GlobalValue *LHS, const GlobalValue *RHS, const TargetMachine &TM) const
MCSection * SectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const
This method computes the appropriate section to emit the specified global variable or function defini...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual const MCExpr * getPICJumpTableRelocBaseExpr(const MachineFunction *MF, unsigned JTI, MCContext &Ctx) const
This returns the relocation base for the given PIC jumptable, the same as getPICJumpTableRelocBase,...
virtual const MCExpr * LowerCustomJumpTableEntry(const MachineJumpTableInfo *, const MachineBasicBlock *, unsigned, MCContext &) const
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:77
bool isPositionIndependent() const
virtual bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const
Returns true if a cast between SrcAS and DestAS is a noop.
const Triple & getTargetTriple() const
const MCSubtargetInfo * getMCSubtargetInfo() const
bool useEmulatedTLS() const
Returns true if this target uses emulated TLS.
unsigned getPointerSize(unsigned AS) const
Get the pointer size for this target.
virtual TargetLoweringObjectFile * getObjFileLowering() const
Reloc::Model getRelocationModel() const
Returns the code generation relocation model.
virtual const TargetSubtargetInfo * getSubtargetImpl(const Function &) const
Virtual method implemented by subclasses that returns a reference to that target's TargetSubtargetInf...
TargetOptions Options
MCSymbol * getSymbol(const GlobalValue *GV) const
unsigned getProgramPointerSize() const
CodeModel::Model getCodeModel() const
Returns the code model.
void getNameWithPrefix(SmallVectorImpl< char > &Name, const GlobalValue *GV, Mangler &Mang, bool MayAlwaysUsePrivate=false) const
const MCAsmInfo * getMCAsmInfo() const
Return target specific asm information.
unsigned EmitStackSizeSection
Emit section containing metadata on function stack sizes.
unsigned EmitAddrsig
Emit address-significance table.
unsigned UseInitArray
UseInitArray - Use .init_array instead of .ctors for static constructors.
MCTargetOptions MCOptions
Machine level options.
unsigned ForceDwarfFrameSection
Emit DWARF debug frame section.
std::string StackUsageOutput
Name of the stack usage file (i.e., .su file) if user passes -fstack-usage.
unsigned XRayFunctionIndex
Emit XRay Function Index section.
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetLowering * getTargetLowering() const
Target - Wrapper for Target specific information.
TinyPtrVector - This class is specialized for cases where there are normally 0 or 1 element in a vect...
Definition: TinyPtrVector.h:29
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
bool isOSBinFormatMachO() const
Tests whether the environment is MachO.
Definition: Triple.h:732
bool isOSBinFormatCOFF() const
Tests whether the OS uses the COFF binary format.
Definition: Triple.h:724
bool isOSWindows() const
Tests whether the OS is Windows.
Definition: Triple.h:624
bool isOSBinFormatXCOFF() const
Tests whether the OS uses the XCOFF binary format.
Definition: Triple.h:742
bool isOSAIX() const
Tests whether the OS is AIX.
Definition: Triple.h:710
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
Definition: Triple.h:719
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
Definition: Type.h:154
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
Definition: Type.h:146
void print(raw_ostream &O, bool IsForDebug=false, bool NoDetails=false) const
Print the current type.
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
Definition: Type.h:166
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
Definition: Type.h:302
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
Definition: Type.h:143
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
Definition: Type.h:157
bool isFunctionTy() const
True if this is an instance of FunctionType.
Definition: Type.h:246
Value * getOperand(unsigned i) const
Definition: User.h:169
unsigned getNumOperands() const
Definition: User.h:191
Value * operator=(Value *RHS)
Definition: ValueHandle.h:69
LLVM Value Representation.
Definition: Value.h:74
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:255
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition: Value.h:434
iterator_range< user_iterator > users()
Definition: Value.h:421
User * user_back()
Definition: Value.h:407
void printAsOperand(raw_ostream &O, bool PrintType=true, const Module *M=nullptr) const
Print the name of this Value out to the specified raw_ostream.
Definition: AsmWriter.cpp:5105
const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition: Value.cpp:693
bool use_empty() const
Definition: Value.h:344
LLVMContext & getContext() const
All values hold a context through their type.
Definition: Value.cpp:1074
StringRef getName() const
Return a constant reference to the value's name.
Definition: Value.cpp:309
Type * getElementType() const
Definition: DerivedTypes.h:436
reverse_self_iterator getReverseIterator()
Definition: ilist_node.h:135
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
A raw_ostream that writes to an std::string.
Definition: raw_ostream.h:661
A raw_ostream that writes to an SmallVector or SmallString.
Definition: raw_ostream.h:691
std::optional< StringRef > getFilename() const
Return the filename that the remark diagnostics are emitted to.
bool needsSection() const
Check if the remarks also need to have associated metadata in a section.
remarks::RemarkSerializer & getSerializer()
Return the serializer used for this stream.
StringRef OperationEncodingString(unsigned Encoding)
Definition: Dwarf.cpp:138
This file contains the declaration of the Comdat class, which represents a single COMDAT in LLVM.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ IMAGE_SCN_MEM_READ
Definition: COFF.h:335
@ IMAGE_SCN_LNK_INFO
Definition: COFF.h:306
@ IMAGE_SCN_CNT_INITIALIZED_DATA
Definition: COFF.h:303
@ IMAGE_SCN_LNK_COMDAT
Definition: COFF.h:308
@ IMAGE_SYM_CLASS_EXTERNAL
External symbol.
Definition: COFF.h:223
@ IMAGE_SYM_CLASS_STATIC
Static.
Definition: COFF.h:224
@ IMAGE_COMDAT_SELECT_ANY
Definition: COFF.h:422
@ IMAGE_SYM_DTYPE_FUNCTION
A function that returns a base type.
Definition: COFF.h:275
@ SCT_COMPLEX_TYPE_SHIFT
Type is formed as (base + (derived << SCT_COMPLEX_TYPE_SHIFT))
Definition: COFF.h:279
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
@ SHT_PROGBITS
Definition: ELF.h:1067
@ SHT_LLVM_SYMPART
Definition: ELF.h:1097
@ SHF_ALLOC
Definition: ELF.h:1161
@ SHF_LINK_ORDER
Definition: ELF.h:1176
@ SHF_GROUP
Definition: ELF.h:1183
@ SHF_WRITE
Definition: ELF.h:1158
@ STT_FUNC
Definition: ELF.h:1328
@ S_ATTR_LIVE_SUPPORT
S_ATTR_LIVE_SUPPORT - Blocks are live if they reference live blocks.
Definition: MachO.h:202
@ Itanium
Windows CE ARM, PowerPC, SH3, SH4.
@ X86
Windows x64, Windows Itanium (IA-64)
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
Definition: CommandLine.h:711
@ CommaSeparated
Definition: CommandLine.h:163
uint8_t getUnitLengthFieldByteSize(DwarfFormat Format)
Get the byte size of the unit length field depending on the DWARF format.
Definition: Dwarf.h:1103
@ DWARF64
Definition: Dwarf.h:91
uint8_t getDwarfOffsetByteSize(DwarfFormat Format)
The size of a reference determined by the DWARF 32/64-bit format.
Definition: Dwarf.h:1064
DiagnosticInfoOptimizationBase::Argument NV
void make_absolute(const Twine &current_directory, SmallVectorImpl< char > &path)
Make path an absolute path.
Definition: Path.cpp:907
@ OF_Text
The file should be opened in text mode on platforms like z/OS that make this distinction.
Definition: FileSystem.h:758
StringRef filename(StringRef path, Style style=Style::native)
Get filename.
Definition: Path.cpp:578
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:480
void stable_sort(R &&Range)
Definition: STLExtras.h:1995
ExceptionHandling
@ SjLj
setjmp/longjmp based exceptions
@ ZOS
z/OS MVS Exception Handling.
@ None
No exception support.
@ AIX
AIX Exception Handling.
@ DwarfCFI
DWARF-like instruction based exceptions.
@ WinEH
Windows Exception Handling.
@ Wasm
WebAssembly Exception Handling.
bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV, APInt &Offset, const DataLayout &DL, DSOLocalEquivalent **DSOEquiv=nullptr)
If this constant is a constant offset from a global, return the global and the constant.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition: STLExtras.h:2067
bool TimePassesIsEnabled
If the user specifies the -time-passes argument on an LLVM tool command line then the value of this b...
@ MCDR_DataRegionEnd
.end_data_region
Definition: MCDirectives.h:66
@ MCDR_DataRegionJT32
.data_region jt32
Definition: MCDirectives.h:65
bool isNoOpWithoutInvoke(EHPersonality Pers)
Return true if this personality may be safely removed if there are no invoke instructions remaining i...
Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
auto reverse(ContainerTy &&C)
Definition: STLExtras.h:419
void sort(IteratorTy Start, IteratorTy End)
Definition: STLExtras.h:1647
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:167
EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
Definition: Format.h:125
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Global
Append to llvm.global_dtors.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition: Alignment.h:155
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:191
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1849
Constant * ConstantFoldIntegerCast(Constant *C, Type *DestTy, bool IsSigned, const DataLayout &DL)
Constant fold a zext, sext or trunc, depending on IsSigned and whether the DestTy is wider or narrowe...
Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
MCSymbolAttr
Definition: MCDirectives.h:18
@ MCSA_Local
.local (ELF)
Definition: MCDirectives.h:38
@ MCSA_WeakDefAutoPrivate
.weak_def_can_be_hidden (MachO)
Definition: MCDirectives.h:48
@ MCSA_WeakReference
.weak_reference (MachO)
Definition: MCDirectives.h:47
@ MCSA_AltEntry
.alt_entry (MachO)
Definition: MCDirectives.h:41
@ MCSA_ELF_TypeIndFunction
.type _foo, STT_GNU_IFUNC
Definition: MCDirectives.h:24
@ MCSA_Weak
.weak
Definition: MCDirectives.h:45
@ MCSA_WeakDefinition
.weak_definition (MachO)
Definition: MCDirectives.h:46
@ MCSA_Global
.type _foo, @gnu_unique_object
Definition: MCDirectives.h:30
@ MCSA_Cold
.cold (MachO)
Definition: MCDirectives.h:22
@ MCSA_ELF_TypeObject
.type _foo, STT_OBJECT # aka @object
Definition: MCDirectives.h:25
@ MCSA_ELF_TypeFunction
.type _foo, STT_FUNC # aka @function
Definition: MCDirectives.h:23
@ MCSA_Invalid
Not a valid directive.
Definition: MCDirectives.h:19
@ MCSA_NoDeadStrip
.no_dead_strip (MachO)
Definition: MCDirectives.h:39
constexpr const char * PseudoProbeDescMetadataName
Definition: PseudoProbe.h:25
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:860
#define N
#define OP(n)
Definition: regex2.h:73
#define NC
Definition: regutils.h:42
static constexpr roundingMode rmNearestTiesToEven
Definition: APFloat.h:246
static const fltSemantics & IEEEdouble() LLVM_READNONE
Definition: APFloat.cpp:272
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
struct HandlerInfo and Handlers permit users or target extended AsmPrinter to add their own handlers.
Definition: AsmPrinter.h:148
Map a basic block section ID to the begin and end symbols of that section which determine the section...
Definition: AsmPrinter.h:135
llvm.global_ctors and llvm.global_dtors are arrays of Structor structs.
Definition: AsmPrinter.h:475
void emit(int, MCStreamer *) const
Description of the encoding of one expression Op.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition: Alignment.h:117
This class is basically a combination of TimeRegion and Timer.
Definition: Timer.h:163
A helper struct providing information about the byte size of DW_FORM values that vary in size dependi...
Definition: Dwarf.h:1077
This is the base class for a remark serializer.
virtual std::unique_ptr< MetaSerializer > metaSerializer(raw_ostream &OS, std::optional< StringRef > ExternalFilename=std::nullopt)=0
Return the corresponding metadata serializer.