LLVM 24.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"
68#include "llvm/Config/config.h"
69#include "llvm/IR/BasicBlock.h"
70#include "llvm/IR/Comdat.h"
71#include "llvm/IR/Constant.h"
72#include "llvm/IR/Constants.h"
73#include "llvm/IR/DataLayout.h"
77#include "llvm/IR/Function.h"
78#include "llvm/IR/GCStrategy.h"
79#include "llvm/IR/GlobalAlias.h"
80#include "llvm/IR/GlobalIFunc.h"
82#include "llvm/IR/GlobalValue.h"
84#include "llvm/IR/Instruction.h"
87#include "llvm/IR/Mangler.h"
88#include "llvm/IR/Metadata.h"
89#include "llvm/IR/Module.h"
90#include "llvm/IR/Operator.h"
91#include "llvm/IR/PseudoProbe.h"
92#include "llvm/IR/Type.h"
93#include "llvm/IR/Value.h"
94#include "llvm/IR/ValueHandle.h"
95#include "llvm/MC/MCAsmInfo.h"
96#include "llvm/MC/MCContext.h"
98#include "llvm/MC/MCExpr.h"
99#include "llvm/MC/MCInst.h"
100#include "llvm/MC/MCSchedule.h"
101#include "llvm/MC/MCSection.h"
103#include "llvm/MC/MCSectionELF.h"
106#include "llvm/MC/MCStreamer.h"
108#include "llvm/MC/MCSymbol.h"
109#include "llvm/MC/MCSymbolELF.h"
111#include "llvm/MC/MCValue.h"
112#include "llvm/MC/SectionKind.h"
114#include "llvm/Object/ELFTypes.h"
115#include "llvm/Pass.h"
117#include "llvm/Support/Casting.h"
122#include "llvm/Support/Format.h"
124#include "llvm/Support/Path.h"
125#include "llvm/Support/VCSRevision.h"
131#include <algorithm>
132#include <cassert>
133#include <cinttypes>
134#include <cstdint>
135#include <iterator>
136#include <memory>
137#include <optional>
138#include <string>
139#include <utility>
140#include <vector>
141
142using namespace llvm;
143
144#define DEBUG_TYPE "asm-printer"
145
155 "pgo-analysis-map", cl::Hidden, cl::CommaSeparated,
157 clEnumValN(PGOMapFeaturesEnum::None, "none", "Disable all options"),
159 "Function Entry Count"),
161 "Basic Block Frequency"),
162 clEnumValN(PGOMapFeaturesEnum::BrProb, "br-prob", "Branch Probability"),
163 clEnumValN(PGOMapFeaturesEnum::All, "all", "Enable all options")),
164 cl::desc(
165 "Enable extended information within the SHT_LLVM_BB_ADDR_MAP that is "
166 "extracted from PGO related analysis."));
167
169 "pgo-analysis-map-emit-bb-sections-cfg",
170 cl::desc("Enable the post-link cfg information from the basic block "
171 "sections profile in the PGO analysis map"),
172 cl::Hidden, cl::init(false));
173
175 "basic-block-address-map-skip-bb-entries",
176 cl::desc("Skip emitting basic block entries in the SHT_LLVM_BB_ADDR_MAP "
177 "section. It's used to save binary size when BB entries are "
178 "unnecessary for some PGOAnalysisMap features."),
179 cl::Hidden, cl::init(false));
180
182 "emit-jump-table-sizes-section",
183 cl::desc("Emit a section containing jump table addresses and sizes"),
184 cl::Hidden, cl::init(false));
185
186// This isn't turned on by default, since several of the scheduling models are
187// not completely accurate, and we don't want to be misleading.
189 "asm-print-latency",
190 cl::desc("Print instruction latencies as verbose asm comments"), cl::Hidden,
191 cl::init(false));
192
194 StackUsageFile("stack-usage-file",
195 cl::desc("Output filename for stack usage information"),
196 cl::value_desc("filename"), cl::Hidden);
197
198STATISTIC(EmittedInsts, "Number of machine instrs printed");
199
200char AsmPrinter::ID = 0;
201
202namespace {
203class AddrLabelMapCallbackPtr final : CallbackVH {
204 AddrLabelMap *Map = nullptr;
205
206public:
207 AddrLabelMapCallbackPtr() = default;
208 AddrLabelMapCallbackPtr(Value *V) : CallbackVH(V) {}
209
210 void setPtr(BasicBlock *BB) {
212 }
213
214 void setMap(AddrLabelMap *map) { Map = map; }
215
216 void deleted() override;
217 void allUsesReplacedWith(Value *V2) override;
218};
219} // namespace
220
222 MCContext &Context;
223 struct AddrLabelSymEntry {
224 /// The symbols for the label.
226
227 Function *Fn; // The containing function of the BasicBlock.
228 unsigned Index; // The index in BBCallbacks for the BasicBlock.
229 };
230
231 DenseMap<AssertingVH<BasicBlock>, AddrLabelSymEntry> AddrLabelSymbols;
232
233 /// Callbacks for the BasicBlock's that we have entries for. We use this so
234 /// we get notified if a block is deleted or RAUWd.
235 std::vector<AddrLabelMapCallbackPtr> BBCallbacks;
236
237 /// This is a per-function list of symbols whose corresponding BasicBlock got
238 /// deleted. These symbols need to be emitted at some point in the file, so
239 /// AsmPrinter emits them after the function body.
240 DenseMap<AssertingVH<Function>, std::vector<MCSymbol *>>
241 DeletedAddrLabelsNeedingEmission;
242
243public:
244 AddrLabelMap(MCContext &context) : Context(context) {}
245
247 assert(DeletedAddrLabelsNeedingEmission.empty() &&
248 "Some labels for deleted blocks never got emitted");
249 }
250
252
254 std::vector<MCSymbol *> &Result);
255
258};
259
261 assert(BB->hasAddressTaken() &&
262 "Shouldn't get label for block without address taken");
263 AddrLabelSymEntry &Entry = AddrLabelSymbols[BB];
264
265 // If we already had an entry for this block, just return it.
266 if (!Entry.Symbols.empty()) {
267 assert(BB->getParent() == Entry.Fn && "Parent changed");
268 return Entry.Symbols;
269 }
270
271 // Otherwise, this is a new entry, create a new symbol for it and add an
272 // entry to BBCallbacks so we can be notified if the BB is deleted or RAUWd.
273 BBCallbacks.emplace_back(BB);
274 BBCallbacks.back().setMap(this);
275 Entry.Index = BBCallbacks.size() - 1;
276 Entry.Fn = BB->getParent();
277 MCSymbol *Sym = BB->hasAddressTaken() ? Context.createNamedTempSymbol()
278 : Context.createTempSymbol();
279 Entry.Symbols.push_back(Sym);
280 return Entry.Symbols;
281}
282
283/// If we have any deleted symbols for F, return them.
285 Function *F, std::vector<MCSymbol *> &Result) {
286 DenseMap<AssertingVH<Function>, std::vector<MCSymbol *>>::iterator I =
287 DeletedAddrLabelsNeedingEmission.find(F);
288
289 // If there are no entries for the function, just return.
290 if (I == DeletedAddrLabelsNeedingEmission.end())
291 return;
292
293 // Otherwise, take the list.
294 std::swap(Result, I->second);
295 DeletedAddrLabelsNeedingEmission.erase(I);
296}
297
298//===- Address of Block Management ----------------------------------------===//
299
302 // Lazily create AddrLabelSymbols.
303 if (!AddrLabelSymbols)
304 AddrLabelSymbols = std::make_unique<AddrLabelMap>(OutContext);
305 return AddrLabelSymbols->getAddrLabelSymbolToEmit(
306 const_cast<BasicBlock *>(BB));
307}
308
310 const Function *F, std::vector<MCSymbol *> &Result) {
311 // If no blocks have had their addresses taken, we're done.
312 if (!AddrLabelSymbols)
313 return;
314 return AddrLabelSymbols->takeDeletedSymbolsForFunction(
315 const_cast<Function *>(F), Result);
316}
317
319 // If the block got deleted, there is no need for the symbol. If the symbol
320 // was already emitted, we can just forget about it, otherwise we need to
321 // queue it up for later emission when the function is output.
322 AddrLabelSymEntry Entry = std::move(AddrLabelSymbols[BB]);
323 AddrLabelSymbols.erase(BB);
324 assert(!Entry.Symbols.empty() && "Didn't have a symbol, why a callback?");
325 BBCallbacks[Entry.Index] = nullptr; // Clear the callback.
326
327#if !LLVM_MEMORY_SANITIZER_BUILD
328 // BasicBlock is destroyed already, so this access is UB detectable by msan.
329 assert((BB->getParent() == nullptr || BB->getParent() == Entry.Fn) &&
330 "Block/parent mismatch");
331#endif
332
333 for (MCSymbol *Sym : Entry.Symbols) {
334 if (Sym->isDefined())
335 return;
336
337 // If the block is not yet defined, we need to emit it at the end of the
338 // function. Add the symbol to the DeletedAddrLabelsNeedingEmission list
339 // for the containing Function. Since the block is being deleted, its
340 // parent may already be removed, we have to get the function from 'Entry'.
341 DeletedAddrLabelsNeedingEmission[Entry.Fn].push_back(Sym);
342 }
343}
344
346 // Get the entry for the RAUW'd block and remove it from our map.
347 AddrLabelSymEntry OldEntry = std::move(AddrLabelSymbols[Old]);
348 AddrLabelSymbols.erase(Old);
349 assert(!OldEntry.Symbols.empty() && "Didn't have a symbol, why a callback?");
350
351 AddrLabelSymEntry &NewEntry = AddrLabelSymbols[New];
352
353 // If New is not address taken, just move our symbol over to it.
354 if (NewEntry.Symbols.empty()) {
355 BBCallbacks[OldEntry.Index].setPtr(New); // Update the callback.
356 NewEntry = std::move(OldEntry); // Set New's entry.
357 return;
358 }
359
360 BBCallbacks[OldEntry.Index] = nullptr; // Update the callback.
361
362 // Otherwise, we need to add the old symbols to the new block's set.
363 llvm::append_range(NewEntry.Symbols, OldEntry.Symbols);
364}
365
366void AddrLabelMapCallbackPtr::deleted() {
367 Map->UpdateForDeletedBlock(cast<BasicBlock>(getValPtr()));
368}
369
370void AddrLabelMapCallbackPtr::allUsesReplacedWith(Value *V2) {
371 Map->UpdateForRAUWBlock(cast<BasicBlock>(getValPtr()), cast<BasicBlock>(V2));
372}
373
374/// getGVAlignment - Return the alignment to use for the specified global
375/// value. This rounds up to the preferred alignment if possible and legal.
377 Align InAlign) {
378 Align Alignment;
379 if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV))
380 Alignment = DL.getPreferredAlign(GVar);
381
382 // If InAlign is specified, round it to it.
383 if (InAlign > Alignment)
384 Alignment = InAlign;
385
386 // If the GV has a specified alignment, take it into account.
387 MaybeAlign GVAlign;
388 if (auto *GVar = dyn_cast<GlobalVariable>(GV))
389 GVAlign = GVar->getAlign();
390 else if (auto *F = dyn_cast<Function>(GV))
391 GVAlign = F->getAlign();
392 if (!GVAlign)
393 return Alignment;
394
395 assert(GVAlign && "GVAlign must be set");
396
397 // If the GVAlign is larger than NumBits, or if we are required to obey
398 // NumBits because the GV has an assigned section, obey it.
399 if (*GVAlign > Alignment || GV->hasSection())
400 Alignment = *GVAlign;
401 return Alignment;
402}
403
404AsmPrinter::AsmPrinter(TargetMachine &tm, std::unique_ptr<MCStreamer> Streamer,
405 char &ID)
406 : MachineFunctionPass(ID), TM(tm), MAI(tm.getMCAsmInfo()),
408 PointerSize(tm.getTargetTriple().getArchPointerBitWidth() / 8),
409 SM(*this) {
410 VerboseAsm = OutStreamer->isVerboseAsm();
411 DwarfUsesRelocationsAcrossSections =
412 MAI.doesDwarfUseRelocationsAcrossSections();
413 GetMMI = [this]() {
415 return MMIWP ? &MMIWP->getMMI() : nullptr;
416 };
417 GetORE = [this](MachineFunction &MF) {
419 };
420 GetMDT = [this](MachineFunction &MF) {
421 auto *MDTWrapper =
423 return MDTWrapper ? &MDTWrapper->getDomTree() : nullptr;
424 };
425 GetMLI = [this](MachineFunction &MF) {
427 return MLIWrapper ? &MLIWrapper->getLI() : nullptr;
428 };
429 GetMBPI = [this](MachineFunction &MF) {
431 };
432 GetMBFI = [this](MachineFunction &MF) {
434 };
435 GetMBHI = [this](MachineFunction &MF) {
436 return &getAnalysis<MachineBlockHashInfo>().getMBHI();
437 };
438 GetBBSPR = [this](MachineFunction &MF) {
439 auto *BBSPRPass =
441 return BBSPRPass ? &BBSPRPass->getBBSPR() : nullptr;
442 };
443 BeginGCAssembly = [this](Module &M) {
445 assert(MI && "AsmPrinter didn't require GCModuleInfo?");
446 for (const auto &I : *MI)
447 if (GCMetadataPrinter *MP = getOrCreateGCPrinter(*I))
448 MP->beginAssembly(M, *MI, *this);
449 };
450 FinishGCAssembly = [this](Module &M) {
452 assert(MI && "AsmPrinter didn't require GCModuleInfo?");
453 for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E;)
454 if (GCMetadataPrinter *MP = getOrCreateGCPrinter(**--I))
455 MP->finishAssembly(M, *MI, *this);
456 };
457 EmitStackMaps = [this](Module &M) {
459 assert(MI && "AsmPrinter didn't require GCModuleInfo?");
460 bool NeedsDefault = false;
461 if (MI->begin() == MI->end())
462 // No GC strategy, use the default format.
463 NeedsDefault = true;
464 else
465 for (const auto &I : *MI) {
466 if (GCMetadataPrinter *MP = getOrCreateGCPrinter(*I))
467 if (MP->emitStackMaps(SM, *this))
468 continue;
469 // The strategy doesn't have printer or doesn't emit custom stack maps.
470 // Use the default format.
471 NeedsDefault = true;
472 }
473
474 if (NeedsDefault)
475 SM.serializeToStackMapSection();
476 };
477 AssertDebugEHFinalized = [&]() {
478 assert(!DD && Handlers.size() == NumUserHandlers &&
479 "Debug/EH info didn't get finalized");
480 };
481}
482
484
486 return TM.isPositionIndependent();
487}
488
489/// getFunctionNumber - Return a unique ID for the current function.
491 return MF->getFunctionNumber();
492}
493
495 return *TM.getObjFileLowering();
496}
497
499 assert(MMI && "MMI could not be nullptr!");
500 return MMI->getModule()->getDataLayout();
501}
502
504 assert(MF && "getSubtargetInfo requires a valid MachineFunction!");
505 return MF->getSubtarget<MCSubtargetInfo>();
506}
507
511
512/// getCurrentSection() - Return the current section we are emitting to.
514 return OutStreamer->getCurrentSectionOnly();
515}
516
517/// createDwarfDebug() - Create the DwarfDebug handler.
519
531
533 MMI = GetMMI();
534 PointerSize = M.getDataLayout().getPointerSize(0);
535 HasSplitStack = false;
536 HasNoSplitStack = false;
537 DbgInfoAvailable = !M.debug_compile_units().empty();
538 const Triple &Target = M.getTargetTriple();
539
540 AddrLabelSymbols = nullptr;
541
542 // On AIX, we delay emitting any section information until
543 // after emitting the .file pseudo-op. This allows additional
544 // information (such as the embedded command line) to be associated
545 // with all sections in the object file rather than a single section.
546 if (!Target.isOSBinFormatXCOFF())
547 OutStreamer->initSections(TM.getMCSubtargetInfo());
548
549 // Emit the version-min deployment target directive if needed.
550 //
551 // FIXME: If we end up with a collection of these sorts of Darwin-specific
552 // or ELF-specific things, it may make sense to have a platform helper class
553 // that will work with the target helper class. For now keep it here, as the
554 // alternative is duplicated code in each of the target asm printers that
555 // use the directive, where it would need the same conditionalization
556 // anyway.
557 if (Target.isOSBinFormatMachO() && Target.isOSDarwin()) {
558 Triple TVT(M.getDarwinTargetVariantTriple());
559 OutStreamer->emitVersionForTarget(
560 Target, M.getSDKVersion(),
561 M.getDarwinTargetVariantTriple().empty() ? nullptr : &TVT,
562 M.getDarwinTargetVariantSDKVersion());
563 }
564
565 // Allow the target to emit any magic that it wants at the start of the file.
567
568 // Very minimal debug info. It is ignored if we emit actual debug info. If we
569 // don't, this at least helps the user find where a global came from.
570 if (MAI.hasSingleParameterDotFile()) {
571 // .file "foo.c"
572 if (MAI.isAIX()) {
573 const char VerStr[] =
574#ifdef PACKAGE_VENDOR
575 PACKAGE_VENDOR " "
576#endif
577 PACKAGE_NAME " version " PACKAGE_VERSION
578#ifdef LLVM_REVISION
579 " (" LLVM_REVISION ")"
580#endif
581 ;
582 // TODO: Add timestamp and description.
583 OutStreamer->emitFileDirective(M.getSourceFileName(), VerStr, "", "");
584 } else {
585 OutStreamer->emitFileDirective(
586 llvm::sys::path::filename(M.getSourceFileName()));
587 }
588 }
589
590 // On AIX, emit bytes for llvm.commandline metadata after .file so that the
591 // C_INFO symbol is preserved if any csect is kept by the linker.
592 if (Target.isOSBinFormatXCOFF()) {
593 emitModuleCommandLines(M);
594 // Now we can generate section information.
595 OutStreamer->switchSection(
596 OutContext.getObjectFileInfo()->getTextSection());
597
598 // To work around an AIX assembler and/or linker bug, generate
599 // a rename for the default text-section symbol name. This call has
600 // no effect when generating object code directly.
601 MCSection *TextSection =
602 OutStreamer->getContext().getObjectFileInfo()->getTextSection();
603 MCSymbolXCOFF *XSym =
604 static_cast<MCSectionXCOFF *>(TextSection)->getQualNameSymbol();
605 if (XSym->hasRename())
606 OutStreamer->emitXCOFFRenameDirective(XSym, XSym->getSymbolTableName());
607 }
608
610
611 // Emit module-level inline asm if it exists.
612 if (M.hasModuleInlineAsm()) {
613 OutStreamer->AddComment("Start of file scope inline assembly");
614 OutStreamer->addBlankLine();
615 for (const Module::GlobalAsmFragment &Frag : M.getModuleInlineAsm()) {
616 const MCSubtargetInfo &AsmSTI = TM.getMCSubtargetInfo(
617 Frag.Props.TargetCPU, Frag.Props.TargetFeatures);
618 bool DidPush = emitTargetFeaturePush(AsmSTI);
619 emitInlineAsm(
620 Frag.Asm, AsmSTI, TM.Options.MCOptions, nullptr,
621 InlineAsm::AsmDialect(TM.getMCAsmInfo().getAssemblerDialect()));
622 emitTargetFeaturePop(AsmSTI, DidPush);
623 }
624 OutStreamer->AddComment("End of file scope inline assembly");
625 OutStreamer->addBlankLine();
626 }
627
628 if (MAI.doesSupportDebugInformation()) {
629 bool EmitCodeView = M.getCodeViewFlag();
630 // On Windows targets, emit minimal CodeView compiler info even when debug
631 // info is disabled.
632 if ((Target.isOSWindows() || (Target.isUEFI() && EmitCodeView)) &&
633 M.getNamedMetadata("llvm.dbg.cu"))
634 Handlers.push_back(std::make_unique<CodeViewDebug>(this));
635 if (!EmitCodeView || M.getDwarfVersion()) {
636 if (hasDebugInfo()) {
637 DD = createDwarfDebug();
638 Handlers.push_back(std::unique_ptr<DwarfDebug>(DD));
639 }
640 }
641 }
642
643 if (M.getNamedMetadata(PseudoProbeDescMetadataName))
644 PP = std::make_unique<PseudoProbeHandler>(this);
645
646 switch (MAI.getExceptionHandlingType()) {
648 // We may want to emit CFI for debug.
649 [[fallthrough]];
653 for (auto &F : M.getFunctionList()) {
655 ModuleCFISection = getFunctionCFISectionType(F);
656 // If any function needsUnwindTableEntry(), it needs .eh_frame and hence
657 // the module needs .eh_frame. If we have found that case, we are done.
658 if (ModuleCFISection == CFISection::EH)
659 break;
660 }
661 assert(MAI.getExceptionHandlingType() == ExceptionHandling::DwarfCFI ||
662 usesCFIWithoutEH() || ModuleCFISection != CFISection::EH);
663 break;
664 default:
665 break;
666 }
667
668 EHStreamer *ES = nullptr;
669 switch (MAI.getExceptionHandlingType()) {
671 llvm_unreachable("should have resolved exception model kind");
674 // Emscripten EH is handled in JS glue code and emits no EH tables here.
675 if (!usesCFIWithoutEH())
676 break;
677 [[fallthrough]];
681 ES = new DwarfCFIException(this);
682 break;
684 ES = new ARMException(this);
685 break;
687 switch (MAI.getWinEHEncodingType()) {
688 default: llvm_unreachable("unsupported unwinding information encoding");
690 break;
693 ES = new WinException(this);
694 break;
695 }
696 break;
698 ES = new WasmException(this);
699 break;
701 ES = new AIXException(this);
702 break;
703 }
704 if (ES)
705 EHHandlers.push_back(std::unique_ptr<EHStreamer>(ES));
706
707 // All CFG modes required the tables emitted.
708 if (M.getControlFlowGuardMode() != ControlFlowGuardMode::Disabled)
709 Handlers.push_back(std::make_unique<WinCFGuard>(this));
710
711 for (auto &Handler : Handlers)
712 Handler->beginModule(&M);
713 for (auto &Handler : EHHandlers)
714 Handler->beginModule(&M);
715
716 return false;
717}
718
719static bool canBeHidden(const GlobalValue *GV, const MCAsmInfo &MAI) {
721 return false;
722
723 return GV->canBeOmittedFromSymbolTable();
724}
725
726void AsmPrinter::emitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const {
728 switch (Linkage) {
734 if (MAI.isMachO()) {
735 // .globl _foo
736 OutStreamer->emitSymbolAttribute(GVSym, MCSA_Global);
737
738 if (!canBeHidden(GV, MAI))
739 // .weak_definition _foo
740 OutStreamer->emitSymbolAttribute(GVSym, MCSA_WeakDefinition);
741 else
742 OutStreamer->emitSymbolAttribute(GVSym, MCSA_WeakDefAutoPrivate);
743 } else if (MAI.avoidWeakIfComdat() && GV->hasComdat()) {
744 // .globl _foo
745 OutStreamer->emitSymbolAttribute(GVSym, MCSA_Global);
746 //NOTE: linkonce is handled by the section the symbol was assigned to.
747 } else {
748 // .weak _foo
749 OutStreamer->emitSymbolAttribute(GVSym, MCSA_Weak);
750 }
751 return;
753 OutStreamer->emitSymbolAttribute(GVSym, MCSA_Global);
754 return;
757 return;
761 llvm_unreachable("Should never emit this");
762 }
763 llvm_unreachable("Unknown linkage type!");
764}
765
767 const GlobalValue *GV) const {
768 TM.getNameWithPrefix(Name, GV, getObjFileLowering().getMangler());
769}
770
772 return TM.getSymbol(GV);
773}
774
776 // On ELF, use .Lfoo$local if GV is a non-interposable GlobalObject with an
777 // exact definion (intersection of GlobalValue::hasExactDefinition() and
778 // !isInterposable()). These linkages include: external, appending, internal,
779 // private. It may be profitable to use a local alias for external. The
780 // assembler would otherwise be conservative and assume a global default
781 // visibility symbol can be interposable, even if the code generator already
782 // assumed it.
783 const Module &M = *GV.getParent();
784 if (M.getTargetTriple().isOSBinFormatELF() && GV.canBenefitFromLocalAlias()) {
785 if (TM.getRelocationModel() != Reloc::Static &&
786 M.getPIELevel() == PIELevel::Default && GV.isDSOLocal())
787 return getSymbolWithGlobalValueBase(&GV, "$local");
788 }
789 return TM.getSymbol(&GV);
790}
791
792/// EmitGlobalVariable - Emit the specified global variable to the .s file.
794 MaybeAlign AlignmentGranule = getRequiredGlobalAlignmentGranule(*GV);
795 emitGlobalVariable(GV, AlignmentGranule);
796 if (AlignmentGranule)
797 OutStreamer->emitValueToAlignment(*AlignmentGranule);
798}
799
801 MaybeAlign AlignmentGranule) {
802 bool IsEmuTLSVar = TM.useEmulatedTLS() && GV->isThreadLocal();
803 assert(!(IsEmuTLSVar && GV->hasCommonLinkage()) &&
804 "No emulated TLS variables in the common section");
805
806 // Never emit TLS variable xyz in emulated TLS model.
807 // The initialization value is in __emutls_t.xyz instead of xyz.
808 if (IsEmuTLSVar)
809 return;
810
811 if (GV->hasInitializer()) {
812 // Check to see if this is a special global used by LLVM, if so, emit it.
813 if (emitSpecialLLVMGlobal(GV))
814 return;
815
816 // Skip the emission of global equivalents. The symbol can be emitted later
817 // on by emitGlobalGOTEquivs in case it turns out to be needed.
818 if (GlobalGOTEquivs.count(getSymbol(GV)))
819 return;
820
821 if (isVerbose()) {
822 // When printing the control variable __emutls_v.*,
823 // we don't need to print the original TLS variable name.
824 GV->printAsOperand(OutStreamer->getCommentOS(),
825 /*PrintType=*/false, GV->getParent());
826 OutStreamer->getCommentOS() << '\n';
827 }
828 }
829
830 MCSymbol *GVSym = getSymbol(GV);
831 MCSymbol *EmittedSym = GVSym;
832
833 // getOrCreateEmuTLSControlSym only creates the symbol with name and default
834 // attributes.
835 // GV's or GVSym's attributes will be used for the EmittedSym.
836 emitVisibility(EmittedSym, GV->getVisibility(), !GV->isDeclaration());
837
838 if (GV->isTagged()) {
839 if (TM.getTargetTriple().getArch() != Triple::aarch64)
840 OutContext.reportError(SMLoc(),
841 "tagged symbols (-fsanitize=memtag-globals) are "
842 "only supported on AArch64");
843 OutStreamer->emitSymbolAttribute(EmittedSym, MCSA_Memtag);
844 }
845
846 if (!GV->hasInitializer()) // External globals require no extra code.
847 return;
848
849 GVSym->redefineIfPossible();
850 if (GVSym->isDefined() || GVSym->isVariable())
851 OutContext.reportError(SMLoc(), "symbol '" + Twine(GVSym->getName()) +
852 "' is already defined");
853
854 if (MAI.hasDotTypeDotSizeDirective())
855 OutStreamer->emitSymbolAttribute(EmittedSym, MCSA_ELF_TypeObject);
856
858
859 const DataLayout &DL = GV->getDataLayout();
860 uint64_t Size = GV->getGlobalSize(DL);
861
862 // If the alignment is specified, we *must* obey it. Overaligning a global
863 // with a specified alignment is a prompt way to break globals emitted to
864 // sections and expected to be contiguous (e.g. ObjC metadata).
865 //
866 // If we get passed in an explicit alignment granule, it is up to the caller
867 // to ensure that is not the case (i.e. that the GV is not in a section).
868 Align Alignment = getGVAlignment(GV, DL);
869
870 if (AlignmentGranule) {
871 assert(!GV->hasSection());
872 Size = alignTo(Size, *AlignmentGranule);
873 if (Alignment < *AlignmentGranule)
874 Alignment = *AlignmentGranule;
875 }
876
877 for (auto &Handler : Handlers)
878 Handler->setSymbolSize(GVSym, Size);
879
880 // Handle common symbols
881 if (GVKind.isCommon()) {
882 if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it.
883 // .comm _foo, 42, 4
884 OutStreamer->emitCommonSymbol(GVSym, Size, Alignment);
885 return;
886 }
887
888 // Determine to which section this global should be emitted.
889 MCSection *TheSection = getObjFileLowering().SectionForGlobal(GV, GVKind, TM);
890
891 // If we have a bss global going to a section that supports the
892 // zerofill directive, do so here.
893 if (GVKind.isBSS() && MAI.isMachO() && TheSection->isBssSection()) {
894 if (Size == 0)
895 Size = 1; // zerofill of 0 bytes is undefined.
896 emitLinkage(GV, GVSym);
897 // .zerofill __DATA, __bss, _foo, 400, 5
898 OutStreamer->emitZerofill(TheSection, GVSym, Size, Alignment);
899 return;
900 }
901
902 // If this is a BSS local symbol and we are emitting in the BSS
903 // section use .lcomm/.comm directive.
904 if (GVKind.isBSSLocal() &&
905 getObjFileLowering().getBSSSection() == TheSection) {
906 if (Size == 0)
907 Size = 1; // .comm Foo, 0 is undefined, avoid it.
908
909 // Use .lcomm only if it supports user-specified alignment.
910 // Otherwise, while it would still be correct to use .lcomm in some
911 // cases (e.g. when Align == 1), the external assembler might enfore
912 // some -unknown- default alignment behavior, which could cause
913 // spurious differences between external and integrated assembler.
914 // Prefer to simply fall back to .local / .comm in this case.
915 if (MAI.getLCOMMDirectiveAlignmentType() != LCOMM::NoAlignment) {
916 // .lcomm _foo, 42
917 OutStreamer->emitLocalCommonSymbol(GVSym, Size, Alignment);
918 return;
919 }
920
921 // .local _foo
922 OutStreamer->emitSymbolAttribute(GVSym, MCSA_Local);
923 // .comm _foo, 42, 4
924 OutStreamer->emitCommonSymbol(GVSym, Size, Alignment);
925 return;
926 }
927
928 // Handle thread local data for mach-o which requires us to output an
929 // additional structure of data and mangle the original symbol so that we
930 // can reference it later.
931 //
932 // TODO: This should become an "emit thread local global" method on TLOF.
933 // All of this macho specific stuff should be sunk down into TLOFMachO and
934 // stuff like "TLSExtraDataSection" should no longer be part of the parent
935 // TLOF class. This will also make it more obvious that stuff like
936 // MCStreamer::EmitTBSSSymbol is macho specific and only called from macho
937 // specific code.
938 if (GVKind.isThreadLocal() && MAI.isMachO()) {
939 // Emit the .tbss symbol
940 MCSymbol *MangSym =
941 OutContext.getOrCreateSymbol(GVSym->getName() + Twine("$tlv$init"));
942
943 if (GVKind.isThreadBSS()) {
944 TheSection = getObjFileLowering().getTLSBSSSection();
945 OutStreamer->emitTBSSSymbol(TheSection, MangSym, Size, Alignment);
946 } else if (GVKind.isThreadData()) {
947 OutStreamer->switchSection(TheSection);
948
949 emitAlignment(Alignment, GV);
950 OutStreamer->emitLabel(MangSym);
951
953 GV->getInitializer());
954 }
955
956 OutStreamer->addBlankLine();
957
958 // Emit the variable struct for the runtime.
960
961 OutStreamer->switchSection(TLVSect);
962 // Emit the linkage here.
963 emitLinkage(GV, GVSym);
964 OutStreamer->emitLabel(GVSym);
965
966 // Three pointers in size:
967 // - __tlv_bootstrap - used to make sure support exists
968 // - spare pointer, used when mapped by the runtime
969 // - pointer to mangled symbol above with initializer
970 unsigned PtrSize = DL.getPointerTypeSize(GV->getType());
971 OutStreamer->emitSymbolValue(GetExternalSymbolSymbol("_tlv_bootstrap"),
972 PtrSize);
973 OutStreamer->emitIntValue(0, PtrSize);
974 OutStreamer->emitSymbolValue(MangSym, PtrSize);
975
976 OutStreamer->addBlankLine();
977 return;
978 }
979
980 MCSymbol *EmittedInitSym = GVSym;
981
982 OutStreamer->switchSection(TheSection);
983
984 emitLinkage(GV, EmittedInitSym);
985 emitAlignment(Alignment, GV);
986
987 OutStreamer->emitLabel(EmittedInitSym);
988 MCSymbol *LocalAlias = getSymbolPreferLocal(*GV);
989 if (LocalAlias != EmittedInitSym)
990 OutStreamer->emitLabel(LocalAlias);
991
993
994 if (MAI.hasDotTypeDotSizeDirective())
995 // .size foo, 42
996 OutStreamer->emitELFSize(EmittedInitSym,
998
999 OutStreamer->addBlankLine();
1000}
1001
1002/// Emit the directive and value for debug thread local expression
1003///
1004/// \p Value - The value to emit.
1005/// \p Size - The size of the integer (in bytes) to emit.
1006void AsmPrinter::emitDebugValue(const MCExpr *Value, unsigned Size) const {
1007 OutStreamer->emitValue(Value, Size);
1008}
1009
1010void AsmPrinter::emitFunctionHeaderComment() {}
1011
1012void AsmPrinter::emitFunctionPrefix(ArrayRef<const Constant *> Prefix) {
1013 const Function &F = MF->getFunction();
1015 for (auto &C : Prefix)
1016 emitGlobalConstant(F.getDataLayout(), C);
1017 return;
1018 }
1019 // Preserving prefix-like data on platforms which use subsections-via-symbols
1020 // is a bit tricky. Here we introduce a symbol for the prefix-like data
1021 // and use the .alt_entry attribute to mark the function's real entry point
1022 // as an alternative entry point to the symbol that precedes the function..
1023 OutStreamer->emitLabel(OutContext.createLinkerPrivateTempSymbol());
1024
1025 for (auto &C : Prefix) {
1026 emitGlobalConstant(F.getDataLayout(), C);
1027 }
1028
1029 // Emit an .alt_entry directive for the actual function symbol.
1030 OutStreamer->emitSymbolAttribute(CurrentFnSym, MCSA_AltEntry);
1031}
1032
1033/// EmitFunctionHeader - This method emits the header for the current
1034/// function.
1035void AsmPrinter::emitFunctionHeader() {
1036 const Function &F = MF->getFunction();
1037
1038 if (isVerbose())
1039 OutStreamer->getCommentOS()
1040 << "-- Begin function "
1041 << GlobalValue::dropLLVMManglingEscape(F.getName()) << '\n';
1042
1043 // Print out constants referenced by the function
1045
1046 // Print the 'header' of function.
1047 // If basic block sections are desired, explicitly request a unique section
1048 // for this function's entry block.
1049 if (MF->front().isBeginSection())
1050 MF->setSection(getObjFileLowering().getUniqueSectionForFunction(F, TM));
1051 else
1052 MF->setSection(getObjFileLowering().SectionForGlobal(&F, TM));
1053 OutStreamer->switchSection(MF->getSection());
1054
1055 if (MAI.isAIX())
1057 else
1058 emitVisibility(CurrentFnSym, F.getVisibility());
1059
1061 if (MAI.hasFunctionAlignment()) {
1062 Align PrefAlign = MF->getPreferredAlignment();
1063 if (MAI.useIntegratedAssembler() && MAI.hasPreferredAlignment()) {
1064 // Emit .p2align for the effective minimum alignment (which accounts for
1065 // F's own align attribute via getGVAlignment), then emit .prefalign only
1066 // when the preferred alignment is greater. The end symbol must be
1067 // created here, before the function body, so that .prefalign can
1068 // reference it; emitFunctionBody will emit the label at the function
1069 // end.
1070 Align MinAlign = emitAlignment(MF->getAlignment(), &F);
1071 if (MinAlign < PrefAlign) {
1072 CurrentFnEnd = createTempSymbol("func_end");
1073 OutStreamer->emitPrefAlign(PrefAlign, *CurrentFnEnd,
1074 /*EmitNops=*/true, /*Fill=*/0,
1076 }
1077 } else {
1078 emitAlignment(PrefAlign, &F);
1079 }
1080 }
1081
1082 if (MAI.hasDotTypeDotSizeDirective())
1083 OutStreamer->emitSymbolAttribute(CurrentFnSym, MCSA_ELF_TypeFunction);
1084
1085 if (F.hasFnAttribute(Attribute::Cold))
1086 OutStreamer->emitSymbolAttribute(CurrentFnSym, MCSA_Cold);
1087
1088 // Emit the prefix data.
1089 if (F.hasPrefixData())
1090 emitFunctionPrefix({F.getPrefixData()});
1091
1092 // Emit KCFI type information before patchable-function-prefix nops.
1094
1095 // Emit M NOPs for -fpatchable-function-entry=N,M where M>0. We arbitrarily
1096 // place prefix data before NOPs.
1097 unsigned PatchableFunctionPrefix =
1098 F.getFnAttributeAsParsedInteger("patchable-function-prefix");
1099 unsigned PatchableFunctionEntry =
1100 F.getFnAttributeAsParsedInteger("patchable-function-entry");
1101 if (PatchableFunctionPrefix) {
1103 OutContext.createLinkerPrivateTempSymbol();
1105 emitNops(PatchableFunctionPrefix);
1106 } else if (PatchableFunctionEntry) {
1107 // May be reassigned when emitting the body, to reference the label after
1108 // the initial BTI (AArch64) or endbr32/endbr64 (x86).
1110 }
1111
1112 // Emit the function prologue data for the indirect call sanitizer.
1113 if (const MDNode *MD = F.getMetadata(LLVMContext::MD_func_sanitize)) {
1114 assert(MD->getNumOperands() == 2);
1115
1116 auto *PrologueSig = mdconst::extract<Constant>(MD->getOperand(0));
1117 auto *TypeHash = mdconst::extract<Constant>(MD->getOperand(1));
1118 emitFunctionPrefix({PrologueSig, TypeHash});
1119 }
1120
1121 if (isVerbose()) {
1122 F.printAsOperand(OutStreamer->getCommentOS(),
1123 /*PrintType=*/false, F.getParent());
1124 emitFunctionHeaderComment();
1125 OutStreamer->getCommentOS() << '\n';
1126 }
1127
1128 // Emit the function descriptor. This is a virtual function to allow targets
1129 // to emit their specific function descriptor. Right now it is only used by
1130 // the AIX target. The PowerPC 64-bit V1 ELF target also uses function
1131 // descriptors and should be converted to use this hook as well.
1132 if (MAI.isAIX())
1134
1135 // Emit the CurrentFnSym. This is a virtual function to allow targets to do
1136 // their wild and crazy things as required.
1138
1139 // If the function had address-taken blocks that got deleted, then we have
1140 // references to the dangling symbols. Emit them at the start of the function
1141 // so that we don't get references to undefined symbols.
1142 std::vector<MCSymbol*> DeadBlockSyms;
1143 takeDeletedSymbolsForFunction(&F, DeadBlockSyms);
1144 for (MCSymbol *DeadBlockSym : DeadBlockSyms) {
1145 OutStreamer->AddComment("Address taken block that was later removed");
1146 OutStreamer->emitLabel(DeadBlockSym);
1147 }
1148
1149 if (CurrentFnBegin) {
1150 if (MAI.useAssignmentForEHBegin()) {
1151 MCSymbol *CurPos = OutContext.createTempSymbol();
1152 OutStreamer->emitLabel(CurPos);
1153 OutStreamer->emitAssignment(CurrentFnBegin,
1155 } else {
1156 OutStreamer->emitLabel(CurrentFnBegin);
1157 }
1158 }
1159
1160 // Emit pre-function debug and/or EH information.
1161 for (auto &Handler : Handlers) {
1162 Handler->beginFunction(MF);
1163 Handler->beginBasicBlockSection(MF->front());
1164 }
1165 for (auto &Handler : EHHandlers) {
1166 Handler->beginFunction(MF);
1167 Handler->beginBasicBlockSection(MF->front());
1168 }
1169
1170 // Emit the prologue data.
1171 if (F.hasPrologueData())
1172 emitGlobalConstant(F.getDataLayout(), F.getPrologueData());
1173}
1174
1175/// EmitFunctionEntryLabel - Emit the label that is the entrypoint for the
1176/// function. This can be overridden by targets as required to do custom stuff.
1178 CurrentFnSym->redefineIfPossible();
1179 OutStreamer->emitLabel(CurrentFnSym);
1180
1181 if (TM.getTargetTriple().isOSBinFormatELF()) {
1182 MCSymbol *Sym = getSymbolPreferLocal(MF->getFunction());
1183 if (Sym != CurrentFnSym) {
1184 CurrentFnBeginLocal = Sym;
1185 OutStreamer->emitLabel(Sym);
1186 OutStreamer->emitSymbolAttribute(Sym, MCSA_ELF_TypeFunction);
1187 }
1188 }
1189}
1190
1191/// emitComments - Pretty-print comments for instructions.
1192static void emitComments(const MachineInstr &MI, const MCSubtargetInfo *STI,
1193 raw_ostream &CommentOS) {
1194 const MachineFunction *MF = MI.getMF();
1196
1197 // Check for spills and reloads
1198
1199 // We assume a single instruction only has a spill or reload, not
1200 // both.
1201 std::optional<LocationSize> Size;
1202 if ((Size = MI.getRestoreSize(TII))) {
1203 CommentOS << Size->getValue() << "-byte Reload\n";
1204 } else if ((Size = MI.getFoldedRestoreSize(TII))) {
1205 if (!Size->hasValue())
1206 CommentOS << "Unknown-size Folded Reload\n";
1207 else if (Size->getValue())
1208 CommentOS << Size->getValue() << "-byte Folded Reload\n";
1209 } else if ((Size = MI.getSpillSize(TII))) {
1210 CommentOS << Size->getValue() << "-byte Spill\n";
1211 } else if ((Size = MI.getFoldedSpillSize(TII))) {
1212 if (!Size->hasValue())
1213 CommentOS << "Unknown-size Folded Spill\n";
1214 else if (Size->getValue())
1215 CommentOS << Size->getValue() << "-byte Folded Spill\n";
1216 }
1217
1218 // Check for spill-induced copies
1219 if (MI.getAsmPrinterFlag(MachineInstr::ReloadReuse))
1220 CommentOS << " Reload Reuse\n";
1221
1222 if (PrintLatency) {
1224 const MCSchedModel &SCModel = STI->getSchedModel();
1227 *STI, *TII, MI);
1228 // Report only interesting latencies.
1229 if (1 < Latency)
1230 CommentOS << " Latency: " << Latency << "\n";
1231 }
1232}
1233
1234/// emitImplicitDef - This method emits the specified machine instruction
1235/// that is an implicit def.
1237 Register RegNo = MI->getOperand(0).getReg();
1238
1239 SmallString<128> Str;
1240 raw_svector_ostream OS(Str);
1241 OS << "implicit-def: "
1242 << printReg(RegNo, MF->getSubtarget().getRegisterInfo());
1243
1244 OutStreamer->AddComment(OS.str());
1245 OutStreamer->addBlankLine();
1246}
1247
1248static void emitKill(const MachineInstr *MI, AsmPrinter &AP) {
1249 std::string Str;
1250 raw_string_ostream OS(Str);
1251 OS << "kill:";
1252 for (const MachineOperand &Op : MI->operands()) {
1253 assert(Op.isReg() && "KILL instruction must have only register operands");
1254 OS << ' ' << (Op.isDef() ? "def " : "killed ")
1255 << printReg(Op.getReg(), AP.MF->getSubtarget().getRegisterInfo());
1256 }
1257 AP.OutStreamer->AddComment(Str);
1258 AP.OutStreamer->addBlankLine();
1259}
1260
1261static void emitFakeUse(const MachineInstr *MI, AsmPrinter &AP) {
1262 std::string Str;
1263 raw_string_ostream OS(Str);
1264 OS << "fake_use:";
1265 for (const MachineOperand &Op : MI->operands()) {
1266 // In some circumstances we can end up with fake uses of constants; skip
1267 // these.
1268 if (!Op.isReg())
1269 continue;
1270 OS << ' ' << printReg(Op.getReg(), AP.MF->getSubtarget().getRegisterInfo());
1271 }
1272 AP.OutStreamer->AddComment(OS.str());
1273 AP.OutStreamer->addBlankLine();
1274}
1275
1276/// emitDebugValueComment - This method handles the target-independent form
1277/// of DBG_VALUE, returning true if it was able to do so. A false return
1278/// means the target will need to handle MI in EmitInstruction.
1280 // This code handles only the 4-operand target-independent form.
1281 if (MI->isNonListDebugValue() && MI->getNumOperands() != 4)
1282 return false;
1283
1284 SmallString<128> Str;
1285 raw_svector_ostream OS(Str);
1286 OS << "DEBUG_VALUE: ";
1287
1288 const DILocalVariable *V = MI->getDebugVariable();
1289 if (auto *SP = dyn_cast<DISubprogram>(V->getScope())) {
1290 StringRef Name = SP->getName();
1291 if (!Name.empty())
1292 OS << Name << ":";
1293 }
1294 OS << V->getName();
1295 OS << " <- ";
1296
1297 const DIExpression *Expr = MI->getDebugExpression();
1298 // First convert this to a non-variadic expression if possible, to simplify
1299 // the output.
1300 if (auto NonVariadicExpr = DIExpression::convertToNonVariadicExpression(Expr))
1301 Expr = *NonVariadicExpr;
1302 // Then, output the possibly-simplified expression.
1303 if (Expr->getNumElements()) {
1304 OS << '[';
1305 ListSeparator LS;
1306 for (auto &Op : Expr->expr_ops()) {
1307 OS << LS << dwarf::OperationEncodingString(Op.getOp());
1308 for (unsigned I = 0; I < Op.getNumArgs(); ++I)
1309 OS << ' ' << Op.getArg(I);
1310 }
1311 OS << "] ";
1312 }
1313
1314 // Register or immediate value. Register 0 means undef.
1315 for (const MachineOperand &Op : MI->debug_operands()) {
1316 if (&Op != MI->debug_operands().begin())
1317 OS << ", ";
1318 switch (Op.getType()) {
1320 APFloat APF = APFloat(Op.getFPImm()->getValueAPF());
1321 Type *ImmTy = Op.getFPImm()->getType();
1322 if (ImmTy->isBFloatTy() || ImmTy->isHalfTy() || ImmTy->isFloatTy() ||
1323 ImmTy->isDoubleTy()) {
1324 OS << APF.convertToDouble();
1325 } else {
1326 // There is no good way to print long double. Convert a copy to
1327 // double. Ah well, it's only a comment.
1328 bool ignored;
1330 &ignored);
1331 OS << "(long double) " << APF.convertToDouble();
1332 }
1333 break;
1334 }
1336 OS << Op.getImm();
1337 break;
1338 }
1340 Op.getCImm()->getValue().print(OS, false /*isSigned*/);
1341 break;
1342 }
1344 OS << "!target-index(" << Op.getIndex() << "," << Op.getOffset() << ")";
1345 break;
1346 }
1348 Op.getGlobal()->printAsOperand(OS, /*PrintType=*/false);
1349 if (Op.getOffset())
1350 OS << '+' << Op.getOffset();
1351 break;
1352 }
1355 Register Reg;
1356 std::optional<StackOffset> Offset;
1357 if (Op.isReg()) {
1358 Reg = Op.getReg();
1359 } else {
1360 const TargetFrameLowering *TFI =
1362 Offset = TFI->getFrameIndexReference(*AP.MF, Op.getIndex(), Reg);
1363 }
1364 if (!Reg) {
1365 // Suppress offset, it is not meaningful here.
1366 OS << "undef";
1367 break;
1368 }
1369 // The second operand is only an offset if it's an immediate.
1370 if (MI->isIndirectDebugValue())
1371 Offset = StackOffset::getFixed(MI->getDebugOffset().getImm());
1372 if (Offset)
1373 OS << '[';
1374 OS << printReg(Reg, AP.MF->getSubtarget().getRegisterInfo());
1375 if (Offset)
1376 OS << '+' << Offset->getFixed() << ']';
1377 break;
1378 }
1379 default:
1380 llvm_unreachable("Unknown operand type");
1381 }
1382 }
1383
1384 // NOTE: Want this comment at start of line, don't emit with AddComment.
1385 AP.OutStreamer->emitRawComment(Str);
1386 return true;
1387}
1388
1389/// This method handles the target-independent form of DBG_LABEL, returning
1390/// true if it was able to do so. A false return means the target will need
1391/// to handle MI in EmitInstruction.
1393 if (MI->getNumOperands() != 1)
1394 return false;
1395
1396 SmallString<128> Str;
1397 raw_svector_ostream OS(Str);
1398 OS << "DEBUG_LABEL: ";
1399
1400 const DILabel *V = MI->getDebugLabel();
1401 if (auto *SP = dyn_cast<DISubprogram>(
1402 V->getScope()->getNonLexicalBlockFileScope())) {
1403 StringRef Name = SP->getName();
1404 if (!Name.empty())
1405 OS << Name << ":";
1406 }
1407 OS << V->getName();
1408
1409 // NOTE: Want this comment at start of line, don't emit with AddComment.
1410 AP.OutStreamer->emitRawComment(OS.str());
1411 return true;
1412}
1413
1416 // Ignore functions that won't get emitted.
1417 if (F.isDeclarationForLinker())
1418 return CFISection::None;
1419
1420 if (MAI.getExceptionHandlingType() == ExceptionHandling::DwarfCFI &&
1421 F.needsUnwindTableEntry())
1422 return CFISection::EH;
1423
1424 if (MAI.usesCFIWithoutEH() && F.hasUWTable())
1425 return CFISection::EH;
1426
1427 if (hasDebugInfo() || TM.Options.ForceDwarfFrameSection)
1428 return CFISection::Debug;
1429
1430 return CFISection::None;
1431}
1432
1437
1439 return MAI.usesCFIWithoutEH() && ModuleCFISection != CFISection::None;
1440}
1441
1443 ExceptionHandling ExceptionHandlingType = MAI.getExceptionHandlingType();
1444 if (!usesCFIWithoutEH() &&
1445 ExceptionHandlingType != ExceptionHandling::DwarfCFI &&
1446 ExceptionHandlingType != ExceptionHandling::ARM)
1447 return;
1448
1450 return;
1451
1452 // If there is no "real" instruction following this CFI instruction, skip
1453 // emitting it; it would be beyond the end of the function's FDE range.
1454 auto *MBB = MI.getParent();
1455 auto I = std::next(MI.getIterator());
1456 while (I != MBB->end() && I->isTransient())
1457 ++I;
1458 if (I == MBB->instr_end() &&
1459 MBB->getReverseIterator() == MBB->getParent()->rbegin())
1460 return;
1461
1462 const std::vector<MCCFIInstruction> &Instrs = MF->getFrameInstructions();
1463 unsigned CFIIndex = MI.getOperand(0).getCFIIndex();
1464 const MCCFIInstruction &CFI = Instrs[CFIIndex];
1465 emitCFIInstruction(CFI);
1466}
1467
1469 // The operands are the MCSymbol and the frame offset of the allocation.
1470 MCSymbol *FrameAllocSym = MI.getOperand(0).getMCSymbol();
1471 int FrameOffset = MI.getOperand(1).getImm();
1472
1473 // Emit a symbol assignment.
1474 OutStreamer->emitAssignment(FrameAllocSym,
1475 MCConstantExpr::create(FrameOffset, OutContext));
1476}
1477
1478/// Returns the BB metadata to be emitted in the SHT_LLVM_BB_ADDR_MAP section
1479/// for a given basic block. This can be used to capture more precise profile
1480/// information.
1482 const TargetInstrInfo *TII = MBB.getParent()->getSubtarget().getInstrInfo();
1484 MBB.isReturnBlock(), !MBB.empty() && TII->isTailCall(MBB.back()),
1485 MBB.isEHPad(), const_cast<MachineBasicBlock &>(MBB).canFallThrough(),
1486 !MBB.empty() && MBB.rbegin()->isIndirectBranch()}
1487 .encode();
1488}
1489
1491getBBAddrMapFeature(const MachineFunction &MF, int NumMBBSectionRanges,
1492 bool HasCalls, const CFGProfile *FuncCFGProfile) {
1493 // Ensure that the user has not passed in additional options while also
1494 // specifying all or none.
1495 auto IsSet = [](PGOMapFeaturesEnum F) {
1497 };
1498 bool NoFeatures = IsSet(PGOMapFeaturesEnum::None);
1500 if ((NoFeatures || AllFeatures) && !all_equal(PgoAnalysisMapFeatures)) {
1502 "-pgo-analysis-map can accept only all or none with no additional "
1503 "values.");
1504 }
1505
1506 bool FuncEntryCountEnabled =
1507 AllFeatures || (!NoFeatures && IsSet(PGOMapFeaturesEnum::FuncEntryCount));
1508 bool BBFreqEnabled =
1509 AllFeatures || (!NoFeatures && IsSet(PGOMapFeaturesEnum::BBFreq));
1510 bool BrProbEnabled =
1511 AllFeatures || (!NoFeatures && IsSet(PGOMapFeaturesEnum::BrProb));
1512 bool PostLinkCfgEnabled = FuncCFGProfile && PgoAnalysisMapEmitBBSectionsCfg;
1513
1514 if ((BBFreqEnabled || BrProbEnabled) && BBAddrMapSkipEmitBBEntries) {
1516 "BB entries info is required for BBFreq and BrProb features");
1517 }
1518 return {FuncEntryCountEnabled, BBFreqEnabled, BrProbEnabled,
1519 MF.hasBBSections() && NumMBBSectionRanges > 1,
1520 // Use static_cast to avoid breakage of tests on windows.
1521 static_cast<bool>(BBAddrMapSkipEmitBBEntries), HasCalls,
1522 shouldEmitBBHash(), PostLinkCfgEnabled};
1523}
1524
1526 MCSection *BBAddrMapSection =
1527 getObjFileLowering().getBBAddrMapSection(*MF.getSection());
1528 assert(BBAddrMapSection && ".llvm_bb_addr_map section is not initialized.");
1529 bool HasCalls = !CurrentFnCallsiteEndSymbols.empty();
1530
1531 const BasicBlockSectionsProfileReader *BBSPR = GetBBSPR(*this->MF);
1532 const CFGProfile *FuncCFGProfile = nullptr;
1533 if (BBSPR)
1534 FuncCFGProfile = BBSPR->getFunctionCFGProfile(MF.getFunction().getName());
1535
1536 const MCSymbol *FunctionSymbol = getFunctionBegin();
1537
1538 OutStreamer->pushSection();
1539 OutStreamer->switchSection(BBAddrMapSection);
1540 OutStreamer->AddComment("version");
1541 uint8_t BBAddrMapVersion = OutStreamer->getContext().getBBAddrMapVersion();
1542 OutStreamer->emitInt8(BBAddrMapVersion);
1543 OutStreamer->AddComment("feature");
1544 auto Features = getBBAddrMapFeature(MF, MBBSectionRanges.size(), HasCalls,
1545 FuncCFGProfile);
1546 OutStreamer->emitInt16(Features.encode());
1547 // Emit BB Information for each basic block in the function.
1548 if (Features.MultiBBRange) {
1549 OutStreamer->AddComment("number of basic block ranges");
1550 OutStreamer->emitULEB128IntValue(MBBSectionRanges.size());
1551 }
1552 // Number of blocks in each MBB section.
1553 DenseMap<MBBSectionID, unsigned> MBBSectionNumBlocks;
1554 const MCSymbol *PrevMBBEndSymbol = nullptr;
1555 if (!Features.MultiBBRange) {
1556 OutStreamer->AddComment("function address");
1557 OutStreamer->emitSymbolValue(FunctionSymbol, getPointerSize());
1558 OutStreamer->AddComment("number of basic blocks");
1559 OutStreamer->emitULEB128IntValue(MF.size());
1560 PrevMBBEndSymbol = FunctionSymbol;
1561 } else {
1562 unsigned BBCount = 0;
1563 for (const MachineBasicBlock &MBB : MF) {
1564 BBCount++;
1565 if (MBB.isEndSection()) {
1566 // Store each section's basic block count when it ends.
1567 MBBSectionNumBlocks[MBB.getSectionID()] = BBCount;
1568 // Reset the count for the next section.
1569 BBCount = 0;
1570 }
1571 }
1572 }
1573 // Emit the BB entry for each basic block in the function.
1574 for (const MachineBasicBlock &MBB : MF) {
1575 const MCSymbol *MBBSymbol =
1576 MBB.isEntryBlock() ? FunctionSymbol : MBB.getSymbol();
1577 bool IsBeginSection =
1578 Features.MultiBBRange && (MBB.isBeginSection() || MBB.isEntryBlock());
1579 if (IsBeginSection) {
1580 OutStreamer->AddComment("base address");
1581 OutStreamer->emitSymbolValue(MBBSymbol, getPointerSize());
1582 OutStreamer->AddComment("number of basic blocks");
1583 OutStreamer->emitULEB128IntValue(MBBSectionNumBlocks[MBB.getSectionID()]);
1584 PrevMBBEndSymbol = MBBSymbol;
1585 }
1586
1587 const MachineBlockHashInfoResult *MBHI =
1588 Features.BBHash ? GetMBHI(*this->MF) : nullptr;
1589
1590 if (!Features.OmitBBEntries) {
1591 OutStreamer->AddComment("BB id");
1592 // Emit the BB ID for this basic block.
1593 // We only emit BaseID since CloneID is unset for
1594 // -basic-block-adress-map.
1595 // TODO: Emit the full BBID when labels and sections can be mixed
1596 // together.
1597 OutStreamer->emitULEB128IntValue(MBB.getBBID()->BaseID);
1598 // Emit the basic block offset relative to the end of the previous block.
1599 // This is zero unless the block is padded due to alignment.
1600 emitLabelDifferenceAsULEB128(MBBSymbol, PrevMBBEndSymbol);
1601 const MCSymbol *CurrentLabel = MBBSymbol;
1602 if (HasCalls) {
1603 auto CallsiteEndSymbols = CurrentFnCallsiteEndSymbols.lookup(&MBB);
1604 OutStreamer->AddComment("number of callsites");
1605 OutStreamer->emitULEB128IntValue(CallsiteEndSymbols.size());
1606 for (const MCSymbol *CallsiteEndSymbol : CallsiteEndSymbols) {
1607 // Emit the callsite offset.
1608 emitLabelDifferenceAsULEB128(CallsiteEndSymbol, CurrentLabel);
1609 CurrentLabel = CallsiteEndSymbol;
1610 }
1611 }
1612 // Emit the offset to the end of the block, which can be used to compute
1613 // the total block size.
1614 emitLabelDifferenceAsULEB128(MBB.getEndSymbol(), CurrentLabel);
1615 // Emit the Metadata.
1616 OutStreamer->emitULEB128IntValue(getBBAddrMapMetadata(MBB));
1617 // Emit the Hash.
1618 if (MBHI) {
1619 OutStreamer->emitInt64(MBHI->getMBBHash(MBB));
1620 }
1621 }
1622 PrevMBBEndSymbol = MBB.getEndSymbol();
1623 }
1624
1625 if (Features.hasPGOAnalysis()) {
1626 assert(BBAddrMapVersion >= 2 &&
1627 "PGOAnalysisMap only supports version 2 or later");
1628
1629 if (Features.FuncEntryCount) {
1630 OutStreamer->AddComment("function entry count");
1631 auto MaybeEntryCount = MF.getFunction().getEntryCount();
1632 OutStreamer->emitULEB128IntValue(MaybeEntryCount ? *MaybeEntryCount : 0);
1633 }
1634 const MachineBlockFrequencyInfo *MBFI =
1635 Features.BBFreq ? GetMBFI(*this->MF) : nullptr;
1636 const MachineBranchProbabilityInfo *MBPI =
1637 Features.BrProb ? GetMBPI(*this->MF) : nullptr;
1638
1639 if (Features.BBFreq || Features.BrProb) {
1640 for (const MachineBasicBlock &MBB : MF) {
1641 if (Features.BBFreq) {
1642 OutStreamer->AddComment("basic block frequency");
1643 OutStreamer->emitULEB128IntValue(
1644 MBFI->getBlockFreq(&MBB).getFrequency());
1645 if (Features.PostLinkCfg) {
1646 OutStreamer->AddComment("basic block frequency (propeller)");
1647 OutStreamer->emitULEB128IntValue(
1648 FuncCFGProfile->getBlockCount(*MBB.getBBID()));
1649 }
1650 }
1651 if (Features.BrProb) {
1652 unsigned SuccCount = MBB.succ_size();
1653 OutStreamer->AddComment("basic block successor count");
1654 OutStreamer->emitULEB128IntValue(SuccCount);
1655 for (const MachineBasicBlock *SuccMBB : MBB.successors()) {
1656 OutStreamer->AddComment("successor BB ID");
1657 OutStreamer->emitULEB128IntValue(SuccMBB->getBBID()->BaseID);
1658 OutStreamer->AddComment("successor branch probability");
1659 OutStreamer->emitULEB128IntValue(
1660 MBPI->getEdgeProbability(&MBB, SuccMBB).getNumerator());
1661 if (Features.PostLinkCfg) {
1662 OutStreamer->AddComment("successor branch frequency (propeller)");
1663 OutStreamer->emitULEB128IntValue(FuncCFGProfile->getEdgeCount(
1664 *MBB.getBBID(), *SuccMBB->getBBID()));
1665 }
1666 }
1667 }
1668 }
1669 }
1670 }
1671
1672 OutStreamer->popSection();
1673}
1674
1676 const MCSymbol *Symbol) {
1677 MCSection *Section =
1678 getObjFileLowering().getKCFITrapSection(*MF.getSection());
1679 if (!Section)
1680 return;
1681
1682 OutStreamer->pushSection();
1683 OutStreamer->switchSection(Section);
1684
1685 MCSymbol *Loc = OutContext.createLinkerPrivateTempSymbol();
1686 OutStreamer->emitLabel(Loc);
1687 OutStreamer->emitAbsoluteSymbolDiff(Symbol, Loc, 4);
1688
1689 OutStreamer->popSection();
1690}
1691
1693 const Function &F = MF.getFunction();
1694 if (const MDNode *MD = F.getMetadata(LLVMContext::MD_kcfi_type))
1695 emitGlobalConstant(F.getDataLayout(),
1696 mdconst::extract<ConstantInt>(MD->getOperand(0)));
1697}
1698
1700 if (PP) {
1701 auto GUID = MI.getOperand(0).getImm();
1702 auto Index = MI.getOperand(1).getImm();
1703 auto Type = MI.getOperand(2).getImm();
1704 auto Attr = MI.getOperand(3).getImm();
1705 DILocation *DebugLoc = MI.getDebugLoc();
1706 PP->emitPseudoProbe(GUID, Index, Type, Attr, DebugLoc);
1707 }
1708}
1709
1711 if (!MF.getTarget().Options.EmitStackSizeSection)
1712 return;
1713
1714 MCSection *StackSizeSection =
1716 if (!StackSizeSection)
1717 return;
1718
1719 const MachineFrameInfo &FrameInfo = MF.getFrameInfo();
1720 // Don't emit functions with dynamic stack allocations.
1721 if (FrameInfo.hasVarSizedObjects())
1722 return;
1723
1724 OutStreamer->pushSection();
1725 OutStreamer->switchSection(StackSizeSection);
1726
1727 const MCSymbol *FunctionSymbol = getFunctionBegin();
1728 uint64_t StackSize =
1729 FrameInfo.getStackSize() + FrameInfo.getUnsafeStackSize();
1730 const DataLayout &DL = getDataLayout();
1731 OutStreamer->emitSymbolValue(FunctionSymbol,
1732 DL.getPointerSize(DL.getProgramAddressSpace()));
1733 OutStreamer->emitULEB128IntValue(StackSize);
1734
1735 OutStreamer->popSection();
1736}
1737
1739 const std::string OutputFilename =
1741 : MF.getTarget().Options.StackUsageFile;
1742
1743 // OutputFilename empty implies -fstack-usage is not passed.
1744 if (OutputFilename.empty())
1745 return;
1746
1747 const MachineFrameInfo &FrameInfo = MF.getFrameInfo();
1748 uint64_t StackSize =
1749 FrameInfo.getStackSize() + FrameInfo.getUnsafeStackSize();
1750
1751 if (StackUsageStream == nullptr) {
1752 std::error_code EC;
1753 StackUsageStream =
1754 std::make_unique<raw_fd_ostream>(OutputFilename, EC, sys::fs::OF_Text);
1755 if (EC) {
1756 errs() << "Could not open file: " << EC.message();
1757 return;
1758 }
1759 }
1760
1761 if (const DISubprogram *DSP = MF.getFunction().getSubprogram())
1762 *StackUsageStream << DSP->getFilename() << ':' << DSP->getLine();
1763 else
1764 *StackUsageStream << MF.getFunction().getParent()->getName();
1765
1766 *StackUsageStream << ':' << MF.getName() << '\t' << StackSize << '\t';
1767 if (FrameInfo.hasVarSizedObjects())
1768 *StackUsageStream << "dynamic\n";
1769 else
1770 *StackUsageStream << "static\n";
1771}
1772
1773/// Extracts a numeric type identifier of a Function's type from
1774/// callgraph metadata. Returns null if metadata cannot be found.
1777 F.getMetadata(LLVMContext::MD_callgraph, Types);
1778 for (const auto &Type : Types) {
1779 if (Type->getNumOperands() == 1 && isa<MDString>(Type->getOperand(0))) {
1780 MDString *MDTypeId = cast<MDString>(Type->getOperand(0));
1781 uint64_t TypeIdVal = llvm::MD5Hash(MDTypeId->getString());
1782 IntegerType *Int64Ty = Type::getInt64Ty(F.getContext());
1783 return ConstantInt::get(Int64Ty, TypeIdVal);
1784 }
1785 }
1786 return nullptr;
1787}
1788
1789/// Emits .llvm.callgraph section.
1791 FunctionCallGraphInfo &FuncCGInfo) {
1792 if (!MF.getTarget().Options.EmitCallGraphSection)
1793 return;
1794
1795 // Switch to the call graph section for the function
1796 MCSection *FuncCGSection =
1798 assert(FuncCGSection && "null callgraph section");
1799 OutStreamer->pushSection();
1800 OutStreamer->switchSection(FuncCGSection);
1801
1802 const Function &F = MF.getFunction();
1803 // If this function has external linkage or has its address taken and
1804 // it is not a callback, then anything could call it.
1805 bool IsIndirectTarget =
1806 !F.hasLocalLinkage() || F.hasAddressTaken(nullptr,
1807 /*IgnoreCallbackUses=*/true,
1808 /*IgnoreAssumeLikeCalls=*/true,
1809 /*IgnoreLLVMUsed=*/false);
1810
1811 const auto &DirectCallees = FuncCGInfo.DirectCallees;
1812 const auto &IndirectCalleeTypeIDs = FuncCGInfo.IndirectCalleeTypeIDs;
1813
1814 using namespace callgraph;
1815 Flags CGFlags = Flags::None;
1816 if (IsIndirectTarget)
1817 CGFlags |= Flags::IsIndirectTarget;
1818 if (DirectCallees.size() > 0)
1819 CGFlags |= Flags::HasDirectCallees;
1820 if (IndirectCalleeTypeIDs.size() > 0)
1821 CGFlags |= Flags::HasIndirectCallees;
1822
1823 // Emit function's call graph information.
1824 // 1) CallGraphSectionFormatVersion
1825 // 2) Flags
1826 // a. LSB bit 0 is set to 1 if the function is a potential indirect
1827 // target.
1828 // b. LSB bit 1 is set to 1 if there are direct callees.
1829 // c. LSB bit 2 is set to 1 if there are indirect callees.
1830 // d. Rest of the 5 bits in Flags are reserved for any future use.
1831 // 3) Function entry PC.
1832 // 4) FunctionTypeID if the function is indirect target and its type id
1833 // is known, otherwise it is set to 0.
1834 // 5) Number of unique direct callees, if at least one exists.
1835 // 6) For each unique direct callee, the callee's PC.
1836 // 7) Number of unique indirect target type IDs, if at least one exists.
1837 // 8) Each unique indirect target type id.
1838 const DataLayout &DL = getDataLayout();
1839 unsigned ProgramPointerSize = DL.getPointerSize(DL.getProgramAddressSpace());
1840 OutStreamer->emitInt8(CallGraphSectionFormatVersion::V_0);
1841 OutStreamer->emitInt8(static_cast<uint8_t>(CGFlags));
1842 OutStreamer->emitSymbolValue(getSymbol(&F), ProgramPointerSize);
1843 const auto *TypeId = extractNumericCGTypeId(F);
1844 if (IsIndirectTarget && TypeId)
1845 OutStreamer->emitInt64(TypeId->getZExtValue());
1846 else
1847 OutStreamer->emitInt64(0);
1848
1849 if (DirectCallees.size() > 0) {
1850 OutStreamer->emitULEB128IntValue(DirectCallees.size());
1851 for (const auto &CalleeSymbol : DirectCallees)
1852 OutStreamer->emitSymbolValue(CalleeSymbol, ProgramPointerSize);
1853 FuncCGInfo.DirectCallees.clear();
1854 }
1855 if (IndirectCalleeTypeIDs.size() > 0) {
1856 OutStreamer->emitULEB128IntValue(IndirectCalleeTypeIDs.size());
1857 for (const auto &CalleeTypeId : IndirectCalleeTypeIDs)
1858 OutStreamer->emitInt64(CalleeTypeId);
1859 FuncCGInfo.IndirectCalleeTypeIDs.clear();
1860 }
1861 // End of emitting call graph section contents.
1862 OutStreamer->popSection();
1863}
1864
1866 const MDNode &MD) {
1867 MCSymbol *S = MF.getContext().createTempSymbol("pcsection");
1868 OutStreamer->emitLabel(S);
1869 PCSectionsSymbols[&MD].emplace_back(S);
1870}
1871
1873 const Function &F = MF.getFunction();
1874 if (PCSectionsSymbols.empty() && !F.hasMetadata(LLVMContext::MD_pcsections))
1875 return;
1876
1877 const CodeModel::Model CM = MF.getTarget().getCodeModel();
1878 const unsigned RelativeRelocSize =
1880 : 4;
1881
1882 // Switch to PCSection, short-circuiting the common case where the current
1883 // section is still valid (assume most MD_pcsections contain just 1 section).
1884 auto SwitchSection = [&, Prev = StringRef()](const StringRef &Sec) mutable {
1885 if (Sec == Prev)
1886 return;
1887 MCSection *S = getObjFileLowering().getPCSection(Sec, MF.getSection());
1888 assert(S && "PC section is not initialized");
1889 OutStreamer->switchSection(S);
1890 Prev = Sec;
1891 };
1892 // Emit symbols into sections and data as specified in the pcsections MDNode.
1893 auto EmitForMD = [&](const MDNode &MD, ArrayRef<const MCSymbol *> Syms,
1894 bool Deltas) {
1895 // Expect the first operand to be a section name. After that, a tuple of
1896 // constants may appear, which will simply be emitted into the current
1897 // section (the user of MD_pcsections decides the format of encoded data).
1898 assert(isa<MDString>(MD.getOperand(0)) && "first operand not a string");
1899 bool ConstULEB128 = false;
1900 for (const MDOperand &MDO : MD.operands()) {
1901 if (auto *S = dyn_cast<MDString>(MDO)) {
1902 // Found string, start of new section!
1903 // Find options for this section "<section>!<opts>" - supported options:
1904 // C = Compress constant integers of size 2-8 bytes as ULEB128.
1905 const StringRef SecWithOpt = S->getString();
1906 const size_t OptStart = SecWithOpt.find('!'); // likely npos
1907 const StringRef Sec = SecWithOpt.substr(0, OptStart);
1908 const StringRef Opts = SecWithOpt.substr(OptStart); // likely empty
1909 ConstULEB128 = Opts.contains('C');
1910#ifndef NDEBUG
1911 for (char O : Opts)
1912 assert((O == '!' || O == 'C') && "Invalid !pcsections options");
1913#endif
1914 SwitchSection(Sec);
1915 const MCSymbol *Prev = Syms.front();
1916 for (const MCSymbol *Sym : Syms) {
1917 if (Sym == Prev || !Deltas) {
1918 // Use the entry itself as the base of the relative offset.
1919 MCSymbol *Base = MF.getContext().createTempSymbol("pcsection_base");
1920 OutStreamer->emitLabel(Base);
1921 // Emit relative relocation `addr - base`, which avoids a dynamic
1922 // relocation in the final binary. User will get the address with
1923 // `base + addr`.
1924 emitLabelDifference(Sym, Base, RelativeRelocSize);
1925 } else {
1926 // Emit delta between symbol and previous symbol.
1927 if (ConstULEB128)
1929 else
1930 emitLabelDifference(Sym, Prev, 4);
1931 }
1932 Prev = Sym;
1933 }
1934 } else {
1935 // Emit auxiliary data after PC.
1936 assert(isa<MDNode>(MDO) && "expecting either string or tuple");
1937 const auto *AuxMDs = cast<MDNode>(MDO);
1938 for (const MDOperand &AuxMDO : AuxMDs->operands()) {
1939 assert(isa<ConstantAsMetadata>(AuxMDO) && "expecting a constant");
1940 const Constant *C = cast<ConstantAsMetadata>(AuxMDO)->getValue();
1941 const DataLayout &DL = F.getDataLayout();
1942 const uint64_t Size = DL.getTypeStoreSize(C->getType());
1943
1944 if (auto *CI = dyn_cast<ConstantInt>(C);
1945 CI && ConstULEB128 && Size > 1 && Size <= 8) {
1946 emitULEB128(CI->getZExtValue());
1947 } else {
1949 }
1950 }
1951 }
1952 }
1953 };
1954
1955 OutStreamer->pushSection();
1956 // Emit PCs for function start and function size.
1957 if (const MDNode *MD = F.getMetadata(LLVMContext::MD_pcsections))
1958 EmitForMD(*MD, {getFunctionBegin(), getFunctionEnd()}, true);
1959 // Emit PCs for instructions collected.
1960 for (const auto &MS : PCSectionsSymbols)
1961 EmitForMD(*MS.first, MS.second, false);
1962 OutStreamer->popSection();
1963 PCSectionsSymbols.clear();
1964}
1965
1966/// Returns true if function begin and end labels should be emitted.
1967static bool needFuncLabels(const MachineFunction &MF, const AsmPrinter &Asm) {
1968 if (Asm.hasDebugInfo() || !MF.getLandingPads().empty() ||
1969 MF.hasEHFunclets() ||
1970 MF.getFunction().hasMetadata(LLVMContext::MD_pcsections))
1971 return true;
1972
1973 // We might emit an EH table that uses function begin and end labels even if
1974 // we don't have any landingpads.
1975 if (!MF.getFunction().hasPersonalityFn())
1976 return false;
1977 return !isNoOpWithoutInvoke(
1979}
1980
1981// Return the mnemonic of a MachineInstr if available, or the MachineInstr
1982// opcode name otherwise.
1984 const TargetInstrInfo *TII =
1985 MI.getParent()->getParent()->getSubtarget().getInstrInfo();
1986 MCInst MCI;
1987 MCI.setOpcode(MI.getOpcode());
1988 if (StringRef Name = Streamer.getMnemonic(MCI); !Name.empty())
1989 return Name;
1990 StringRef Name = TII->getName(MI.getOpcode());
1991 assert(!Name.empty() && "Missing mnemonic and name for opcode");
1992 return Name;
1993}
1994
1996 FunctionCallGraphInfo &FuncCGInfo,
1997 const MachineFunction::CallSiteInfoMap &CallSitesInfoMap,
1998 const MachineInstr &MI) {
1999 assert(MI.isCall() && "This method is meant for call instructions only.");
2000 const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();
2001 const MachineOperand &CalleeOperand = TII->getCalleeOperand(MI);
2002 if (CalleeOperand.isGlobal() || CalleeOperand.isSymbol()) {
2003 // Handle direct calls.
2004 MCSymbol *CalleeSymbol = nullptr;
2005 switch (CalleeOperand.getType()) {
2007 CalleeSymbol = getSymbol(CalleeOperand.getGlobal());
2008 break;
2010 CalleeSymbol = GetExternalSymbolSymbol(CalleeOperand.getSymbolName());
2011 break;
2012 default:
2014 "Expected to only handle direct call instructions here.");
2015 }
2016 FuncCGInfo.DirectCallees.insert(CalleeSymbol);
2017 return; // Early exit after handling the direct call instruction.
2018 }
2019 const auto &CallSiteInfo = CallSitesInfoMap.find(&MI);
2020 if (CallSiteInfo == CallSitesInfoMap.end())
2021 return;
2022 // Handle indirect callsite info.
2023 // Only indirect calls have type identifiers set.
2024 for (ConstantInt *CalleeTypeId : CallSiteInfo->second.CalleeTypeIds) {
2025 uint64_t CalleeTypeIdVal = CalleeTypeId->getZExtValue();
2026 FuncCGInfo.IndirectCalleeTypeIDs.insert(CalleeTypeIdVal);
2027 }
2028}
2029
2030/// Helper to emit a symbol for the prefetch target associated with the given
2031/// BBID and callsite index.
2033 unsigned CallsiteIndex) {
2034 SmallString<128> FunctionName;
2035 getNameWithPrefix(FunctionName, &MF->getFunction());
2036 MCSymbol *PrefetchTargetSymbol = OutContext.getOrCreateSymbol(
2037 getPrefetchTargetSymbolName(FunctionName, BBID, CallsiteIndex));
2038 // If the function is weak-linkage it may be replaced by a strong
2039 // version, in which case the prefetch targets should also be replaced.
2040 OutStreamer->emitSymbolAttribute(
2041 PrefetchTargetSymbol,
2042 MF->getFunction().isWeakForLinker() ? MCSA_Weak : MCSA_Global);
2043 OutStreamer->emitLabel(PrefetchTargetSymbol);
2044}
2045
2046/// Emit dangling prefetch targets that were not mapped to any basic block.
2048 const DenseMap<UniqueBBID, SmallVector<unsigned>> &MFPrefetchTargets =
2049 MF->getPrefetchTargets();
2050 if (MFPrefetchTargets.empty())
2051 return;
2052 DenseSet<UniqueBBID> MFBBIDs;
2053 for (const MachineBasicBlock &MBB : *MF)
2054 if (std::optional<UniqueBBID> BBID = MBB.getBBID())
2055 MFBBIDs.insert(*BBID);
2056
2057 for (const auto &[BBID, CallsiteIndexes] : MFPrefetchTargets) {
2058 if (MFBBIDs.contains(BBID))
2059 continue;
2060 for (unsigned CallsiteIndex : CallsiteIndexes)
2062 }
2063}
2064
2065/// EmitFunctionBody - This method emits the body and trailer for a
2066/// function.
2068 emitFunctionHeader();
2069
2070 // Emit target-specific gunk before the function body.
2072
2073 if (isVerbose()) {
2074 MDT = GetMDT(*MF);
2075 // Get MachineLoopInfo or compute it on the fly if it's unavailable, which
2076 // needs a MachineDominatorTree only for an irreducible CFG.
2077 MLI = GetMLI(*MF);
2078 if (!MLI) {
2079 OwnedMLI = std::make_unique<MachineLoopInfo>();
2080 OwnedMLI->calculate(*MF, [&]() -> const MachineDominatorTree & {
2081 if (!MDT) {
2082 OwnedMDT = std::make_unique<MachineDominatorTree>();
2083 OwnedMDT->recalculate(*MF);
2084 MDT = OwnedMDT.get();
2085 }
2086 return *MDT;
2087 });
2088 MLI = OwnedMLI.get();
2089 }
2090 }
2091
2092 // Print out code for the function.
2093 bool HasAnyRealCode = false;
2094 int NumInstsInFunction = 0;
2095 // Only x86 needs this padding; the Arm unwinders back the PC up themselves.
2096 const Module *M = MMI->getModule();
2097 bool NeedsEHaNops =
2098 M->getTargetTriple().isX86() && M->getModuleFlag("eh-asynch");
2099
2100 const MCSubtargetInfo *STI = nullptr;
2101 if (this->MF)
2102 STI = &getSubtargetInfo();
2103 else
2104 STI = &TM.getMCSubtargetInfo();
2105
2106 bool CanDoExtraAnalysis = ORE->allowExtraAnalysis(DEBUG_TYPE);
2107 // Create a slot for the entry basic block section so that the section
2108 // order is preserved when iterating over MBBSectionRanges.
2109 if (!MF->empty())
2110 MBBSectionRanges[MF->front().getSectionID()] =
2112
2113 FunctionCallGraphInfo FuncCGInfo;
2114 const auto &CallSitesInfoMap = MF->getCallSitesInfo();
2115
2116 // Dangling targets are not mapped to any blocks and must be emitted at the
2117 // beginning of the function.
2119
2120 const auto &MFPrefetchTargets = MF->getPrefetchTargets();
2121 for (auto &MBB : *MF) {
2122 // Print a label for the basic block.
2124 DenseMap<StringRef, unsigned> MnemonicCounts;
2125
2126 const SmallVector<unsigned> *PrefetchTargets = nullptr;
2127 if (auto BBID = MBB.getBBID()) {
2128 auto R = MFPrefetchTargets.find(*BBID);
2129 if (R != MFPrefetchTargets.end())
2130 PrefetchTargets = &R->second;
2131 }
2132 auto PrefetchTargetIt =
2133 PrefetchTargets ? PrefetchTargets->begin() : nullptr;
2134 auto PrefetchTargetEnd = PrefetchTargets ? PrefetchTargets->end() : nullptr;
2135 unsigned LastCallsiteIndex = 0;
2136
2137 for (auto &MI : MBB) {
2138 if (PrefetchTargetIt != PrefetchTargetEnd &&
2139 *PrefetchTargetIt == LastCallsiteIndex) {
2140 emitPrefetchTargetSymbol(*MBB.getBBID(), *PrefetchTargetIt);
2141 ++PrefetchTargetIt;
2142 }
2143
2144 // Print the assembly for the instruction.
2145 if (!MI.isPosition() && !MI.isImplicitDef() && !MI.isKill() &&
2146 !MI.isDebugInstr()) {
2147 HasAnyRealCode = true;
2148 }
2149
2150 // If there is a pre-instruction symbol, emit a label for it here.
2151 if (MCSymbol *S = MI.getPreInstrSymbol())
2152 OutStreamer->emitLabel(S);
2153
2154 if (MDNode *MD = MI.getPCSections())
2155 emitPCSectionsLabel(*MF, *MD);
2156
2157 for (auto &Handler : Handlers)
2158 Handler->beginInstruction(&MI);
2159
2160 if (isVerbose())
2161 emitComments(MI, STI, OutStreamer->getCommentOS());
2162
2163#ifndef NDEBUG
2164 MCFragment *OldFragment = OutStreamer->getCurrentFragment();
2165 size_t OldFragSize = OldFragment->getFixedSize();
2166#endif
2167
2168 switch (MI.getOpcode()) {
2169 case TargetOpcode::CFI_INSTRUCTION:
2171 break;
2172 case TargetOpcode::LOCAL_ESCAPE:
2174 break;
2175 case TargetOpcode::ANNOTATION_LABEL:
2176 case TargetOpcode::GC_LABEL:
2177 OutStreamer->emitLabel(MI.getOperand(0).getMCSymbol());
2178 break;
2179 case TargetOpcode::EH_LABEL:
2180 OutStreamer->AddComment("EH_LABEL");
2181 OutStreamer->emitLabel(MI.getOperand(0).getMCSymbol());
2182 // For AsynchEH, insert a Nop if followed by a trap inst
2183 // Or the exception won't be caught.
2184 // (see MCConstantExpr::create(1,..) in WinException.cpp)
2185 // Ignore SDiv/UDiv because a DIV with Const-0 divisor
2186 // must have being turned into an UndefValue.
2187 // Div with variable opnds won't be the first instruction in
2188 // an EH region as it must be led by at least a Load
2189 {
2190 auto MI2 = std::next(MI.getIterator());
2191 if (NeedsEHaNops && MI2 != MBB.end() &&
2192 (MI2->mayLoadOrStore() || MI2->mayRaiseFPException()))
2193 emitNops(1);
2194 }
2195 break;
2196 case TargetOpcode::INLINEASM:
2197 case TargetOpcode::INLINEASM_BR:
2198 emitInlineAsm(&MI);
2199 break;
2200 case TargetOpcode::DBG_VALUE:
2201 case TargetOpcode::DBG_VALUE_LIST:
2202 if (isVerbose()) {
2203 if (!emitDebugValueComment(&MI, *this))
2205 }
2206 break;
2207 case TargetOpcode::DBG_INSTR_REF:
2208 // This instruction reference will have been resolved to a machine
2209 // location, and a nearby DBG_VALUE created. We can safely ignore
2210 // the instruction reference.
2211 break;
2212 case TargetOpcode::DBG_PHI:
2213 // This instruction is only used to label a program point, it's purely
2214 // meta information.
2215 break;
2216 case TargetOpcode::DBG_LABEL:
2217 if (isVerbose()) {
2218 if (!emitDebugLabelComment(&MI, *this))
2220 }
2221 break;
2222 case TargetOpcode::IMPLICIT_DEF:
2223 if (isVerbose()) emitImplicitDef(&MI);
2224 break;
2225 case TargetOpcode::KILL:
2226 if (isVerbose()) emitKill(&MI, *this);
2227 break;
2228 case TargetOpcode::FAKE_USE:
2229 if (isVerbose())
2230 emitFakeUse(&MI, *this);
2231 break;
2232 case TargetOpcode::PSEUDO_PROBE:
2234 break;
2235 case TargetOpcode::ARITH_FENCE:
2236 if (isVerbose())
2237 OutStreamer->emitRawComment("ARITH_FENCE");
2238 break;
2239 case TargetOpcode::MEMBARRIER:
2240 OutStreamer->emitRawComment("MEMBARRIER");
2241 break;
2242 case TargetOpcode::JUMP_TABLE_DEBUG_INFO:
2243 // This instruction is only used to note jump table debug info, it's
2244 // purely meta information.
2245 break;
2246 case TargetOpcode::INIT_UNDEF:
2247 // This is only used to influence register allocation behavior, no
2248 // actual initialization is needed.
2249 break;
2250 case TargetOpcode::RELOC_NONE: {
2251 // Generate a temporary label for the current PC.
2252 MCSymbol *Sym = OutContext.createTempSymbol("reloc_none");
2253 OutStreamer->emitLabel(Sym);
2254 const MCExpr *Dot = MCSymbolRefExpr::create(Sym, OutContext);
2256 OutContext.getOrCreateSymbol(MI.getOperand(0).getSymbolName()),
2257 OutContext);
2258 OutStreamer->emitRelocDirective(*Dot, "BFD_RELOC_NONE", Value, SMLoc());
2259 break;
2260 }
2261 default:
2263
2264 auto CountInstruction = [&](const MachineInstr &MI) {
2265 // Skip Meta instructions inside bundles.
2266 if (MI.isMetaInstruction())
2267 return;
2268 ++NumInstsInFunction;
2269 if (CanDoExtraAnalysis) {
2271 ++MnemonicCounts[Name];
2272 }
2273 };
2274 if (!MI.isBundle()) {
2275 CountInstruction(MI);
2276 break;
2277 }
2278 // Separately count all the instructions in a bundle.
2279 for (auto It = std::next(MI.getIterator());
2280 It != MBB.end() && It->isInsideBundle(); ++It) {
2281 CountInstruction(*It);
2282 }
2283 break;
2284 }
2285
2286#ifndef NDEBUG
2287 // Verify that the instruction size reported by InstrInfo matches the
2288 // actually emitted size. Many backends performing branch relaxation
2289 // on the MIR level rely on this for correctness.
2290 // TODO: We currently can't distinguish whether a parse error occurred
2291 // when handling INLINEASM.
2292 if (OutStreamer->isObj() && !OutContext.hadError() &&
2293 (MI.getOpcode() != TargetOpcode::INLINEASM &&
2294 MI.getOpcode() != TargetOpcode::INLINEASM_BR)) {
2295 const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();
2297 TII->getInstSizeVerifyMode(MI);
2299 unsigned ExpectedSize = TII->getInstSizeInBytes(MI);
2300 MCFragment *NewFragment = OutStreamer->getCurrentFragment();
2301 unsigned ActualSize;
2302 if (OldFragment == NewFragment) {
2303 ActualSize = NewFragment->getFixedSize() - OldFragSize;
2304 } else {
2305 ActualSize = OldFragment->getFixedSize() - OldFragSize;
2306 const MCFragment *F = OldFragment->getNext();
2307 for (; F != NewFragment; F = F->getNext())
2308 ActualSize += F->getFixedSize();
2309 ActualSize += NewFragment->getFixedSize();
2310 }
2311 bool AllowOverEstimate =
2313 bool Valid = AllowOverEstimate ? ActualSize <= ExpectedSize
2314 : ActualSize == ExpectedSize;
2315 if (!Valid) {
2316 dbgs() << "In function: " << MF->getName() << "\n";
2317 dbgs() << "Size mismatch for: " << MI;
2318 if (MI.isBundled()) {
2319 dbgs() << "{\n";
2320 auto It = MI.getIterator(), End = MBB.instr_end();
2321 for (++It; It != End && It->isInsideBundle(); ++It)
2322 dbgs().indent(2) << *It;
2323 dbgs() << "}\n";
2324 }
2325 dbgs() << "Expected " << (AllowOverEstimate ? "maximum" : "exact")
2326 << " size: " << ExpectedSize << "\n";
2327 dbgs() << "Actual size: " << ActualSize << "\n";
2328 abort();
2329 }
2330 }
2331 }
2332#endif
2333
2334 if (MI.isCall()) {
2335 if (MF->getTarget().Options.BBAddrMap)
2337 LastCallsiteIndex++;
2338 }
2339
2340 if (TM.Options.EmitCallGraphSection && MI.isCall())
2341 handleCallsiteForCallgraph(FuncCGInfo, CallSitesInfoMap, MI);
2342
2343 // If there is a post-instruction symbol, emit a label for it here.
2344 if (MCSymbol *S = MI.getPostInstrSymbol()) {
2345 // Emit the weak symbol attribute used for the prefetch target fallback.
2346 if (M->getTargetTriple().isOSBinFormatELF()) {
2347 MCSymbolELF *ESym = static_cast<MCSymbolELF *>(S);
2348 if (ESym->getBinding() == ELF::STB_WEAK)
2349 OutStreamer->emitSymbolAttribute(S, MCSA_Weak);
2350 }
2351 OutStreamer->emitLabel(S);
2352 }
2353
2354 for (auto &Handler : Handlers)
2355 Handler->endInstruction();
2356 }
2357 // Emit the remaining prefetch targets for this block. This includes
2358 // nonexisting callsite indexes.
2359 while (PrefetchTargetIt != PrefetchTargetEnd) {
2360 emitPrefetchTargetSymbol(*MBB.getBBID(), *PrefetchTargetIt);
2361 ++PrefetchTargetIt;
2362 }
2363
2364 // We must emit temporary symbol for the end of this basic block, if either
2365 // we have BBLabels enabled or if this basic blocks marks the end of a
2366 // section.
2367 if (MF->getTarget().Options.BBAddrMap ||
2368 (MAI.hasDotTypeDotSizeDirective() && MBB.isEndSection()))
2369 OutStreamer->emitLabel(MBB.getEndSymbol());
2370
2371 if (MBB.isEndSection()) {
2372 // The size directive for the section containing the entry block is
2373 // handled separately by the function section.
2374 if (!MBB.sameSection(&MF->front())) {
2375 if (MAI.hasDotTypeDotSizeDirective()) {
2376 // Emit the size directive for the basic block section.
2377 const MCExpr *SizeExp = MCBinaryExpr::createSub(
2378 MCSymbolRefExpr::create(MBB.getEndSymbol(), OutContext),
2379 MCSymbolRefExpr::create(CurrentSectionBeginSym, OutContext),
2380 OutContext);
2381 OutStreamer->emitELFSize(CurrentSectionBeginSym, SizeExp);
2382 }
2383 assert(!MBBSectionRanges.contains(MBB.getSectionID()) &&
2384 "Overwrite section range");
2385 MBBSectionRanges[MBB.getSectionID()] =
2386 MBBSectionRange{CurrentSectionBeginSym, MBB.getEndSymbol()};
2387 }
2388 }
2390
2391 if (CanDoExtraAnalysis) {
2392 // Skip empty blocks.
2393 if (MBB.empty())
2394 continue;
2395
2397 MBB.begin()->getDebugLoc(), &MBB);
2398
2399 // Generate instruction mix remark. First, sort counts in descending order
2400 // by count and name.
2402 for (auto &KV : MnemonicCounts)
2403 MnemonicVec.emplace_back(KV.first, KV.second);
2404
2405 sort(MnemonicVec, [](const std::pair<StringRef, unsigned> &A,
2406 const std::pair<StringRef, unsigned> &B) {
2407 if (A.second > B.second)
2408 return true;
2409 if (A.second == B.second)
2410 return StringRef(A.first) < StringRef(B.first);
2411 return false;
2412 });
2413 R << "BasicBlock: " << ore::NV("BasicBlock", MBB.getName()) << "\n";
2414 for (auto &KV : MnemonicVec) {
2415 auto Name = (Twine("INST_") + getToken(KV.first.trim()).first).str();
2416 R << KV.first << ": " << ore::NV(Name, KV.second) << "\n";
2417 }
2418 ORE->emit(R);
2419 }
2420 }
2421
2422 EmittedInsts += NumInstsInFunction;
2423 MachineOptimizationRemarkAnalysis R(DEBUG_TYPE, "InstructionCount",
2424 MF->getFunction().getSubprogram(),
2425 &MF->front());
2426 R << ore::NV("NumInstructions", NumInstsInFunction)
2427 << " instructions in function";
2428 ORE->emit(R);
2429
2430 if (ORE->allowExtraAnalysis("target-features")) {
2431 const Function &F = MF->getFunction();
2432 std::string FunctionName;
2433 raw_string_ostream OS(FunctionName);
2434 F.printAsOperand(OS, /*PrintType=*/false);
2435
2437 "target-features", "EnabledFeatures", F.getSubprogram(), &MF->front());
2438 Remark << "Enabled features for " << ore::NV("Function", FunctionName)
2439 << ": ";
2440 // The processor feature table is sorted by feature name.
2441 ListSeparator LS(",");
2442 for (const auto *Feature : MF->getSubtarget().getEnabledProcessorFeatures())
2443 Remark << LS << ore::NV("Feature", Feature->key());
2444 ORE->emit(Remark);
2445 }
2446
2447 // If the function is empty and the object file uses .subsections_via_symbols,
2448 // then we need to emit *something* to the function body to prevent the
2449 // labels from collapsing together. Just emit a noop.
2450 // Similarly, don't emit empty functions on Windows either. It can lead to
2451 // duplicate entries (two functions with the same RVA) in the Guard CF Table
2452 // after linking, causing the kernel not to load the binary:
2453 // https://developercommunity.visualstudio.com/content/problem/45366/vc-linker-creates-invalid-dll-with-clang-cl.html
2454 // FIXME: Hide this behind some API in e.g. MCAsmInfo or MCTargetStreamer.
2455 const Triple &TT = M->getTargetTriple();
2456 if (!HasAnyRealCode && (MAI.hasSubsectionsViaSymbols() ||
2457 (TT.isOSWindows() && TT.isOSBinFormatCOFF()))) {
2458 MCInst Noop = MF->getSubtarget().getInstrInfo()->getNop();
2459
2460 // Targets can opt-out of emitting the noop here by leaving the opcode
2461 // unspecified.
2462 if (Noop.getOpcode()) {
2463 OutStreamer->AddComment("avoids zero-length function");
2464 emitNops(1);
2465 }
2466 }
2467
2468 // Switch to the original section in case basic block sections was used.
2469 OutStreamer->switchSection(MF->getSection());
2470
2471 const Function &F = MF->getFunction();
2472 for (const auto &BB : F) {
2473 if (!BB.hasAddressTaken())
2474 continue;
2475 MCSymbol *Sym = GetBlockAddressSymbol(&BB);
2476 if (Sym->isDefined())
2477 continue;
2478 OutStreamer->AddComment("Address of block that was removed by CodeGen");
2479 OutStreamer->emitLabel(Sym);
2480 }
2481
2482 // Emit target-specific gunk after the function body.
2484
2485 // Tail-pad functions that want it.
2486 if (F.hasFnAttribute("tail-pad-to-size")) {
2487 auto *FnEndSym = createTempSymbol("tail_pad_start");
2488 OutStreamer->emitLabel(FnEndSym);
2489
2490 uint64_t PadToSize = F.getFnAttributeAsParsedInteger("tail-pad-to-size");
2491 uint64_t FillValue =
2492 PadToSize ? F.getFnAttributeAsParsedInteger("tail-pad-value") : 0;
2493
2494 // .fill ((PadToSize - FuncSize) & (PadToSize - FuncSize >= 0)) FillValue
2495 const MCExpr *FuncSize = MCBinaryExpr::createSub(
2498 const MCExpr *SizeConst = MCConstantExpr::create(PadToSize, OutContext);
2499 const MCExpr *Zero = MCConstantExpr::create(0, OutContext);
2500 const MCExpr *SubExpr =
2501 MCBinaryExpr::createSub(SizeConst, FuncSize, OutContext);
2502 const MCExpr *Cmp = MCBinaryExpr::createGTE(SubExpr, Zero, OutContext);
2503 const MCExpr *FillExpr = MCBinaryExpr::createAnd(SubExpr, Cmp, OutContext);
2504 OutStreamer->emitFill(*FillExpr, FillValue);
2505 }
2506
2507 // Even though wasm supports .type and .size in general, function symbols
2508 // are automatically sized.
2509 bool EmitFunctionSize = MAI.hasDotTypeDotSizeDirective() && !TT.isWasm();
2510
2511 // SPIR-V supports label instructions only inside a block, not after the
2512 // function body.
2513 if (TT.getObjectFormat() != Triple::SPIRV &&
2514 (EmitFunctionSize || needFuncLabels(*MF, *this) || CurrentFnEnd)) {
2515 // Create a symbol for the end of function, if not already pre-created
2516 // (e.g. for .prefalign directive).
2517 if (!CurrentFnEnd)
2518 CurrentFnEnd = createTempSymbol("func_end");
2519 OutStreamer->emitLabel(CurrentFnEnd);
2520 }
2521
2522 // If the target wants a .size directive for the size of the function, emit
2523 // it.
2524 if (EmitFunctionSize) {
2525 // We can get the size as difference between the function label and the
2526 // temp label.
2527 const MCExpr *SizeExp = MCBinaryExpr::createSub(
2528 MCSymbolRefExpr::create(CurrentFnEnd, OutContext),
2530 OutStreamer->emitELFSize(CurrentFnSym, SizeExp);
2532 OutStreamer->emitELFSize(CurrentFnBeginLocal, SizeExp);
2533 }
2534
2535 // Call endBasicBlockSection on the last block now, if it wasn't already
2536 // called.
2537 if (!MF->back().isEndSection()) {
2538 for (auto &Handler : Handlers)
2539 Handler->endBasicBlockSection(MF->back());
2540 for (auto &Handler : EHHandlers)
2541 Handler->endBasicBlockSection(MF->back());
2542 }
2543 for (auto &Handler : Handlers)
2544 Handler->markFunctionEnd();
2545 for (auto &Handler : EHHandlers)
2546 Handler->markFunctionEnd();
2547 // Update the end label of the entry block's section.
2548 MBBSectionRanges[MF->front().getSectionID()].EndLabel = CurrentFnEnd;
2549
2550 // Print out jump tables referenced by the function.
2552
2553 // Emit post-function debug and/or EH information.
2554 for (auto &Handler : Handlers)
2555 Handler->endFunction(MF);
2556 for (auto &Handler : EHHandlers)
2557 Handler->endFunction(MF);
2558
2559 // Emit section containing BB address offsets and their metadata, when
2560 // BB labels are requested for this function. Skip empty functions.
2561 if (HasAnyRealCode) {
2562 if (MF->getTarget().Options.BBAddrMap)
2564 else if (!PgoAnalysisMapFeatures.empty())
2565 MF->getContext().reportWarning(
2566 SMLoc(), "pgo-analysis-map is enabled for function " + MF->getName() +
2567 " but it does not have labels");
2568 }
2569
2570 // Emit sections containing instruction and function PCs.
2572
2573 // Emit section containing stack size metadata.
2575
2576 // Emit section containing call graph metadata.
2577 emitCallGraphSection(*MF, FuncCGInfo);
2578
2579 // Emit .su file containing function stack size information.
2581
2583
2584 if (isVerbose())
2585 OutStreamer->getCommentOS() << "-- End function\n";
2586
2587 OutStreamer->addBlankLine();
2588}
2589
2590/// Compute the number of Global Variables that uses a Constant.
2591static unsigned getNumGlobalVariableUses(const Constant *C,
2592 bool &HasNonGlobalUsers) {
2593 if (!C) {
2594 HasNonGlobalUsers = true;
2595 return 0;
2596 }
2597
2599 return 1;
2600
2601 unsigned NumUses = 0;
2602 for (const auto *CU : C->users())
2603 NumUses +=
2604 getNumGlobalVariableUses(dyn_cast<Constant>(CU), HasNonGlobalUsers);
2605
2606 return NumUses;
2607}
2608
2609/// Only consider global GOT equivalents if at least one user is a
2610/// cstexpr inside an initializer of another global variables. Also, don't
2611/// handle cstexpr inside instructions. During global variable emission,
2612/// candidates are skipped and are emitted later in case at least one cstexpr
2613/// isn't replaced by a PC relative GOT entry access.
2615 unsigned &NumGOTEquivUsers,
2616 bool &HasNonGlobalUsers) {
2617 // Global GOT equivalents are unnamed private globals with a constant
2618 // pointer initializer to another global symbol. They must point to a
2619 // GlobalVariable or Function, i.e., as GlobalValue.
2620 if (!GV->hasGlobalUnnamedAddr() || !GV->hasInitializer() ||
2621 !GV->isConstant() || !GV->isDiscardableIfUnused() ||
2623 return false;
2624
2625 // To be a got equivalent, at least one of its users need to be a constant
2626 // expression used by another global variable.
2627 for (const auto *U : GV->users())
2628 NumGOTEquivUsers +=
2629 getNumGlobalVariableUses(dyn_cast<Constant>(U), HasNonGlobalUsers);
2630
2631 return NumGOTEquivUsers > 0;
2632}
2633
2634/// Unnamed constant global variables solely contaning a pointer to
2635/// another globals variable is equivalent to a GOT table entry; it contains the
2636/// the address of another symbol. Optimize it and replace accesses to these
2637/// "GOT equivalents" by using the GOT entry for the final global instead.
2638/// Compute GOT equivalent candidates among all global variables to avoid
2639/// emitting them if possible later on, after it use is replaced by a GOT entry
2640/// access.
2642 if (!getObjFileLowering().supportIndirectSymViaGOTPCRel())
2643 return;
2644
2645 for (const auto &G : M.globals()) {
2646 unsigned NumGOTEquivUsers = 0;
2647 bool HasNonGlobalUsers = false;
2648 if (!isGOTEquivalentCandidate(&G, NumGOTEquivUsers, HasNonGlobalUsers))
2649 continue;
2650 // If non-global variables use it, we still need to emit it.
2651 // Add 1 here, then emit it in `emitGlobalGOTEquivs`.
2652 if (HasNonGlobalUsers)
2653 NumGOTEquivUsers += 1;
2654 const MCSymbol *GOTEquivSym = getSymbol(&G);
2655 GlobalGOTEquivs[GOTEquivSym] = std::make_pair(&G, NumGOTEquivUsers);
2656 }
2657}
2658
2659/// Constant expressions using GOT equivalent globals may not be eligible
2660/// for PC relative GOT entry conversion, in such cases we need to emit such
2661/// globals we previously omitted in EmitGlobalVariable.
2663 if (!getObjFileLowering().supportIndirectSymViaGOTPCRel())
2664 return;
2665
2667 for (auto &I : GlobalGOTEquivs) {
2668 const GlobalVariable *GV = I.second.first;
2669 unsigned Cnt = I.second.second;
2670 if (Cnt)
2671 FailedCandidates.push_back(GV);
2672 }
2673 GlobalGOTEquivs.clear();
2674
2675 for (const auto *GV : FailedCandidates)
2677}
2678
2680 MCSymbol *Name = getSymbol(&GA);
2681 const GlobalObject *BaseObject = GA.getAliaseeObject();
2682
2683 bool IsFunction = GA.getValueType()->isFunctionTy();
2684 // Treat bitcasts of functions as functions also. This is important at least
2685 // on WebAssembly where object and function addresses can't alias each other.
2686 if (!IsFunction)
2687 IsFunction = isa_and_nonnull<Function>(BaseObject);
2688
2689 // AIX's assembly directive `.set` is not usable for aliasing purpose,
2690 // so AIX has to use the extra-label-at-definition strategy. At this
2691 // point, all the extra label is emitted, we just have to emit linkage for
2692 // those labels.
2693 if (M.getTargetTriple().isOSBinFormatXCOFF()) {
2694 // Linkage for alias of global variable has been emitted.
2695 if (isa_and_nonnull<GlobalVariable>(BaseObject))
2696 return;
2697
2698 emitLinkage(&GA, Name);
2699 // If it's a function, also emit linkage for aliases of function entry
2700 // point.
2701 if (IsFunction)
2702 emitLinkage(&GA,
2703 getObjFileLowering().getFunctionEntryPointSymbol(&GA, TM));
2704 return;
2705 }
2706
2707 if (GA.hasExternalLinkage() || !MAI.getWeakRefDirective())
2708 OutStreamer->emitSymbolAttribute(Name, MCSA_Global);
2709 else if (GA.hasWeakLinkage() || GA.hasLinkOnceLinkage())
2710 OutStreamer->emitSymbolAttribute(Name, MCSA_WeakReference);
2711 else
2712 assert(GA.hasLocalLinkage() && "Invalid alias linkage");
2713
2714 // Set the symbol type to function if the alias has a function type.
2715 // This affects codegen when the aliasee is not a function.
2716 if (IsFunction) {
2717 OutStreamer->emitSymbolAttribute(Name, MCSA_ELF_TypeFunction);
2718 if (M.getTargetTriple().isOSBinFormatCOFF()) {
2719 OutStreamer->beginCOFFSymbolDef(Name);
2720 OutStreamer->emitCOFFSymbolStorageClass(
2725 OutStreamer->endCOFFSymbolDef();
2726 }
2727 }
2728
2729 emitVisibility(Name, GA.getVisibility());
2730
2731 const MCExpr *Expr = lowerConstant(GA.getAliasee());
2732
2733 if (MAI.isMachO() && isa<MCBinaryExpr>(Expr))
2734 OutStreamer->emitSymbolAttribute(Name, MCSA_AltEntry);
2735
2736 // Emit the directives as assignments aka .set:
2737 OutStreamer->emitAssignment(Name, Expr);
2738 MCSymbol *LocalAlias = getSymbolPreferLocal(GA);
2739 if (LocalAlias != Name)
2740 OutStreamer->emitAssignment(LocalAlias, Expr);
2741
2742 // If the aliasee does not correspond to a symbol in the output, i.e. the
2743 // alias is not of an object or the aliased object is private, then set the
2744 // size of the alias symbol from the type of the alias. We don't do this in
2745 // other situations as the alias and aliasee having differing types but same
2746 // size may be intentional.
2747 if (MAI.hasDotTypeDotSizeDirective() && GA.getValueType()->isSized() &&
2748 (!BaseObject || BaseObject->hasPrivateLinkage())) {
2749 const DataLayout &DL = M.getDataLayout();
2750 uint64_t Size = DL.getTypeAllocSize(GA.getValueType());
2751 OutStreamer->emitELFSize(Name, MCConstantExpr::create(Size, OutContext));
2752 }
2753}
2754
2755void AsmPrinter::emitGlobalIFunc(Module &M, const GlobalIFunc &GI) {
2756 auto EmitLinkage = [&](MCSymbol *Sym) {
2758 OutStreamer->emitSymbolAttribute(Sym, MCSA_Global);
2759 else if (GI.hasWeakLinkage() || GI.hasLinkOnceLinkage())
2760 OutStreamer->emitSymbolAttribute(Sym, MCSA_WeakReference);
2761 else
2762 assert(GI.hasLocalLinkage() && "Invalid ifunc linkage");
2763 };
2764
2765 if (M.getTargetTriple().isOSBinFormatELF()) {
2766 MCSymbol *Name = getSymbol(&GI);
2767 EmitLinkage(Name);
2768 OutStreamer->emitSymbolAttribute(Name, MCSA_ELF_TypeIndFunction);
2769 emitVisibility(Name, GI.getVisibility());
2770
2771 // Emit the directives as assignments aka .set:
2772 const MCExpr *Expr = lowerConstant(GI.getResolver());
2773 OutStreamer->emitAssignment(Name, Expr);
2774 MCSymbol *LocalAlias = getSymbolPreferLocal(GI);
2775 if (LocalAlias != Name)
2776 OutStreamer->emitAssignment(LocalAlias, Expr);
2777
2778 return;
2779 }
2780
2781 if (!M.getTargetTriple().isOSBinFormatMachO() || !getIFuncMCSubtargetInfo())
2782 reportFatalUsageError("IFuncs are not supported on this platform");
2783
2784 // On Darwin platforms, emit a manually-constructed .symbol_resolver that
2785 // implements the symbol resolution duties of the IFunc.
2786 //
2787 // Normally, this would be handled by linker magic, but unfortunately there
2788 // are a few limitations in ld64 and ld-prime's implementation of
2789 // .symbol_resolver that mean we can't always use them:
2790 //
2791 // * resolvers cannot be the target of an alias
2792 // * resolvers cannot have private linkage
2793 // * resolvers cannot have linkonce linkage
2794 // * resolvers cannot appear in executables
2795 // * resolvers cannot appear in bundles
2796 //
2797 // This works around that by emitting a close approximation of what the
2798 // linker would have done.
2799
2800 MCSymbol *LazyPointer =
2801 GetExternalSymbolSymbol(GI.getName() + ".lazy_pointer");
2802 MCSymbol *StubHelper = GetExternalSymbolSymbol(GI.getName() + ".stub_helper");
2803
2804 OutStreamer->switchSection(OutContext.getObjectFileInfo()->getDataSection());
2805
2806 const DataLayout &DL = M.getDataLayout();
2807 emitAlignment(Align(DL.getPointerSize()));
2808 OutStreamer->emitLabel(LazyPointer);
2809 emitVisibility(LazyPointer, GI.getVisibility());
2810 OutStreamer->emitValue(MCSymbolRefExpr::create(StubHelper, OutContext), 8);
2811
2812 OutStreamer->switchSection(OutContext.getObjectFileInfo()->getTextSection());
2813
2814 const TargetSubtargetInfo *STI =
2815 TM.getSubtargetImpl(*GI.getResolverFunction());
2816 const TargetLowering *TLI = STI->getTargetLowering();
2817 Align TextAlign(TLI->getMinFunctionAlignment());
2818
2819 MCSymbol *Stub = getSymbol(&GI);
2820 EmitLinkage(Stub);
2821 OutStreamer->emitCodeAlignment(TextAlign, *getIFuncMCSubtargetInfo());
2822 OutStreamer->emitLabel(Stub);
2823 emitVisibility(Stub, GI.getVisibility());
2824 emitMachOIFuncStubBody(M, GI, LazyPointer);
2825
2826 OutStreamer->emitCodeAlignment(TextAlign, *getIFuncMCSubtargetInfo());
2827 OutStreamer->emitLabel(StubHelper);
2828 emitVisibility(StubHelper, GI.getVisibility());
2829 emitMachOIFuncStubHelperBody(M, GI, LazyPointer);
2830}
2831
2833 if (!RS.wantsSection())
2834 return;
2835 if (!RS.getFilename())
2836 return;
2837
2838 MCSection *RemarksSection =
2839 OutContext.getObjectFileInfo()->getRemarksSection();
2840 if (!RemarksSection && RS.needsSection()) {
2841 OutContext.reportWarning(SMLoc(), "Current object file format does not "
2842 "support remarks sections.");
2843 }
2844 if (!RemarksSection)
2845 return;
2846
2847 SmallString<128> Filename = *RS.getFilename();
2849 assert(!Filename.empty() && "The filename can't be empty.");
2850
2851 std::string Buf;
2852 raw_string_ostream OS(Buf);
2853
2854 remarks::RemarkSerializer &RemarkSerializer = RS.getSerializer();
2855 std::unique_ptr<remarks::MetaSerializer> MetaSerializer =
2856 RemarkSerializer.metaSerializer(OS, Filename);
2857 MetaSerializer->emit();
2858
2859 // Switch to the remarks section.
2860 OutStreamer->switchSection(RemarksSection);
2861 OutStreamer->emitBinaryData(Buf);
2862}
2863
2865 const Constant *Initializer = G.getInitializer();
2866 return G.getDataLayout().getTypeAllocSize(Initializer->getType());
2867}
2868
2870 // We used to do this in clang, but there are optimization passes that turn
2871 // non-constant globals into constants. So now, clang only tells us whether
2872 // it would *like* a global to be tagged, but we still make the decision here.
2873 //
2874 // For now, don't instrument constant data, as it'll be in .rodata anyway. It
2875 // may be worth instrumenting these in future to stop them from being used as
2876 // gadgets.
2877 if (G.getName().starts_with("llvm.") || G.isThreadLocal() || G.isConstant())
2878 return false;
2879
2880 // Globals can be placed implicitly or explicitly in sections. There's two
2881 // different types of globals that meet this criteria that cause problems:
2882 // 1. Function pointers that are going into various init arrays (either
2883 // explicitly through `__attribute__((section(<foo>)))` or implicitly
2884 // through `__attribute__((constructor)))`, such as ".(pre)init(_array)",
2885 // ".fini(_array)", ".ctors", and ".dtors". These function pointers end up
2886 // overaligned and overpadded, making iterating over them problematic, and
2887 // each function pointer is individually tagged (so the iteration over
2888 // them causes SIGSEGV/MTE[AS]ERR).
2889 // 2. Global variables put into an explicit section, where the section's name
2890 // is a valid C-style identifier. The linker emits a `__start_<name>` and
2891 // `__stop_<name>` symbol for the section, so that you can iterate over
2892 // globals within this section. Unfortunately, again, these globals would
2893 // be tagged and so iteration causes SIGSEGV/MTE[AS]ERR.
2894 //
2895 // To mitigate both these cases, and because specifying a section is rare
2896 // outside of these two cases, disable MTE protection for globals in any
2897 // section.
2898 if (G.hasSection())
2899 return false;
2900
2901 return globalSize(G) > 0;
2902}
2903
2905 uint64_t SizeInBytes = globalSize(*G);
2906
2907 uint64_t NewSize = alignTo(SizeInBytes, 16);
2908 if (SizeInBytes != NewSize) {
2909 // Pad the initializer out to the next multiple of 16 bytes.
2910 llvm::SmallVector<uint8_t> Init(NewSize - SizeInBytes, 0);
2911 Constant *Padding = ConstantDataArray::get(M.getContext(), Init);
2912 Constant *Initializer = G->getInitializer();
2913 Initializer = ConstantStruct::getAnon({Initializer, Padding});
2914 auto *NewGV = new GlobalVariable(
2915 M, Initializer->getType(), G->isConstant(), G->getLinkage(),
2916 Initializer, "", G, G->getThreadLocalMode(), G->getAddressSpace());
2917 NewGV->copyAttributesFrom(G);
2918 NewGV->setComdat(G->getComdat());
2919 NewGV->copyMetadata(G, 0);
2920
2921 NewGV->takeName(G);
2922 G->replaceAllUsesWith(NewGV);
2923 G->eraseFromParent();
2924 G = NewGV;
2925 }
2926
2927 if (G->getAlign().valueOrOne() < 16)
2928 G->setAlignment(Align(16));
2929
2930 // Ensure that tagged globals don't get merged by ICF - as they should have
2931 // different tags at runtime.
2932 G->setUnnamedAddr(GlobalValue::UnnamedAddr::None);
2933}
2934
2936 auto Meta = G.getSanitizerMetadata();
2937 Meta.Memtag = false;
2938 G.setSanitizerMetadata(Meta);
2939}
2940
2942 // Set the MachineFunction to nullptr so that we can catch attempted
2943 // accesses to MF specific features at the module level and so that
2944 // we can conditionalize accesses based on whether or not it is nullptr.
2945 MF = nullptr;
2946 const Triple &Target = M.getTargetTriple();
2947
2948 std::vector<GlobalVariable *> GlobalsToTag;
2949 for (GlobalVariable &G : M.globals()) {
2950 if (G.isDeclaration() || !G.isTagged())
2951 continue;
2952 if (!shouldTagGlobal(G)) {
2953 assert(G.hasSanitizerMetadata()); // because isTagged.
2955 assert(!G.isTagged());
2956 continue;
2957 }
2958 GlobalsToTag.push_back(&G);
2959 }
2960 for (GlobalVariable *G : GlobalsToTag)
2962
2963 // Gather all GOT equivalent globals in the module. We really need two
2964 // passes over the globals: one to compute and another to avoid its emission
2965 // in EmitGlobalVariable, otherwise we would not be able to handle cases
2966 // where the got equivalent shows up before its use.
2968
2969 // Emit global variables.
2970 for (const auto &G : M.globals())
2972
2973 // Emit remaining GOT equivalent globals.
2975
2977
2978 // Emit linkage(XCOFF) and visibility info for declarations
2979 for (const Function &F : M) {
2980 if (!F.isDeclarationForLinker())
2981 continue;
2982
2983 MCSymbol *Name = getSymbol(&F);
2984 // Function getSymbol gives us the function descriptor symbol for XCOFF.
2985
2986 if (!Target.isOSBinFormatXCOFF()) {
2987 GlobalValue::VisibilityTypes V = F.getVisibility();
2989 continue;
2990
2991 emitVisibility(Name, V, false);
2992 continue;
2993 }
2994
2995 if (F.isIntrinsic())
2996 continue;
2997
2998 // Handle the XCOFF case.
2999 // Variable `Name` is the function descriptor symbol (see above). Get the
3000 // function entry point symbol.
3001 MCSymbol *FnEntryPointSym = TLOF.getFunctionEntryPointSymbol(&F, TM);
3002 // Emit linkage for the function entry point.
3003 emitLinkage(&F, FnEntryPointSym);
3004
3005 // If a function's address is taken, which means it may be called via a
3006 // function pointer, we need the function descriptor for it.
3007 if (F.hasAddressTaken())
3008 emitLinkage(&F, Name);
3009 }
3010
3011 // Emit the remarks section contents.
3012 // FIXME: Figure out when is the safest time to emit this section. It should
3013 // not come after debug info.
3014 if (remarks::RemarkStreamer *RS = M.getContext().getMainRemarkStreamer())
3015 emitRemarksSection(*RS);
3016
3018
3019 if (Target.isOSBinFormatELF()) {
3020 MachineModuleInfoELF &MMIELF = MMI->getObjFileInfo<MachineModuleInfoELF>();
3021
3022 // Output stubs for external and common global variables.
3024 if (!Stubs.empty()) {
3025 OutStreamer->switchSection(TLOF.getDataSection());
3026 const DataLayout &DL = M.getDataLayout();
3027
3028 emitAlignment(Align(DL.getPointerSize()));
3029 for (const auto &Stub : Stubs) {
3030 OutStreamer->emitLabel(Stub.first);
3031 OutStreamer->emitSymbolValue(Stub.second.getPointer(),
3032 DL.getPointerSize());
3033 }
3034 }
3035 }
3036
3037 if (Target.isOSBinFormatCOFF()) {
3038 MachineModuleInfoCOFF &MMICOFF =
3039 MMI->getObjFileInfo<MachineModuleInfoCOFF>();
3040
3041 // Output stubs for external and common global variables.
3043 if (!Stubs.empty()) {
3044 const DataLayout &DL = M.getDataLayout();
3045
3046 for (const auto &Stub : Stubs) {
3048 SectionName += Stub.first->getName();
3049 OutStreamer->switchSection(OutContext.getCOFFSection(
3053 Stub.first->getName(), COFF::IMAGE_COMDAT_SELECT_ANY));
3054 emitAlignment(Align(DL.getPointerSize()));
3055 OutStreamer->emitSymbolAttribute(Stub.first, MCSA_Global);
3056 OutStreamer->emitLabel(Stub.first);
3057 OutStreamer->emitSymbolValue(Stub.second.getPointer(),
3058 DL.getPointerSize());
3059 }
3060 }
3061 }
3062
3063 // This needs to happen before emitting debug information since that can end
3064 // arbitrary sections.
3065 if (auto *TS = OutStreamer->getTargetStreamer())
3066 TS->emitConstantPools();
3067
3068 // Emit Stack maps before any debug info. Mach-O requires that no data or
3069 // text sections come after debug info has been emitted. This matters for
3070 // stack maps as they are arbitrary data, and may even have a custom format
3071 // through user plugins.
3072 EmitStackMaps(M);
3073
3074 // Print aliases in topological order, that is, for each alias a = b,
3075 // b must be printed before a.
3076 // This is because on some targets (e.g. PowerPC) linker expects aliases in
3077 // such an order to generate correct TOC information.
3080 for (const auto &Alias : M.aliases()) {
3081 if (Alias.hasAvailableExternallyLinkage())
3082 continue;
3083 for (const GlobalAlias *Cur = &Alias; Cur;
3084 Cur = dyn_cast<GlobalAlias>(Cur->getAliasee())) {
3085 if (!AliasVisited.insert(Cur).second)
3086 break;
3087 AliasStack.push_back(Cur);
3088 }
3089 for (const GlobalAlias *AncestorAlias : llvm::reverse(AliasStack))
3090 emitGlobalAlias(M, *AncestorAlias);
3091 AliasStack.clear();
3092 }
3093
3094 // IFuncs must come before deubginfo in case the backend decides to emit them
3095 // as actual functions, since on Mach-O targets, we cannot create regular
3096 // sections after DWARF.
3097 for (const auto &IFunc : M.ifuncs())
3098 emitGlobalIFunc(M, IFunc);
3099 if (M.getTargetTriple().isOSBinFormatXCOFF() && hasDebugInfo()) {
3100 // Emit section end. This is used to tell the debug line section where the
3101 // end is for a text section if we don't use .loc to represent the debug
3102 // line.
3103 auto *Sec = OutContext.getObjectFileInfo()->getTextSection();
3104 OutStreamer->switchSectionNoPrint(Sec);
3105 MCSymbol *Sym = Sec->getEndSymbol(OutContext);
3106 OutStreamer->emitLabel(Sym);
3107 }
3108
3109 // Finalize debug and EH information.
3110 for (auto &Handler : Handlers)
3111 Handler->endModule();
3112 for (auto &Handler : EHHandlers)
3113 Handler->endModule();
3114
3115 // This deletes all the ephemeral handlers that AsmPrinter added, while
3116 // keeping all the user-added handlers alive until the AsmPrinter is
3117 // destroyed.
3118 EHHandlers.clear();
3119 Handlers.erase(Handlers.begin() + NumUserHandlers, Handlers.end());
3120 DD = nullptr;
3121
3122 // If the target wants to know about weak references, print them all.
3123 if (MAI.getWeakRefDirective()) {
3124 // FIXME: This is not lazy, it would be nice to only print weak references
3125 // to stuff that is actually used. Note that doing so would require targets
3126 // to notice uses in operands (due to constant exprs etc). This should
3127 // happen with the MC stuff eventually.
3128
3129 // Print out module-level global objects here.
3130 for (const auto &GO : M.global_objects()) {
3131 if (!GO.hasExternalWeakLinkage())
3132 continue;
3133 OutStreamer->emitSymbolAttribute(getSymbol(&GO), MCSA_WeakReference);
3134 }
3136 auto SymbolName = "swift_async_extendedFramePointerFlags";
3137 auto Global = M.getGlobalVariable(SymbolName);
3138 if (!Global) {
3139 auto PtrTy = PointerType::getUnqual(M.getContext());
3140 Global = new GlobalVariable(M, PtrTy, false,
3142 SymbolName);
3143 OutStreamer->emitSymbolAttribute(getSymbol(Global), MCSA_WeakReference);
3144 }
3145 }
3146 }
3147
3149
3150 // Emit llvm.ident metadata in an '.ident' directive.
3151 emitModuleIdents(M);
3152
3153 // Emit bytes for llvm.commandline metadata.
3154 // The command line metadata is emitted earlier on XCOFF.
3155 if (!Target.isOSBinFormatXCOFF())
3156 emitModuleCommandLines(M);
3157
3158 // Emit .note.GNU-split-stack and .note.GNU-no-split-stack sections if
3159 // split-stack is used.
3160 if (M.getTargetTriple().isOSBinFormatELF() && HasSplitStack) {
3161 OutStreamer->switchSection(OutContext.getELFSection(".note.GNU-split-stack",
3162 ELF::SHT_PROGBITS, 0));
3163 if (HasNoSplitStack)
3164 OutStreamer->switchSection(OutContext.getELFSection(
3165 ".note.GNU-no-split-stack", ELF::SHT_PROGBITS, 0));
3166 }
3167
3168 // If we don't have any trampolines, then we don't require stack memory
3169 // to be executable. Some targets have a directive to declare this.
3170 Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline");
3171 bool HasTrampolineUses =
3172 InitTrampolineIntrinsic && !InitTrampolineIntrinsic->use_empty();
3173 MCSection *S = MAI.getStackSection(OutContext, /*Exec=*/HasTrampolineUses);
3174 if (S)
3175 OutStreamer->switchSection(S);
3176
3177 if (TM.Options.EmitAddrsig) {
3178 // Emit address-significance attributes for all globals.
3179 OutStreamer->emitAddrsig();
3180 for (const GlobalValue &GV : M.global_values()) {
3181 if (!GV.use_empty() && !GV.isThreadLocal() &&
3182 !GV.hasDLLImportStorageClass() &&
3183 !GV.getName().starts_with("llvm.") &&
3184 !GV.hasAtLeastLocalUnnamedAddr())
3185 OutStreamer->emitAddrsigSym(getSymbol(&GV));
3186 }
3187 }
3188
3189 // Emit symbol partition specifications (ELF only).
3190 if (Target.isOSBinFormatELF()) {
3191 unsigned UniqueID = 0;
3192 for (const GlobalValue &GV : M.global_values()) {
3193 if (!GV.hasPartition() || GV.isDeclarationForLinker() ||
3194 GV.getVisibility() != GlobalValue::DefaultVisibility)
3195 continue;
3196
3197 OutStreamer->switchSection(
3198 OutContext.getELFSection(".llvm_sympart", ELF::SHT_LLVM_SYMPART, 0, 0,
3199 "", false, ++UniqueID, nullptr));
3200 OutStreamer->emitBytes(GV.getPartition());
3201 OutStreamer->emitZeros(1);
3202 OutStreamer->emitValue(
3204 MAI.getCodePointerSize());
3205 }
3206 }
3207
3208 // Allow the target to emit any magic that it wants at the end of the file,
3209 // after everything else has gone out.
3211
3212 MMI = nullptr;
3213 AddrLabelSymbols = nullptr;
3214
3215 OutStreamer->finish();
3216 OutStreamer->reset();
3217 OwnedMLI.reset();
3218 OwnedMDT.reset();
3219
3220 return false;
3221}
3222
3224 auto Res = MBBSectionExceptionSyms.try_emplace(MBB.getSectionID());
3225 if (Res.second)
3226 Res.first->second = createTempSymbol("exception");
3227 return Res.first->second;
3228}
3229
3231 MCContext &Ctx = MF->getContext();
3232 MCSymbol *Sym = Ctx.createTempSymbol("BB" + Twine(MF->getFunctionNumber()) +
3233 "_" + Twine(MBB.getNumber()) + "_CS");
3234 CurrentFnCallsiteEndSymbols[&MBB].push_back(Sym);
3235 return Sym;
3236}
3237
3239 this->MF = &MF;
3240 const Function &F = MF.getFunction();
3241
3242 // Record that there are split-stack functions, so we will emit a special
3243 // section to tell the linker.
3244 if (MF.shouldSplitStack()) {
3245 HasSplitStack = true;
3246
3247 if (!MF.getFrameInfo().needsSplitStackProlog())
3248 HasNoSplitStack = true;
3249 } else
3250 HasNoSplitStack = true;
3251
3252 // Get the function symbol.
3253 if (!MAI.isAIX()) {
3254 CurrentFnSym = getSymbol(&MF.getFunction());
3255 } else {
3256 assert(TM.getTargetTriple().isOSAIX() &&
3257 "Only AIX uses the function descriptor hooks.");
3258 // AIX is unique here in that the name of the symbol emitted for the
3259 // function body does not have the same name as the source function's
3260 // C-linkage name.
3261 assert(CurrentFnDescSym && "The function descriptor symbol needs to be"
3262 " initalized first.");
3263
3264 // Get the function entry point symbol.
3266 }
3267
3269 CurrentFnBegin = nullptr;
3270 CurrentFnBeginLocal = nullptr;
3271 CurrentFnEnd = nullptr;
3272 CurrentSectionBeginSym = nullptr;
3274 MBBSectionRanges.clear();
3275 MBBSectionExceptionSyms.clear();
3276 bool NeedsLocalForSize = MAI.needsLocalForSize();
3277 if (F.hasFnAttribute("patchable-function-entry") ||
3278 F.hasFnAttribute("tail-pad-to-size") ||
3279 F.hasFnAttribute("function-instrument") ||
3280 F.hasFnAttribute("xray-instruction-threshold") ||
3281 needFuncLabels(MF, *this) || NeedsLocalForSize ||
3282 MF.getTarget().Options.EmitStackSizeSection ||
3283 MF.getTarget().Options.EmitCallGraphSection ||
3284 MF.getTarget().Options.BBAddrMap) {
3285 CurrentFnBegin = createTempSymbol("func_begin");
3286 if (NeedsLocalForSize)
3288 }
3289
3290 ORE = GetORE(MF);
3291}
3292
3293namespace {
3294
3295// Keep track the alignment, constpool entries per Section.
3296 struct SectionCPs {
3297 MCSection *S;
3298 Align Alignment;
3300
3301 SectionCPs(MCSection *s, Align a) : S(s), Alignment(a) {}
3302 };
3303
3304} // end anonymous namespace
3305
3307 if (TM.Options.EnableStaticDataPartitioning && C && SDPI && PSI)
3308 return SDPI->getConstantSectionPrefix(C, PSI);
3309
3310 return "";
3311}
3312
3313/// EmitConstantPool - Print to the current output stream assembly
3314/// representations of the constants in the constant pool MCP. This is
3315/// used to print out constants which have been "spilled to memory" by
3316/// the code generator.
3318 const MachineConstantPool *MCP = MF->getConstantPool();
3319 const std::vector<MachineConstantPoolEntry> &CP = MCP->getConstants();
3320 if (CP.empty()) return;
3321
3322 // Calculate sections for constant pool entries. We collect entries to go into
3323 // the same section together to reduce amount of section switch statements.
3324 SmallVector<SectionCPs, 4> CPSections;
3325 for (unsigned i = 0, e = CP.size(); i != e; ++i) {
3326 const MachineConstantPoolEntry &CPE = CP[i];
3327 Align Alignment = CPE.getAlign();
3328
3330
3331 const Constant *C = nullptr;
3332 if (!CPE.isMachineConstantPoolEntry())
3333 C = CPE.Val.ConstVal;
3334
3336 getDataLayout(), Kind, C, Alignment, &MF->getFunction(),
3338
3339 // The number of sections are small, just do a linear search from the
3340 // last section to the first.
3341 bool Found = false;
3342 unsigned SecIdx = CPSections.size();
3343 while (SecIdx != 0) {
3344 if (CPSections[--SecIdx].S == S) {
3345 Found = true;
3346 break;
3347 }
3348 }
3349 if (!Found) {
3350 SecIdx = CPSections.size();
3351 CPSections.push_back(SectionCPs(S, Alignment));
3352 }
3353
3354 if (Alignment > CPSections[SecIdx].Alignment)
3355 CPSections[SecIdx].Alignment = Alignment;
3356 CPSections[SecIdx].CPEs.push_back(i);
3357 }
3358
3359 // Now print stuff into the calculated sections.
3360 const MCSection *CurSection = nullptr;
3361 unsigned Offset = 0;
3362 for (const SectionCPs &CPSection : CPSections) {
3363 for (unsigned CPI : CPSection.CPEs) {
3364 MCSymbol *Sym = GetCPISymbol(CPI);
3365 if (!Sym->isUndefined())
3366 continue;
3367
3368 if (CurSection != CPSection.S) {
3369 OutStreamer->switchSection(CPSection.S);
3370 emitAlignment(Align(CPSection.Alignment));
3371 CurSection = CPSection.S;
3372 Offset = 0;
3373 }
3374
3375 MachineConstantPoolEntry CPE = CP[CPI];
3376
3377 // Emit inter-object padding for alignment.
3378 unsigned NewOffset = alignTo(Offset, CPE.getAlign());
3379 OutStreamer->emitZeros(NewOffset - Offset);
3380
3381 if (MAI.hasDotTypeDotSizeDirective())
3382 OutStreamer->emitSymbolAttribute(Sym, MCSA_ELF_TypeObject);
3383 OutStreamer->emitLabel(Sym);
3384
3387 else
3389
3390 unsigned EntrySize = CPE.getSizeInBytes(getDataLayout());
3391 if (MAI.hasDotTypeDotSizeDirective())
3392 OutStreamer->emitELFSize(Sym,
3394
3395 Offset = NewOffset + EntrySize;
3396 }
3397 }
3398}
3399
3400// Print assembly representations of the jump tables used by the current
3401// function.
3403 const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
3404 if (!MJTI) return;
3405
3406 const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
3407 if (JT.empty()) return;
3408
3409 if (!TM.Options.EnableStaticDataPartitioning) {
3410 emitJumpTableImpl(*MJTI, llvm::to_vector(llvm::seq<unsigned>(JT.size())));
3411 return;
3412 }
3413
3414 SmallVector<unsigned> HotJumpTableIndices, ColdJumpTableIndices;
3415 // When static data partitioning is enabled, collect jump table entries that
3416 // go into the same section together to reduce the amount of section switch
3417 // statements.
3418 for (unsigned JTI = 0, JTSize = JT.size(); JTI < JTSize; ++JTI) {
3419 if (JT[JTI].Hotness == MachineFunctionDataHotness::Cold) {
3420 ColdJumpTableIndices.push_back(JTI);
3421 } else {
3422 HotJumpTableIndices.push_back(JTI);
3423 }
3424 }
3425
3426 emitJumpTableImpl(*MJTI, HotJumpTableIndices);
3427 emitJumpTableImpl(*MJTI, ColdJumpTableIndices);
3428}
3429
3430void AsmPrinter::emitJumpTableImpl(const MachineJumpTableInfo &MJTI,
3431 ArrayRef<unsigned> JumpTableIndices) {
3433 JumpTableIndices.empty())
3434 return;
3435
3437 const Function &F = MF->getFunction();
3438 const std::vector<MachineJumpTableEntry> &JT = MJTI.getJumpTables();
3439 MCSection *JumpTableSection = nullptr;
3440
3441 const bool UseLabelDifference =
3444 // Pick the directive to use to print the jump table entries, and switch to
3445 // the appropriate section.
3446 const bool JTInDiffSection =
3447 !TLOF.shouldPutJumpTableInFunctionSection(UseLabelDifference, F);
3448 if (JTInDiffSection) {
3450 JumpTableSection =
3451 TLOF.getSectionForJumpTable(F, TM, &JT[JumpTableIndices.front()]);
3452 } else {
3453 JumpTableSection = TLOF.getSectionForJumpTable(F, TM);
3454 }
3455 OutStreamer->switchSection(JumpTableSection);
3456 }
3457
3458 const DataLayout &DL = MF->getDataLayout();
3460
3461 // Jump tables in code sections are marked with a data_region directive
3462 // where that's supported.
3463 if (!JTInDiffSection)
3464 OutStreamer->emitDataRegion(MCDR_DataRegionJT32);
3465
3466 for (const unsigned JumpTableIndex : JumpTableIndices) {
3467 ArrayRef<MachineBasicBlock *> JTBBs = JT[JumpTableIndex].MBBs;
3468
3469 // If this jump table was deleted, ignore it.
3470 if (JTBBs.empty())
3471 continue;
3472
3473 // For the EK_LabelDifference32 entry, if using .set avoids a relocation,
3474 /// emit a .set directive for each unique entry.
3476 MAI.doesSetDirectiveSuppressReloc()) {
3477 SmallPtrSet<const MachineBasicBlock *, 16> EmittedSets;
3478 const TargetLowering *TLI = MF->getSubtarget().getTargetLowering();
3479 const MCExpr *Base =
3480 TLI->getPICJumpTableRelocBaseExpr(MF, JumpTableIndex, OutContext);
3481 for (const MachineBasicBlock *MBB : JTBBs) {
3482 if (!EmittedSets.insert(MBB).second)
3483 continue;
3484
3485 // .set LJTSet, LBB32-base
3486 const MCExpr *LHS =
3488 OutStreamer->emitAssignment(
3489 GetJTSetSymbol(JumpTableIndex, MBB->getNumber()),
3491 }
3492 }
3493
3494 // On some targets (e.g. Darwin) we want to emit two consecutive labels
3495 // before each jump table. The first label is never referenced, but tells
3496 // the assembler and linker the extents of the jump table object. The
3497 // second label is actually referenced by the code.
3498 if (JTInDiffSection && DL.hasLinkerPrivateGlobalPrefix())
3499 // FIXME: This doesn't have to have any specific name, just any randomly
3500 // named and numbered local label started with 'l' would work. Simplify
3501 // GetJTISymbol.
3502 OutStreamer->emitLabel(GetJTISymbol(JumpTableIndex, true));
3503
3504 MCSymbol *JTISymbol = GetJTISymbol(JumpTableIndex);
3505 if (JTInDiffSection && MAI.hasDotTypeDotSizeDirective())
3506 OutStreamer->emitSymbolAttribute(JTISymbol, MCSA_ELF_TypeObject);
3507 OutStreamer->emitLabel(JTISymbol);
3508
3509 // Defer MCAssembler based constant folding due to a performance issue. The
3510 // label differences will be evaluated at write time.
3511 for (const MachineBasicBlock *MBB : JTBBs)
3512 emitJumpTableEntry(MJTI, MBB, JumpTableIndex);
3513
3514 if (JTInDiffSection && MAI.hasDotTypeDotSizeDirective())
3515 OutStreamer->emitELFSize(
3516 JTISymbol, MCConstantExpr::create(
3517 JTBBs.size() * MJTI.getEntrySize(DL), OutContext));
3518 }
3519
3521 emitJumpTableSizesSection(MJTI, MF->getFunction());
3522
3523 if (!JTInDiffSection)
3524 OutStreamer->emitDataRegion(MCDR_DataRegionEnd);
3525}
3526
3527void AsmPrinter::emitJumpTableSizesSection(const MachineJumpTableInfo &MJTI,
3528 const Function &F) const {
3529 const std::vector<MachineJumpTableEntry> &JT = MJTI.getJumpTables();
3530
3531 if (JT.empty())
3532 return;
3533
3534 StringRef GroupName = F.hasComdat() ? F.getComdat()->getName() : "";
3535 MCSection *JumpTableSizesSection = nullptr;
3536 StringRef sectionName = ".llvm_jump_table_sizes";
3537
3538 bool isElf = TM.getTargetTriple().isOSBinFormatELF();
3539 bool isCoff = TM.getTargetTriple().isOSBinFormatCOFF();
3540
3541 if (!isCoff && !isElf)
3542 return;
3543
3544 if (isElf) {
3545 auto *LinkedToSym = static_cast<MCSymbolELF *>(CurrentFnSym);
3546 int Flags = F.hasComdat() ? static_cast<int>(ELF::SHF_GROUP) : 0;
3547
3548 JumpTableSizesSection = OutContext.getELFSection(
3549 sectionName, ELF::SHT_LLVM_JT_SIZES, Flags, 0, GroupName, F.hasComdat(),
3550 MCSection::NonUniqueID, LinkedToSym);
3551 } else if (isCoff) {
3552 if (F.hasComdat()) {
3553 JumpTableSizesSection = OutContext.getCOFFSection(
3554 sectionName,
3557 F.getComdat()->getName(), COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE);
3558 } else {
3559 JumpTableSizesSection = OutContext.getCOFFSection(
3563 }
3564 }
3565
3566 OutStreamer->switchSection(JumpTableSizesSection);
3567
3568 const DataLayout &DL = getDataLayout();
3569 unsigned ProgramPointerSize = DL.getPointerSize(DL.getProgramAddressSpace());
3570 for (unsigned JTI = 0, E = JT.size(); JTI != E; ++JTI) {
3571 const std::vector<MachineBasicBlock *> &JTBBs = JT[JTI].MBBs;
3572 OutStreamer->emitSymbolValue(GetJTISymbol(JTI), ProgramPointerSize);
3573 OutStreamer->emitIntValue(JTBBs.size(), ProgramPointerSize);
3574 }
3575}
3576
3577/// EmitJumpTableEntry - Emit a jump table entry for the specified MBB to the
3578/// current stream.
3580 const MachineBasicBlock *MBB,
3581 unsigned UID) const {
3582 assert(MBB && MBB->getNumber() >= 0 && "Invalid basic block");
3583 const MCExpr *Value = nullptr;
3584 switch (MJTI.getEntryKind()) {
3586 llvm_unreachable("Cannot emit EK_Inline jump table entry");
3589 llvm_unreachable("MIPS specific");
3591 Value = MF->getSubtarget().getTargetLowering()->LowerCustomJumpTableEntry(
3592 &MJTI, MBB, UID, OutContext);
3593 break;
3595 // EK_BlockAddress - Each entry is a plain address of block, e.g.:
3596 // .word LBB123
3598 break;
3599
3602 // Each entry is the address of the block minus the address of the jump
3603 // table. This is used for PIC jump tables where gprel32 is not supported.
3604 // e.g.:
3605 // .word LBB123 - LJTI1_2
3606 // If the .set directive avoids relocations, this is emitted as:
3607 // .set L4_5_set_123, LBB123 - LJTI1_2
3608 // .word L4_5_set_123
3610 MAI.doesSetDirectiveSuppressReloc()) {
3611 Value = MCSymbolRefExpr::create(GetJTSetSymbol(UID, MBB->getNumber()),
3612 OutContext);
3613 break;
3614 }
3616 const TargetLowering *TLI = MF->getSubtarget().getTargetLowering();
3619 break;
3620 }
3621 }
3622
3623 assert(Value && "Unknown entry kind!");
3624
3625 unsigned EntrySize = MJTI.getEntrySize(getDataLayout());
3626 OutStreamer->emitValue(Value, EntrySize);
3627}
3628
3629/// EmitSpecialLLVMGlobal - Check to see if the specified global is a
3630/// special global used by LLVM. If so, emit it and return true, otherwise
3631/// do nothing and return false.
3633 if (GV->getName() == "llvm.used") {
3634 if (MAI.hasNoDeadStrip()) // No need to emit this at all.
3635 emitLLVMUsedList(cast<ConstantArray>(GV->getInitializer()));
3636 return true;
3637 }
3638
3639 // Ignore debug and non-emitted data. This handles llvm.compiler.used.
3640 if (GV->getSection() == "llvm.metadata" ||
3642 return true;
3643
3644 if (GV->getName() == "llvm.arm64ec.symbolmap") {
3645 // For ARM64EC, print the table that maps between symbols and the
3646 // corresponding thunks to translate between x64 and AArch64 code.
3647 // This table is generated by AArch64Arm64ECCallLowering.
3648 OutStreamer->switchSection(
3649 OutContext.getCOFFSection(".hybmp$x", COFF::IMAGE_SCN_LNK_INFO));
3650 auto *Arr = cast<ConstantArray>(GV->getInitializer());
3651 for (auto &U : Arr->operands()) {
3652 auto *C = cast<Constant>(U);
3653 auto *Src = cast<GlobalValue>(C->getOperand(0)->stripPointerCasts());
3654 auto *Dst = cast<GlobalValue>(C->getOperand(1)->stripPointerCasts());
3655 int Kind = cast<ConstantInt>(C->getOperand(2))->getZExtValue();
3656
3657 if (Src->hasDLLImportStorageClass()) {
3658 // For now, we assume dllimport functions aren't directly called.
3659 // (We might change this later to match MSVC.)
3660 OutStreamer->emitCOFFSymbolIndex(
3661 OutContext.getOrCreateSymbol("__imp_" + Src->getName()));
3662 OutStreamer->emitCOFFSymbolIndex(getSymbol(Dst));
3663 OutStreamer->emitInt32(Kind);
3664 } else {
3665 // FIXME: For non-dllimport functions, MSVC emits the same entry
3666 // twice, for reasons I don't understand. I have to assume the linker
3667 // ignores the redundant entry; there aren't any reasonable semantics
3668 // to attach to it.
3669 OutStreamer->emitCOFFSymbolIndex(getSymbol(Src));
3670 OutStreamer->emitCOFFSymbolIndex(getSymbol(Dst));
3671 OutStreamer->emitInt32(Kind);
3672 }
3673 }
3674 return true;
3675 }
3676
3677 if (!GV->hasAppendingLinkage()) return false;
3678
3679 assert(GV->hasInitializer() && "Not a special LLVM global!");
3680
3681 if (GV->getName() == "llvm.global_ctors") {
3683 /* isCtor */ true);
3684
3685 return true;
3686 }
3687
3688 if (GV->getName() == "llvm.global_dtors") {
3690 /* isCtor */ false);
3691
3692 return true;
3693 }
3694
3695 GV->getContext().emitError(
3696 "unknown special variable with appending linkage: " +
3697 GV->getNameOrAsOperand());
3698 return true;
3699}
3700
3701/// EmitLLVMUsedList - For targets that define a MAI::UsedDirective, mark each
3702/// global in the specified llvm.used list.
3703void AsmPrinter::emitLLVMUsedList(const ConstantArray *InitList) {
3704 // Should be an array of 'i8*'.
3705 for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {
3706 const GlobalValue *GV =
3708 if (GV)
3709 OutStreamer->emitSymbolAttribute(getSymbol(GV), MCSA_NoDeadStrip);
3710 }
3711}
3712
3714 const Constant *List,
3715 SmallVector<Structor, 8> &Structors) {
3716 // Should be an array of '{ i32, void ()*, i8* }' structs. The first value is
3717 // the init priority.
3719 return;
3720
3721 // Gather the structors in a form that's convenient for sorting by priority.
3722 for (Value *O : cast<ConstantArray>(List)->operands()) {
3723 auto *CS = cast<ConstantStruct>(O);
3724 if (CS->getOperand(1)->isNullValue())
3725 break; // Found a null terminator, skip the rest.
3726 ConstantInt *Priority = dyn_cast<ConstantInt>(CS->getOperand(0));
3727 if (!Priority)
3728 continue; // Malformed.
3729 Structors.push_back(Structor());
3730 Structor &S = Structors.back();
3731 S.Priority = Priority->getLimitedValue(65535);
3732 S.Func = CS->getOperand(1);
3733 if (!CS->getOperand(2)->isNullValue()) {
3734 if (TM.getTargetTriple().isOSAIX()) {
3735 CS->getContext().emitError(
3736 "associated data of XXStructor list is not yet supported on AIX");
3737 }
3738
3739 S.ComdatKey =
3740 dyn_cast<GlobalValue>(CS->getOperand(2)->stripPointerCasts());
3741 }
3742 }
3743
3744 // Emit the function pointers in the target-specific order
3745 llvm::stable_sort(Structors, [](const Structor &L, const Structor &R) {
3746 return L.Priority < R.Priority;
3747 });
3748}
3749
3750/// EmitXXStructorList - Emit the ctor or dtor list taking into account the init
3751/// priority.
3753 bool IsCtor) {
3754 SmallVector<Structor, 8> Structors;
3755 preprocessXXStructorList(DL, List, Structors);
3756 if (Structors.empty())
3757 return;
3758
3759 // Emit the structors in reverse order if we are using the .ctor/.dtor
3760 // initialization scheme.
3761 if (!TM.Options.UseInitArray)
3762 std::reverse(Structors.begin(), Structors.end());
3763
3764 const Align Align = DL.getPointerPrefAlignment(DL.getProgramAddressSpace());
3765 for (Structor &S : Structors) {
3767 const MCSymbol *KeySym = nullptr;
3768 if (GlobalValue *GV = S.ComdatKey) {
3769 if (GV->isDeclarationForLinker())
3770 // If the associated variable is not defined in this module
3771 // (it might be available_externally, or have been an
3772 // available_externally definition that was dropped by the
3773 // EliminateAvailableExternally pass), some other TU
3774 // will provide its dynamic initializer.
3775 continue;
3776
3777 KeySym = getSymbol(GV);
3778 }
3779
3780 MCSection *OutputSection =
3781 (IsCtor ? Obj.getStaticCtorSection(S.Priority, KeySym)
3782 : Obj.getStaticDtorSection(S.Priority, KeySym));
3783 OutStreamer->switchSection(OutputSection);
3784 if (OutStreamer->getCurrentSection() != OutStreamer->getPreviousSection())
3786 emitXXStructor(DL, S.Func);
3787 }
3788}
3789
3790void AsmPrinter::emitModuleIdents(Module &M) {
3791 if (!MAI.hasIdentDirective())
3792 return;
3793
3794 if (const NamedMDNode *NMD = M.getNamedMetadata("llvm.ident")) {
3795 for (const MDNode *N : NMD->operands()) {
3796 assert(N->getNumOperands() == 1 &&
3797 "llvm.ident metadata entry can have only one operand");
3798 const MDString *S = cast<MDString>(N->getOperand(0));
3799 OutStreamer->emitIdent(S->getString());
3800 }
3801 }
3802}
3803
3804void AsmPrinter::emitModuleCommandLines(Module &M) {
3805 MCSection *CommandLine = getObjFileLowering().getSectionForCommandLines();
3806 if (!CommandLine)
3807 return;
3808
3809 const NamedMDNode *NMD = M.getNamedMetadata("llvm.commandline");
3810 if (!NMD || !NMD->getNumOperands())
3811 return;
3812
3813 OutStreamer->pushSection();
3814 OutStreamer->switchSection(CommandLine);
3815 OutStreamer->emitZeros(1);
3816 for (const MDNode *N : NMD->operands()) {
3817 assert(N->getNumOperands() == 1 &&
3818 "llvm.commandline metadata entry can have only one operand");
3819 const MDString *S = cast<MDString>(N->getOperand(0));
3820 OutStreamer->emitBytes(S->getString());
3821 OutStreamer->emitZeros(1);
3822 }
3823 OutStreamer->popSection();
3824}
3825
3826//===--------------------------------------------------------------------===//
3827// Emission and print routines
3828//
3829
3830/// Emit a byte directive and value.
3831///
3832void AsmPrinter::emitInt8(int Value) const { OutStreamer->emitInt8(Value); }
3833
3834/// Emit a short directive and value.
3835void AsmPrinter::emitInt16(int Value) const { OutStreamer->emitInt16(Value); }
3836
3837/// Emit a long directive and value.
3838void AsmPrinter::emitInt32(int Value) const { OutStreamer->emitInt32(Value); }
3839
3840/// EmitSLEB128 - emit the specified signed leb128 value.
3841void AsmPrinter::emitSLEB128(int64_t Value, const char *Desc) const {
3842 if (isVerbose() && Desc)
3843 OutStreamer->AddComment(Desc);
3844
3845 OutStreamer->emitSLEB128IntValue(Value);
3846}
3847
3848void AsmPrinter::emitULEB128(uint64_t Value, const char *Desc,
3849 unsigned PadTo) const {
3850 if (isVerbose() && Desc)
3851 OutStreamer->AddComment(Desc);
3852
3853 OutStreamer->emitULEB128IntValue(Value, PadTo);
3854}
3855
3856/// Emit a long long directive and value.
3857void AsmPrinter::emitInt64(uint64_t Value) const {
3858 OutStreamer->emitInt64(Value);
3859}
3860
3861/// Emit something like ".long Hi-Lo" where the size in bytes of the directive
3862/// is specified by Size and Hi/Lo specify the labels. This implicitly uses
3863/// .set if it avoids relocations.
3865 unsigned Size) const {
3866 OutStreamer->emitAbsoluteSymbolDiff(Hi, Lo, Size);
3867}
3868
3869/// Emit something like ".uleb128 Hi-Lo".
3871 const MCSymbol *Lo) const {
3872 OutStreamer->emitAbsoluteSymbolDiffAsULEB128(Hi, Lo);
3873}
3874
3875/// EmitLabelPlusOffset - Emit something like ".long Label+Offset"
3876/// where the size in bytes of the directive is specified by Size and Label
3877/// specifies the label. This implicitly uses .set if it is available.
3879 unsigned Size,
3880 bool IsSectionRelative) const {
3881 if (MAI.needsDwarfSectionOffsetDirective() && IsSectionRelative) {
3882 OutStreamer->emitCOFFSecRel32(Label, Offset);
3883 if (Size > 4)
3884 OutStreamer->emitZeros(Size - 4);
3885 return;
3886 }
3887
3888 // Emit Label+Offset (or just Label if Offset is zero)
3889 const MCExpr *Expr = MCSymbolRefExpr::create(Label, OutContext);
3890 if (Offset)
3893
3894 OutStreamer->emitValue(Expr, Size);
3895}
3896
3897//===----------------------------------------------------------------------===//
3898
3899// EmitAlignment - Emit an alignment directive to the specified power of
3900// two boundary. If a global value is specified, and if that global has
3901// an explicit alignment requested, it will override the alignment request
3902// if required for correctness.
3904 unsigned MaxBytesToEmit) const {
3905 if (GV)
3906 Alignment = getGVAlignment(GV, GV->getDataLayout(), Alignment);
3907
3908 if (Alignment == Align(1))
3909 return Alignment; // 1-byte aligned: no need to emit alignment.
3910
3911 if (getCurrentSection()->isText()) {
3912 const MCSubtargetInfo *STI = nullptr;
3913 if (this->MF)
3914 STI = &getSubtargetInfo();
3915 else
3916 STI = &TM.getMCSubtargetInfo();
3917 OutStreamer->emitCodeAlignment(Alignment, *STI, MaxBytesToEmit);
3918 } else
3919 OutStreamer->emitValueToAlignment(Alignment, 0, 1, MaxBytesToEmit);
3920 return Alignment;
3921}
3922
3923//===----------------------------------------------------------------------===//
3924// Constant emission.
3925//===----------------------------------------------------------------------===//
3926
3928 const Constant *BaseCV,
3929 uint64_t Offset) {
3930 MCContext &Ctx = OutContext;
3931
3932 if (CV->isNullValue() || isa<UndefValue>(CV))
3933 return MCConstantExpr::create(0, Ctx);
3934
3935 if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV))
3936 return MCConstantExpr::create(CI->getZExtValue(), Ctx);
3937
3938 if (const ConstantByte *CB = dyn_cast<ConstantByte>(CV))
3939 return MCConstantExpr::create(CB->getZExtValue(), Ctx);
3940
3941 if (const ConstantPtrAuth *CPA = dyn_cast<ConstantPtrAuth>(CV))
3942 return lowerConstantPtrAuth(*CPA);
3943
3944 if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV))
3945 return MCSymbolRefExpr::create(getSymbol(GV), Ctx);
3946
3947 if (const BlockAddress *BA = dyn_cast<BlockAddress>(CV))
3948 return lowerBlockAddressConstant(*BA);
3949
3950 if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(CV))
3952 getSymbol(Equiv->getGlobalValue()), nullptr, 0, std::nullopt, TM);
3953
3954 if (const NoCFIValue *NC = dyn_cast<NoCFIValue>(CV))
3955 return MCSymbolRefExpr::create(getSymbol(NC->getGlobalValue()), Ctx);
3956
3957 const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV);
3958 if (!CE) {
3959 llvm_unreachable("Unknown constant value to lower!");
3960 }
3961
3962 // The constant expression opcodes are limited to those that are necessary
3963 // to represent relocations on supported targets. Expressions involving only
3964 // constant addresses are constant folded instead.
3965 switch (CE->getOpcode()) {
3966 default:
3967 break; // Error
3968 case Instruction::AddrSpaceCast: {
3969 const Constant *Op = CE->getOperand(0);
3970 unsigned DstAS = CE->getType()->getPointerAddressSpace();
3971 unsigned SrcAS = Op->getType()->getPointerAddressSpace();
3972 if (TM.isNoopAddrSpaceCast(getDataLayout(), SrcAS, DstAS))
3973 return lowerConstant(Op);
3974
3975 break; // Error
3976 }
3977 case Instruction::GetElementPtr: {
3978 // Generate a symbolic expression for the byte address
3979 APInt OffsetAI(getDataLayout().getIndexTypeSizeInBits(CE->getType()), 0);
3980 cast<GEPOperator>(CE)->accumulateConstantOffset(getDataLayout(), OffsetAI);
3981
3982 const MCExpr *Base = lowerConstant(CE->getOperand(0));
3983 if (!OffsetAI)
3984 return Base;
3985
3986 int64_t Offset = OffsetAI.getSExtValue();
3988 Ctx);
3989 }
3990
3991 case Instruction::Trunc:
3992 // We emit the value and depend on the assembler to truncate the generated
3993 // expression properly. This is important for differences between
3994 // blockaddress labels. Since the two labels are in the same function, it
3995 // is reasonable to treat their delta as a 32-bit value.
3996 [[fallthrough]];
3997 case Instruction::BitCast:
3998 return lowerConstant(CE->getOperand(0), BaseCV, Offset);
3999
4000 case Instruction::IntToPtr: {
4001 const DataLayout &DL = getDataLayout();
4002
4003 // Handle casts to pointers by changing them into casts to the appropriate
4004 // integer type. This promotes constant folding and simplifies this code.
4005 Constant *Op = CE->getOperand(0);
4006 Op = ConstantFoldIntegerCast(Op, DL.getIntPtrType(CV->getType()),
4007 /*IsSigned*/ false, DL);
4008 if (Op)
4009 return lowerConstant(Op);
4010
4011 break; // Error
4012 }
4013
4014 case Instruction::PtrToAddr:
4015 case Instruction::PtrToInt: {
4016 const DataLayout &DL = getDataLayout();
4017
4018 // Support only foldable casts to/from pointers that can be eliminated by
4019 // changing the pointer to the appropriately sized integer type.
4020 Constant *Op = CE->getOperand(0);
4021 Type *Ty = CE->getType();
4022
4023 const MCExpr *OpExpr = lowerConstant(Op);
4024
4025 // We can emit the pointer value into this slot if the slot is an
4026 // integer slot equal to the size of the pointer.
4027 //
4028 // If the pointer is larger than the resultant integer, then
4029 // as with Trunc just depend on the assembler to truncate it.
4030 if (DL.getTypeAllocSize(Ty).getFixedValue() <=
4031 DL.getTypeAllocSize(Op->getType()).getFixedValue())
4032 return OpExpr;
4033
4034 break; // Error
4035 }
4036
4037 case Instruction::Sub: {
4038 GlobalValue *LHSGV, *RHSGV;
4039 APInt LHSOffset, RHSOffset;
4040 DSOLocalEquivalent *DSOEquiv;
4041 if (IsConstantOffsetFromGlobal(CE->getOperand(0), LHSGV, LHSOffset,
4042 getDataLayout(), &DSOEquiv) &&
4043 IsConstantOffsetFromGlobal(CE->getOperand(1), RHSGV, RHSOffset,
4044 getDataLayout())) {
4045 auto *LHSSym = getSymbol(LHSGV);
4046 auto *RHSSym = getSymbol(RHSGV);
4047 int64_t Addend = (LHSOffset - RHSOffset).getSExtValue();
4048 std::optional<int64_t> PCRelativeOffset;
4049 if (getObjFileLowering().hasPLTPCRelative() && RHSGV == BaseCV)
4050 PCRelativeOffset = Offset;
4051
4052 // Try the generic symbol difference first.
4054 LHSGV, RHSGV, Addend, PCRelativeOffset, TM);
4055
4056 // (ELF-specific) If the generic symbol difference does not apply, and
4057 // LHS is a dso_local_equivalent of a function, reference the PLT entry
4058 // instead. Note: A default visibility symbol is by default preemptible
4059 // during linking, and should not be referenced with PC-relative
4060 // relocations. Therefore, use a PLT relocation even if the function is
4061 // dso_local.
4062 if (DSOEquiv && TM.getTargetTriple().isOSBinFormatELF())
4064 LHSSym, RHSSym, Addend, PCRelativeOffset, TM);
4065
4066 // Otherwise, return LHS-RHS+Addend.
4067 if (!Res) {
4068 Res =
4070 MCSymbolRefExpr::create(RHSSym, Ctx), Ctx);
4071 if (Addend != 0)
4073 Res, MCConstantExpr::create(Addend, Ctx), Ctx);
4074 }
4075 return Res;
4076 }
4077
4078 const MCExpr *LHS = lowerConstant(CE->getOperand(0));
4079 const MCExpr *RHS = lowerConstant(CE->getOperand(1));
4080 return MCBinaryExpr::createSub(LHS, RHS, Ctx);
4081 break;
4082 }
4083
4084 case Instruction::Add: {
4085 const MCExpr *LHS = lowerConstant(CE->getOperand(0));
4086 const MCExpr *RHS = lowerConstant(CE->getOperand(1));
4087 return MCBinaryExpr::createAdd(LHS, RHS, Ctx);
4088 }
4089 }
4090
4091 // If the code isn't optimized, there may be outstanding folding
4092 // opportunities. Attempt to fold the expression using DataLayout as a
4093 // last resort before giving up.
4095 if (C != CE)
4096 return lowerConstant(C);
4097
4098 // Otherwise report the problem to the user.
4099 std::string S;
4100 raw_string_ostream OS(S);
4101 OS << "unsupported expression in static initializer: ";
4102 CE->printAsOperand(OS, /*PrintType=*/false,
4103 !MF ? nullptr : MF->getFunction().getParent());
4104 CE->getContext().emitError(S);
4105 return MCConstantExpr::create(0, Ctx);
4106}
4107
4108static void emitGlobalConstantImpl(const DataLayout &DL, const Constant *C,
4109 AsmPrinter &AP,
4110 const Constant *BaseCV = nullptr,
4111 uint64_t Offset = 0,
4112 AsmPrinter::AliasMapTy *AliasList = nullptr);
4113
4114static void emitGlobalConstantFP(const ConstantFP *CFP, AsmPrinter &AP);
4115static void emitGlobalConstantFP(APFloat APF, Type *ET, AsmPrinter &AP);
4116
4117/// isRepeatedByteSequence - Determine whether the given value is
4118/// composed of a repeated sequence of identical bytes and return the
4119/// byte value. If it is not a repeated sequence, return -1.
4121 StringRef Data = V->getRawDataValues();
4122 assert(!Data.empty() && "Empty aggregates should be CAZ node");
4123 char C = Data[0];
4124 for (unsigned i = 1, e = Data.size(); i != e; ++i)
4125 if (Data[i] != C) return -1;
4126 return static_cast<uint8_t>(C); // Ensure 255 is not returned as -1.
4127}
4128
4129/// isRepeatedByteSequence - Determine whether the given value is
4130/// composed of a repeated sequence of identical bytes and return the
4131/// byte value. If it is not a repeated sequence, return -1.
4132static int isRepeatedByteSequence(const Value *V, const DataLayout &DL) {
4133 if (const ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
4134 uint64_t Size = DL.getTypeAllocSizeInBits(V->getType());
4135 assert(Size % 8 == 0);
4136
4137 // Extend the element to take zero padding into account.
4138 APInt Value = CI->getValue().zext(Size);
4139 if (!Value.isSplat(8))
4140 return -1;
4141
4142 return Value.zextOrTrunc(8).getZExtValue();
4143 }
4144 if (const ConstantArray *CA = dyn_cast<ConstantArray>(V)) {
4145 // Make sure all array elements are sequences of the same repeated
4146 // byte.
4147 assert(CA->getNumOperands() != 0 && "Should be a CAZ");
4148 Constant *Op0 = CA->getOperand(0);
4149 int Byte = isRepeatedByteSequence(Op0, DL);
4150 if (Byte == -1)
4151 return -1;
4152
4153 // All array elements must be equal.
4154 for (unsigned i = 1, e = CA->getNumOperands(); i != e; ++i)
4155 if (CA->getOperand(i) != Op0)
4156 return -1;
4157 return Byte;
4158 }
4159
4161 return isRepeatedByteSequence(CDS);
4162
4163 return -1;
4164}
4165
4167 AsmPrinter::AliasMapTy *AliasList) {
4168 if (AliasList) {
4169 auto AliasIt = AliasList->find(Offset);
4170 if (AliasIt != AliasList->end()) {
4171 for (const GlobalAlias *GA : AliasIt->second)
4172 AP.OutStreamer->emitLabel(AP.getSymbol(GA));
4173 AliasList->erase(Offset);
4174 }
4175 }
4176}
4177
4179 const DataLayout &DL, const ConstantDataSequential *CDS, AsmPrinter &AP,
4180 AsmPrinter::AliasMapTy *AliasList) {
4181 // See if we can aggregate this into a .fill, if so, emit it as such.
4182 int Value = isRepeatedByteSequence(CDS, DL);
4183 if (Value != -1) {
4184 uint64_t Bytes = DL.getTypeAllocSize(CDS->getType());
4185 // Don't emit a 1-byte object as a .fill.
4186 if (Bytes > 1)
4187 return AP.OutStreamer->emitFill(Bytes, Value);
4188 }
4189
4190 // If this can be emitted with .ascii/.asciz, emit it as such.
4191 if (CDS->isString())
4192 return AP.OutStreamer->emitBytes(CDS->getAsString());
4193
4194 // Otherwise, emit the values in successive locations.
4195 uint64_t ElementByteSize = CDS->getElementByteSize();
4196 if (isa<IntegerType>(CDS->getElementType()) ||
4197 isa<ByteType>(CDS->getElementType())) {
4198 for (uint64_t I = 0, E = CDS->getNumElements(); I != E; ++I) {
4199 emitGlobalAliasInline(AP, ElementByteSize * I, AliasList);
4200 if (AP.isVerbose())
4201 AP.OutStreamer->getCommentOS()
4202 << format("0x%" PRIx64 "\n", CDS->getElementAsInteger(I));
4203 AP.OutStreamer->emitIntValue(CDS->getElementAsInteger(I),
4204 ElementByteSize);
4205 }
4206 } else {
4207 Type *ET = CDS->getElementType();
4208 for (uint64_t I = 0, E = CDS->getNumElements(); I != E; ++I) {
4209 emitGlobalAliasInline(AP, ElementByteSize * I, AliasList);
4211 }
4212 }
4213
4214 unsigned Size = DL.getTypeAllocSize(CDS->getType());
4215 unsigned EmittedSize =
4216 DL.getTypeAllocSize(CDS->getElementType()) * CDS->getNumElements();
4217 assert(EmittedSize <= Size && "Size cannot be less than EmittedSize!");
4218 if (unsigned Padding = Size - EmittedSize)
4219 AP.OutStreamer->emitZeros(Padding);
4220}
4221
4223 const ConstantArray *CA, AsmPrinter &AP,
4224 const Constant *BaseCV, uint64_t Offset,
4225 AsmPrinter::AliasMapTy *AliasList) {
4226 // See if we can aggregate some values. Make sure it can be
4227 // represented as a series of bytes of the constant value.
4228 int Value = isRepeatedByteSequence(CA, DL);
4229
4230 if (Value != -1) {
4231 uint64_t Bytes = DL.getTypeAllocSize(CA->getType());
4232 AP.OutStreamer->emitFill(Bytes, Value);
4233 } else {
4234 for (unsigned I = 0, E = CA->getNumOperands(); I != E; ++I) {
4235 emitGlobalConstantImpl(DL, CA->getOperand(I), AP, BaseCV, Offset,
4236 AliasList);
4237 Offset += DL.getTypeAllocSize(CA->getOperand(I)->getType());
4238 }
4239 }
4240}
4241
4242static void emitGlobalConstantLargeInt(const ConstantInt *CI, AsmPrinter &AP);
4243
4244static void emitGlobalConstantVector(const DataLayout &DL, const Constant *CV,
4245 AsmPrinter &AP,
4246 AsmPrinter::AliasMapTy *AliasList) {
4247 uint64_t AllocSize = DL.getTypeAllocSize(CV->getType());
4248
4249 if (CV->isNullValue())
4250 return AP.OutStreamer->emitZeros(AllocSize);
4251
4252 auto *VTy = cast<FixedVectorType>(CV->getType());
4253 Type *ElementType = VTy->getElementType();
4254 uint64_t ElementSizeInBits = DL.getTypeSizeInBits(ElementType);
4255 uint64_t ElementAllocSizeInBits = DL.getTypeAllocSizeInBits(ElementType);
4256 uint64_t EmittedSize;
4257 if (ElementSizeInBits != ElementAllocSizeInBits) {
4258 // If the allocation size of an element is different from the size in bits,
4259 // printing each element separately will insert incorrect padding.
4260 //
4261 // The general algorithm here is complicated; instead of writing it out
4262 // here, just use the existing code in ConstantFolding.
4263 Type *IntT =
4264 IntegerType::get(CV->getContext(), DL.getTypeSizeInBits(CV->getType()));
4266 ConstantExpr::getBitCast(const_cast<Constant *>(CV), IntT), DL));
4267 if (!CI) {
4269 "Cannot lower vector global with unusual element type");
4270 }
4271 emitGlobalAliasInline(AP, 0, AliasList);
4273 EmittedSize = DL.getTypeStoreSize(CV->getType());
4274 } else {
4275 for (unsigned I = 0, E = VTy->getNumElements(); I != E; ++I) {
4276 emitGlobalAliasInline(AP, AllocSize * I, AliasList);
4278 }
4279 EmittedSize = DL.getTypeAllocSize(ElementType) * VTy->getNumElements();
4280 }
4281
4282 if (unsigned Padding = AllocSize - EmittedSize)
4283 AP.OutStreamer->emitZeros(Padding);
4284}
4285
4287 const ConstantStruct *CS, AsmPrinter &AP,
4288 const Constant *BaseCV, uint64_t Offset,
4289 AsmPrinter::AliasMapTy *AliasList) {
4290 // Print the fields in successive locations. Pad to align if needed!
4291 uint64_t Size = DL.getTypeAllocSize(CS->getType());
4292 const StructLayout *Layout = DL.getStructLayout(CS->getType());
4293 uint64_t SizeSoFar = 0;
4294 for (unsigned I = 0, E = CS->getNumOperands(); I != E; ++I) {
4295 const Constant *Field = CS->getOperand(I);
4296
4297 // Print the actual field value.
4298 emitGlobalConstantImpl(DL, Field, AP, BaseCV, Offset + SizeSoFar,
4299 AliasList);
4300
4301 // Check if padding is needed and insert one or more 0s.
4302 uint64_t FieldSize = DL.getTypeAllocSize(Field->getType());
4303 uint64_t PadSize = ((I == E - 1 ? Size : Layout->getElementOffset(I + 1)) -
4304 Layout->getElementOffset(I)) -
4305 FieldSize;
4306 SizeSoFar += FieldSize + PadSize;
4307
4308 // Insert padding - this may include padding to increase the size of the
4309 // current field up to the ABI size (if the struct is not packed) as well
4310 // as padding to ensure that the next field starts at the right offset.
4311 AP.OutStreamer->emitZeros(PadSize);
4312 }
4313 assert(SizeSoFar == Layout->getSizeInBytes() &&
4314 "Layout of constant struct may be incorrect!");
4315}
4316
4317static void emitGlobalConstantFP(APFloat APF, Type *ET, AsmPrinter &AP) {
4318 assert(ET && "Unknown float type");
4319 APInt API = APF.bitcastToAPInt();
4320
4321 // First print a comment with what we think the original floating-point value
4322 // should have been.
4323 if (AP.isVerbose()) {
4324 SmallString<8> StrVal;
4325 APF.toString(StrVal);
4326 ET->print(AP.OutStreamer->getCommentOS());
4327 AP.OutStreamer->getCommentOS() << ' ' << StrVal << '\n';
4328 }
4329
4330 // Now iterate through the APInt chunks, emitting them in endian-correct
4331 // order, possibly with a smaller chunk at beginning/end (e.g. for x87 80-bit
4332 // floats).
4333 unsigned NumBytes = API.getBitWidth() / 8;
4334 unsigned TrailingBytes = NumBytes % sizeof(uint64_t);
4335 const uint64_t *p = API.getRawData();
4336
4337 // PPC's long double has odd notions of endianness compared to how LLVM
4338 // handles it: p[0] goes first for *big* endian on PPC.
4339 if (AP.getDataLayout().isBigEndian() && !ET->isPPC_FP128Ty()) {
4340 int Chunk = API.getNumWords() - 1;
4341
4342 if (TrailingBytes)
4343 AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk--], TrailingBytes);
4344
4345 for (; Chunk >= 0; --Chunk)
4346 AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk], sizeof(uint64_t));
4347 } else {
4348 unsigned Chunk;
4349 for (Chunk = 0; Chunk < NumBytes / sizeof(uint64_t); ++Chunk)
4350 AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk], sizeof(uint64_t));
4351
4352 if (TrailingBytes)
4353 AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk], TrailingBytes);
4354 }
4355
4356 // Emit the tail padding for the long double.
4357 const DataLayout &DL = AP.getDataLayout();
4358 AP.OutStreamer->emitZeros(DL.getTypeAllocSize(ET) - DL.getTypeStoreSize(ET));
4359}
4360
4361static void emitGlobalConstantFP(const ConstantFP *CFP, AsmPrinter &AP) {
4362 emitGlobalConstantFP(CFP->getValueAPF(), CFP->getType(), AP);
4363}
4364
4366 uint64_t TypeStoreSize,
4367 AsmPrinter &AP) {
4368 const DataLayout &DL = AP.getDataLayout();
4369 unsigned BitWidth = Val.getBitWidth();
4370
4371 // Copy the value as we may massage the layout for constants whose bit width
4372 // is not a multiple of 64-bits.
4373 APInt Realigned(Val);
4374 uint64_t ExtraBits = 0;
4375 unsigned ExtraBitsSize = BitWidth & 63;
4376
4377 if (ExtraBitsSize) {
4378 // The bit width of the data is not a multiple of 64-bits.
4379 // The extra bits are expected to be at the end of the chunk of the memory.
4380 // Little endian:
4381 // * Nothing to be done, just record the extra bits to emit.
4382 // Big endian:
4383 // * Record the extra bits to emit.
4384 // * Realign the raw data to emit the chunks of 64-bits.
4385 if (DL.isBigEndian()) {
4386 // Basically the structure of the raw data is a chunk of 64-bits cells:
4387 // 0 1 BitWidth / 64
4388 // [chunk1][chunk2] ... [chunkN].
4389 // The most significant chunk is chunkN and it should be emitted first.
4390 // However, due to the alignment issue chunkN contains useless bits.
4391 // Realign the chunks so that they contain only useful information:
4392 // ExtraBits 0 1 (BitWidth / 64) - 1
4393 // chu[nk1 chu][nk2 chu] ... [nkN-1 chunkN]
4394 ExtraBitsSize = alignTo(ExtraBitsSize, 8);
4395 ExtraBits =
4396 Realigned.getRawData()[0] & (((uint64_t)-1) >> (64 - ExtraBitsSize));
4397 if (BitWidth >= 64)
4398 Realigned.lshrInPlace(ExtraBitsSize);
4399 } else
4400 ExtraBits = Realigned.getRawData()[BitWidth / 64];
4401 }
4402
4403 // We don't expect assemblers to support data directives
4404 // for more than 64 bits, so we emit the data in at most 64-bit
4405 // quantities at a time.
4406 const uint64_t *RawData = Realigned.getRawData();
4407 for (unsigned i = 0, e = BitWidth / 64; i != e; ++i) {
4408 uint64_t ChunkVal = DL.isBigEndian() ? RawData[e - i - 1] : RawData[i];
4409 AP.OutStreamer->emitIntValue(ChunkVal, 8);
4410 }
4411
4412 if (ExtraBitsSize) {
4413 // Emit the extra bits after the 64-bits chunks.
4414
4415 // Emit a directive that fills the expected size.
4416 uint64_t Size = TypeStoreSize - (BitWidth / 64) * 8;
4417 assert(Size && Size * 8 >= ExtraBitsSize &&
4418 (ExtraBits & (((uint64_t)-1) >> (64 - ExtraBitsSize))) ==
4419 ExtraBits &&
4420 "Directive too small for extra bits.");
4421 AP.OutStreamer->emitIntValue(ExtraBits, Size);
4422 }
4423}
4424
4426 AsmPrinter &AP) {
4428 CB->getValue(), AP.getDataLayout().getTypeStoreSize(CB->getType()), AP);
4429}
4430
4435
4436/// Transform a not absolute MCExpr containing a reference to a GOT
4437/// equivalent global, by a target specific GOT pc relative access to the
4438/// final symbol.
4440 const Constant *BaseCst,
4441 uint64_t Offset) {
4442 // The global @foo below illustrates a global that uses a got equivalent.
4443 //
4444 // @bar = global i32 42
4445 // @gotequiv = private unnamed_addr constant i32* @bar
4446 // @foo = i32 trunc (i64 sub (i64 ptrtoint (i32** @gotequiv to i64),
4447 // i64 ptrtoint (i32* @foo to i64))
4448 // to i32)
4449 //
4450 // The cstexpr in @foo is converted into the MCExpr `ME`, where we actually
4451 // check whether @foo is suitable to use a GOTPCREL. `ME` is usually in the
4452 // form:
4453 //
4454 // foo = cstexpr, where
4455 // cstexpr := <gotequiv> - "." + <cst>
4456 // cstexpr := <gotequiv> - (<foo> - <offset from @foo base>) + <cst>
4457 //
4458 // After canonicalization by evaluateAsRelocatable `ME` turns into:
4459 //
4460 // cstexpr := <gotequiv> - <foo> + gotpcrelcst, where
4461 // gotpcrelcst := <offset from @foo base> + <cst>
4462 MCValue MV;
4463 if (!(*ME)->evaluateAsRelocatable(MV, nullptr) || MV.isAbsolute())
4464 return;
4465 const MCSymbol *GOTEquivSym = MV.getAddSym();
4466 if (!GOTEquivSym)
4467 return;
4468
4469 // Check that GOT equivalent symbol is cached.
4470 if (!AP.GlobalGOTEquivs.count(GOTEquivSym))
4471 return;
4472
4473 const GlobalValue *BaseGV = dyn_cast_or_null<GlobalValue>(BaseCst);
4474 if (!BaseGV)
4475 return;
4476
4477 // Check for a valid base symbol
4478 const MCSymbol *BaseSym = AP.getSymbol(BaseGV);
4479 const MCSymbol *SymB = MV.getSubSym();
4480
4481 if (!SymB || BaseSym != SymB)
4482 return;
4483
4484 // Make sure to match:
4485 //
4486 // gotpcrelcst := <offset from @foo base> + <cst>
4487 //
4488 int64_t GOTPCRelCst = Offset + MV.getConstant();
4489 if (!AP.getObjFileLowering().supportGOTPCRelWithOffset() && GOTPCRelCst != 0)
4490 return;
4491
4492 // Emit the GOT PC relative to replace the got equivalent global, i.e.:
4493 //
4494 // bar:
4495 // .long 42
4496 // gotequiv:
4497 // .quad bar
4498 // foo:
4499 // .long gotequiv - "." + <cst>
4500 //
4501 // is replaced by the target specific equivalent to:
4502 //
4503 // bar:
4504 // .long 42
4505 // foo:
4506 // .long bar@GOTPCREL+<gotpcrelcst>
4507 AsmPrinter::GOTEquivUsePair Result = AP.GlobalGOTEquivs[GOTEquivSym];
4508 const GlobalVariable *GV = Result.first;
4509 int NumUses = (int)Result.second;
4510 const GlobalValue *FinalGV = dyn_cast<GlobalValue>(GV->getOperand(0));
4511 const MCSymbol *FinalSym = AP.getSymbol(FinalGV);
4513 FinalGV, FinalSym, MV, Offset, AP.MMI, *AP.OutStreamer);
4514
4515 // Update GOT equivalent usage information
4516 --NumUses;
4517 if (NumUses >= 0)
4518 AP.GlobalGOTEquivs[GOTEquivSym] = std::make_pair(GV, NumUses);
4519}
4520
4521static void emitGlobalConstantImpl(const DataLayout &DL, const Constant *CV,
4522 AsmPrinter &AP, const Constant *BaseCV,
4524 AsmPrinter::AliasMapTy *AliasList) {
4525 assert((!AliasList || AP.TM.getTargetTriple().isOSBinFormatXCOFF()) &&
4526 "AliasList only expected for XCOFF");
4527 emitGlobalAliasInline(AP, Offset, AliasList);
4528 uint64_t Size = DL.getTypeAllocSize(CV->getType());
4529
4530 // Globals with sub-elements such as combinations of arrays and structs
4531 // are handled recursively by emitGlobalConstantImpl. Keep track of the
4532 // constant symbol base and the current position with BaseCV and Offset.
4533 if (!BaseCV && CV->hasOneUse())
4534 BaseCV = dyn_cast<Constant>(CV->user_back());
4535
4537 StructType *structType;
4538 if (AliasList && (structType = llvm::dyn_cast<StructType>(CV->getType()))) {
4539 unsigned numElements = {structType->getNumElements()};
4540 if (numElements != 0) {
4541 // Handle cases of aliases to direct struct elements
4542 const StructLayout *Layout = DL.getStructLayout(structType);
4543 uint64_t SizeSoFar = 0;
4544 for (unsigned int i = 0; i < numElements - 1; ++i) {
4545 uint64_t GapToNext = Layout->getElementOffset(i + 1) - SizeSoFar;
4546 AP.OutStreamer->emitZeros(GapToNext);
4547 SizeSoFar += GapToNext;
4548 emitGlobalAliasInline(AP, Offset + SizeSoFar, AliasList);
4549 }
4550 AP.OutStreamer->emitZeros(Size - SizeSoFar);
4551 return;
4552 }
4553 }
4554 return AP.OutStreamer->emitZeros(Size);
4555 }
4556
4557 if (isa<UndefValue>(CV))
4558 return AP.OutStreamer->emitZeros(Size);
4559
4560 if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
4561 if (isa<VectorType>(CV->getType()))
4562 return emitGlobalConstantVector(DL, CV, AP, AliasList);
4563
4564 const uint64_t StoreSize = DL.getTypeStoreSize(CV->getType());
4565 if (StoreSize <= 8) {
4566 if (AP.isVerbose())
4567 AP.OutStreamer->getCommentOS()
4568 << format("0x%" PRIx64 "\n", CI->getZExtValue());
4569 AP.OutStreamer->emitIntValue(CI->getZExtValue(), StoreSize);
4570 } else {
4572 }
4573
4574 // Emit tail padding if needed
4575 if (Size != StoreSize)
4576 AP.OutStreamer->emitZeros(Size - StoreSize);
4577
4578 return;
4579 }
4580
4581 if (const ConstantByte *CB = dyn_cast<ConstantByte>(CV)) {
4582 if (isa<VectorType>(CV->getType()))
4583 return emitGlobalConstantVector(DL, CV, AP, AliasList);
4584
4585 const uint64_t StoreSize = DL.getTypeStoreSize(CV->getType());
4586 if (StoreSize <= 8) {
4587 if (AP.isVerbose())
4588 AP.OutStreamer->getCommentOS()
4589 << format("0x%" PRIx64 "\n", CB->getZExtValue());
4590 AP.OutStreamer->emitIntValue(CB->getZExtValue(), StoreSize);
4591 } else {
4593 }
4594
4595 // Emit tail padding if needed
4596 if (Size != StoreSize)
4597 AP.OutStreamer->emitZeros(Size - StoreSize);
4598
4599 return;
4600 }
4601
4602 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV)) {
4603 if (isa<VectorType>(CV->getType()))
4604 return emitGlobalConstantVector(DL, CV, AP, AliasList);
4605 else
4606 return emitGlobalConstantFP(CFP, AP);
4607 }
4608
4609 if (isa<ConstantPointerNull>(CV)) {
4610 AP.OutStreamer->emitIntValue(0, Size);
4611 return;
4612 }
4613
4615 return emitGlobalConstantDataSequential(DL, CDS, AP, AliasList);
4616
4617 if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV))
4618 return emitGlobalConstantArray(DL, CVA, AP, BaseCV, Offset, AliasList);
4619
4620 if (const ConstantStruct *CVS = dyn_cast<ConstantStruct>(CV))
4621 return emitGlobalConstantStruct(DL, CVS, AP, BaseCV, Offset, AliasList);
4622
4623 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) {
4624 // Look through bitcasts, which might not be able to be MCExpr'ized (e.g. of
4625 // vectors).
4626 if (CE->getOpcode() == Instruction::BitCast)
4627 return emitGlobalConstantImpl(DL, CE->getOperand(0), AP);
4628
4629 if (Size > 8) {
4630 // If the constant expression's size is greater than 64-bits, then we have
4631 // to emit the value in chunks. Try to constant fold the value and emit it
4632 // that way.
4633 Constant *New = ConstantFoldConstant(CE, DL);
4634 if (New != CE)
4635 return emitGlobalConstantImpl(DL, New, AP);
4636 }
4637 }
4638
4639 if (isa<ConstantVector>(CV))
4640 return emitGlobalConstantVector(DL, CV, AP, AliasList);
4641
4642 // Otherwise, it must be a ConstantExpr. Lower it to an MCExpr, then emit it
4643 // thread the streamer with EmitValue.
4644 const MCExpr *ME = AP.lowerConstant(CV, BaseCV, Offset);
4645
4646 // Since lowerConstant already folded and got rid of all IR pointer and
4647 // integer casts, detect GOT equivalent accesses by looking into the MCExpr
4648 // directly.
4650 handleIndirectSymViaGOTPCRel(AP, &ME, BaseCV, Offset);
4651
4652 AP.OutStreamer->emitValue(ME, Size);
4653}
4654
4655/// EmitGlobalConstant - Print a general LLVM constant to the .s file.
4657 AliasMapTy *AliasList) {
4658 uint64_t Size = DL.getTypeAllocSize(CV->getType());
4659 if (Size)
4660 emitGlobalConstantImpl(DL, CV, *this, nullptr, 0, AliasList);
4661 else if (MAI.hasSubsectionsViaSymbols()) {
4662 // If the global has zero size, emit a single byte so that two labels don't
4663 // look like they are at the same location.
4664 OutStreamer->emitIntValue(0, 1);
4665 }
4666 if (!AliasList)
4667 return;
4668 // TODO: These remaining aliases are not emitted in the correct location. Need
4669 // to handle the case where the alias offset doesn't refer to any sub-element.
4670 for (auto &AliasPair : *AliasList) {
4671 for (const GlobalAlias *GA : AliasPair.second)
4672 OutStreamer->emitLabel(getSymbol(GA));
4673 }
4674}
4675
4677 // Target doesn't support this yet!
4678 llvm_unreachable("Target does not support EmitMachineConstantPoolValue");
4679}
4680
4682 if (Offset > 0)
4683 OS << '+' << Offset;
4684 else if (Offset < 0)
4685 OS << Offset;
4686}
4687
4688void AsmPrinter::emitNops(unsigned N) {
4689 MCInst Nop = MF->getSubtarget().getInstrInfo()->getNop();
4690 for (; N; --N)
4692}
4693
4694//===----------------------------------------------------------------------===//
4695// Symbol Lowering Routines.
4696//===----------------------------------------------------------------------===//
4697
4699 return OutContext.createTempSymbol(Name, true);
4700}
4701
4703 return const_cast<AsmPrinter *>(this)->getAddrLabelSymbol(
4704 BA->getBasicBlock());
4705}
4706
4708 return const_cast<AsmPrinter *>(this)->getAddrLabelSymbol(BB);
4709}
4710
4714
4715/// GetCPISymbol - Return the symbol for the specified constant pool entry.
4716MCSymbol *AsmPrinter::GetCPISymbol(unsigned CPID) const {
4717 if (getSubtargetInfo().getTargetTriple().isWindowsMSVCEnvironment() ||
4718 getSubtargetInfo().getTargetTriple().isUEFI()) {
4719 const MachineConstantPoolEntry &CPE =
4720 MF->getConstantPool()->getConstants()[CPID];
4721 if (!CPE.isMachineConstantPoolEntry()) {
4722 const DataLayout &DL = MF->getDataLayout();
4723 SectionKind Kind = CPE.getSectionKind(&DL);
4724 const Constant *C = CPE.Val.ConstVal;
4725 Align Alignment = CPE.Alignment;
4727 DL, Kind, C, Alignment, &MF->getFunction());
4728 if (S && TM.getTargetTriple().isOSBinFormatCOFF()) {
4729 if (MCSymbol *Sym =
4730 static_cast<const MCSectionCOFF *>(S)->getCOMDATSymbol()) {
4731 if (Sym->isUndefined())
4732 OutStreamer->emitSymbolAttribute(Sym, MCSA_Global);
4733 return Sym;
4734 }
4735 }
4736 }
4737 }
4738
4739 const DataLayout &DL = getDataLayout();
4740 return OutContext.getOrCreateSymbol(Twine(DL.getInternalSymbolPrefix()) +
4741 "CPI" + Twine(getFunctionNumber()) + "_" +
4742 Twine(CPID));
4743}
4744
4745/// GetJTISymbol - Return the symbol for the specified jump table entry.
4746MCSymbol *AsmPrinter::GetJTISymbol(unsigned JTID, bool isLinkerPrivate) const {
4747 return MF->getJTISymbol(JTID, OutContext, isLinkerPrivate);
4748}
4749
4750/// GetJTSetSymbol - Return the symbol for the specified jump table .set
4751/// FIXME: privatize to AsmPrinter.
4752MCSymbol *AsmPrinter::GetJTSetSymbol(unsigned UID, unsigned MBBID) const {
4753 const DataLayout &DL = getDataLayout();
4754 return OutContext.getOrCreateSymbol(Twine(DL.getInternalSymbolPrefix()) +
4755 Twine(getFunctionNumber()) + "_" +
4756 Twine(UID) + "_set_" + Twine(MBBID));
4757}
4758
4763
4764/// Return the MCSymbol for the specified ExternalSymbol.
4766 SmallString<60> NameStr;
4768 return OutContext.getOrCreateSymbol(NameStr);
4769}
4770
4771/// PrintParentLoopComment - Print comments about parent loops of this one.
4773 unsigned FunctionNumber) {
4774 if (!Loop) return;
4775 PrintParentLoopComment(OS, Loop->getParentLoop(), FunctionNumber);
4776 OS.indent(Loop->getLoopDepth()*2)
4777 << "Parent Loop BB" << FunctionNumber << "_"
4778 << Loop->getHeader()->getNumber()
4779 << " Depth=" << Loop->getLoopDepth() << '\n';
4780}
4781
4782/// PrintChildLoopComment - Print comments about child loops within
4783/// the loop for this basic block, with nesting.
4785 unsigned FunctionNumber) {
4786 // Add child loop information
4787 for (const MachineLoop *CL : *Loop) {
4788 OS.indent(CL->getLoopDepth()*2)
4789 << "Child Loop BB" << FunctionNumber << "_"
4790 << CL->getHeader()->getNumber() << " Depth " << CL->getLoopDepth()
4791 << '\n';
4792 PrintChildLoopComment(OS, CL, FunctionNumber);
4793 }
4794}
4795
4796/// emitBasicBlockLoopComments - Pretty-print comments for basic blocks.
4798 const MachineLoopInfo *LI,
4799 const AsmPrinter &AP) {
4800 // Add loop depth information
4801 const MachineLoop *Loop = LI->getLoopFor(&MBB);
4802 if (!Loop) return;
4803
4804 MachineBasicBlock *Header = Loop->getHeader();
4805 assert(Header && "No header for loop");
4806
4807 // If this block is not a loop header, just print out what is the loop header
4808 // and return.
4809 if (Header != &MBB) {
4810 AP.OutStreamer->AddComment(" in Loop: Header=BB" +
4811 Twine(AP.getFunctionNumber())+"_" +
4813 " Depth="+Twine(Loop->getLoopDepth()));
4814 return;
4815 }
4816
4817 // Otherwise, it is a loop header. Print out information about child and
4818 // parent loops.
4819 raw_ostream &OS = AP.OutStreamer->getCommentOS();
4820
4822
4823 OS << "=>";
4824 OS.indent(Loop->getLoopDepth()*2-2);
4825
4826 OS << "This ";
4827 if (Loop->isInnermost())
4828 OS << "Inner ";
4829 OS << "Loop Header: Depth=" + Twine(Loop->getLoopDepth()) << '\n';
4830
4832}
4833
4834/// emitBasicBlockStart - This method prints the label for the specified
4835/// MachineBasicBlock, an alignment (if present) and a comment describing
4836/// it if appropriate.
4838 // End the previous funclet and start a new one.
4839 if (MBB.isEHFuncletEntry()) {
4840 for (auto &Handler : Handlers) {
4841 Handler->endFunclet();
4842 Handler->beginFunclet(MBB);
4843 }
4844 for (auto &Handler : EHHandlers) {
4845 Handler->endFunclet();
4846 Handler->beginFunclet(MBB);
4847 }
4848 }
4849
4850 // Switch to a new section if this basic block must begin a section. The
4851 // entry block is always placed in the function section and is handled
4852 // separately.
4853 if (MBB.isBeginSection() && !MBB.isEntryBlock()) {
4854 OutStreamer->switchSection(
4855 getObjFileLowering().getSectionForMachineBasicBlock(MF->getFunction(),
4856 MBB, TM));
4857 CurrentSectionBeginSym = MBB.getSymbol();
4858 }
4859
4860 for (auto &Handler : Handlers)
4861 Handler->beginCodeAlignment(MBB);
4862
4863 // Emit an alignment directive for this block, if needed.
4864 const Align Alignment = MBB.getAlignment();
4865 if (Alignment != Align(1))
4866 emitAlignment(Alignment, nullptr, MBB.getMaxBytesForAlignment());
4867
4868 // If the block has its address taken, emit any labels that were used to
4869 // reference the block. It is possible that there is more than one label
4870 // here, because multiple LLVM BB's may have been RAUW'd to this block after
4871 // the references were generated.
4872 if (MBB.isIRBlockAddressTaken()) {
4873 if (isVerbose())
4874 OutStreamer->AddComment("Block address taken");
4875
4876 BasicBlock *BB = MBB.getAddressTakenIRBlock();
4877 assert(BB && BB->hasAddressTaken() && "Missing BB");
4878 for (MCSymbol *Sym : getAddrLabelSymbolToEmit(BB))
4879 OutStreamer->emitLabel(Sym);
4880 } else if (isVerbose() && MBB.isMachineBlockAddressTaken()) {
4881 OutStreamer->AddComment("Block address taken");
4882 } else if (isVerbose() && MBB.isInlineAsmBrIndirectTarget()) {
4883 OutStreamer->AddComment("Inline asm indirect target");
4884 }
4885
4886 // Print some verbose block comments.
4887 if (isVerbose()) {
4888 if (const BasicBlock *BB = MBB.getBasicBlock()) {
4889 if (BB->hasName()) {
4890 BB->printAsOperand(OutStreamer->getCommentOS(),
4891 /*PrintType=*/false, BB->getModule());
4892 OutStreamer->getCommentOS() << '\n';
4893 }
4894 }
4895
4896 assert(MLI != nullptr && "MachineLoopInfo should has been computed");
4898 }
4899
4900 // Print the main label for the block.
4901 if (shouldEmitLabelForBasicBlock(MBB)) {
4902 if (isVerbose() && MBB.hasLabelMustBeEmitted())
4903 OutStreamer->AddComment("Label of block must be emitted");
4904 OutStreamer->emitLabel(MBB.getSymbol());
4905 } else {
4906 if (isVerbose()) {
4907 // NOTE: Want this comment at start of line, don't emit with AddComment.
4908 OutStreamer->emitRawComment(" %bb." + Twine(MBB.getNumber()) + ":",
4909 false);
4910 }
4911 }
4912
4913 if (MBB.isEHContTarget() &&
4914 MAI.getExceptionHandlingType() == ExceptionHandling::WinEH) {
4915 OutStreamer->emitLabel(MBB.getEHContSymbol());
4916 }
4917
4918 // With BB sections, each basic block must handle CFI information on its own
4919 // if it begins a section (Entry block call is handled separately, next to
4920 // beginFunction).
4921 if (MBB.isBeginSection() && !MBB.isEntryBlock()) {
4922 for (auto &Handler : Handlers)
4923 Handler->beginBasicBlockSection(MBB);
4924 for (auto &Handler : EHHandlers)
4925 Handler->beginBasicBlockSection(MBB);
4926 }
4927}
4928
4930 // Check if CFI information needs to be updated for this MBB with basic block
4931 // sections.
4932 if (MBB.isEndSection()) {
4933 for (auto &Handler : Handlers)
4934 Handler->endBasicBlockSection(MBB);
4935 for (auto &Handler : EHHandlers)
4936 Handler->endBasicBlockSection(MBB);
4937 }
4938}
4939
4940void AsmPrinter::emitVisibility(MCSymbol *Sym, unsigned Visibility,
4941 bool IsDefinition) const {
4943
4944 switch (Visibility) {
4945 default: break;
4947 if (IsDefinition)
4948 Attr = MAI.getHiddenVisibilityAttr();
4949 else
4950 Attr = MAI.getHiddenDeclarationVisibilityAttr();
4951 break;
4953 Attr = MAI.getProtectedVisibilityAttr();
4954 break;
4955 }
4956
4957 if (Attr != MCSA_Invalid)
4958 OutStreamer->emitSymbolAttribute(Sym, Attr);
4959}
4960
4961bool AsmPrinter::shouldEmitLabelForBasicBlock(
4962 const MachineBasicBlock &MBB) const {
4963 // With `-fbasic-block-sections=`, a label is needed for every non-entry block
4964 // in the labels mode (option `=labels`) and every section beginning in the
4965 // sections mode (`=all` and `=list=`).
4966 if ((MF->getTarget().Options.BBAddrMap || MBB.isBeginSection()) &&
4967 !MBB.isEntryBlock())
4968 return true;
4969 // A label is needed for any block with at least one predecessor (when that
4970 // predecessor is not the fallthrough predecessor, or if it is an EH funclet
4971 // entry, or if a label is forced).
4972 return !MBB.pred_empty() &&
4973 (!isBlockOnlyReachableByFallthrough(&MBB) || MBB.isEHFuncletEntry() ||
4974 MBB.hasLabelMustBeEmitted());
4975}
4976
4977/// isBlockOnlyReachableByFallthough - Return true if the basic block has
4978/// exactly one predecessor and the control transfer mechanism between
4979/// the predecessor and this block is a fall-through.
4982 // If this is a landing pad, it isn't a fall through. If it has no preds,
4983 // then nothing falls through to it.
4984 if (MBB->isEHPad() || MBB->pred_empty())
4985 return false;
4986
4987 // If there isn't exactly one predecessor, it can't be a fall through.
4988 if (MBB->pred_size() > 1)
4989 return false;
4990
4991 // The predecessor has to be immediately before this block.
4992 MachineBasicBlock *Pred = *MBB->pred_begin();
4993 if (!Pred->isLayoutSuccessor(MBB))
4994 return false;
4995
4996 // If the block is completely empty, then it definitely does fall through.
4997 if (Pred->empty())
4998 return true;
4999
5000 // Check the terminators in the previous blocks
5001 for (const auto &MI : Pred->terminators()) {
5002 // If it is not a simple branch, we are in a table somewhere.
5003 if (!MI.isBranch() || MI.isIndirectBranch())
5004 return false;
5005
5006 // If we are the operands of one of the branches, this is not a fall
5007 // through. Note that targets with delay slots will usually bundle
5008 // terminators with the delay slot instruction.
5009 for (ConstMIBundleOperands OP(MI); OP.isValid(); ++OP) {
5010 if (OP->isJTI())
5011 return false;
5012 if (OP->isMBB() && OP->getMBB() == MBB)
5013 return false;
5014 }
5015 }
5016
5017 return true;
5018}
5019
5020GCMetadataPrinter *AsmPrinter::getOrCreateGCPrinter(GCStrategy &S) {
5021 if (!S.usesMetadata())
5022 return nullptr;
5023
5024 auto [GCPI, Inserted] = GCMetadataPrinters.try_emplace(&S);
5025 if (!Inserted)
5026 return GCPI->second.get();
5027
5028 auto Name = S.getName();
5029
5030 for (const GCMetadataPrinterRegistry::entry &GCMetaPrinter :
5032 if (Name == GCMetaPrinter.getName()) {
5033 std::unique_ptr<GCMetadataPrinter> GMP = GCMetaPrinter.instantiate();
5034 GMP->S = &S;
5035 GCPI->second = std::move(GMP);
5036 return GCPI->second.get();
5037 }
5038
5039 report_fatal_error("no GCMetadataPrinter registered for GC: " + Twine(Name));
5040}
5041
5043 std::unique_ptr<AsmPrinterHandler> Handler) {
5044 Handlers.insert(Handlers.begin(), std::move(Handler));
5046}
5047
5048/// Pin vtables to this file.
5050
5052
5053// In the binary's "xray_instr_map" section, an array of these function entries
5054// describes each instrumentation point. When XRay patches your code, the index
5055// into this table will be given to your handler as a patch point identifier.
5057 auto Kind8 = static_cast<uint8_t>(Kind);
5058 Out->emitBinaryData(StringRef(reinterpret_cast<const char *>(&Kind8), 1));
5059 Out->emitBinaryData(
5060 StringRef(reinterpret_cast<const char *>(&AlwaysInstrument), 1));
5061 Out->emitBinaryData(StringRef(reinterpret_cast<const char *>(&Version), 1));
5062 auto Padding = (4 * Bytes) - ((2 * Bytes) + 3);
5063 assert(Padding >= 0 && "Instrumentation map entry > 4 * Word Size");
5064 Out->emitZeros(Padding);
5065}
5066
5068 if (Sleds.empty())
5069 return;
5070
5071 auto PrevSection = OutStreamer->getCurrentSectionOnly();
5072 const Function &F = MF->getFunction();
5073 MCSection *InstMap = nullptr;
5074 MCSection *FnSledIndex = nullptr;
5075 const Triple &TT = TM.getTargetTriple();
5076 // Use PC-relative addresses on all targets.
5077 if (TT.isOSBinFormatELF()) {
5078 auto LinkedToSym = static_cast<const MCSymbolELF *>(CurrentFnSym);
5079 auto Flags = ELF::SHF_ALLOC | ELF::SHF_LINK_ORDER;
5080 StringRef GroupName;
5081 if (F.hasComdat()) {
5082 Flags |= ELF::SHF_GROUP;
5083 GroupName = F.getComdat()->getName();
5084 }
5085 InstMap = OutContext.getELFSection("xray_instr_map", ELF::SHT_PROGBITS,
5086 Flags, 0, GroupName, F.hasComdat(),
5087 MCSection::NonUniqueID, LinkedToSym);
5088
5089 if (TM.Options.XRayFunctionIndex)
5090 FnSledIndex = OutContext.getELFSection(
5091 "xray_fn_idx", ELF::SHT_PROGBITS, Flags, 0, GroupName, F.hasComdat(),
5092 MCSection::NonUniqueID, LinkedToSym);
5093 } else if (MF->getSubtarget().getTargetTriple().isOSBinFormatMachO()) {
5094 InstMap = OutContext.getMachOSection("__DATA", "xray_instr_map",
5097 if (TM.Options.XRayFunctionIndex)
5098 FnSledIndex = OutContext.getMachOSection("__DATA", "xray_fn_idx",
5101 } else {
5102 llvm_unreachable("Unsupported target");
5103 }
5104
5105 auto WordSizeBytes = MAI.getCodePointerSize();
5106
5107 // Now we switch to the instrumentation map section. Because this is done
5108 // per-function, we are able to create an index entry that will represent the
5109 // range of sleds associated with a function.
5110 auto &Ctx = OutContext;
5111 MCSymbol *SledsStart =
5112 OutContext.createLinkerPrivateSymbol("xray_sleds_start");
5113 OutStreamer->switchSection(InstMap);
5114 OutStreamer->emitLabel(SledsStart);
5115 for (const auto &Sled : Sleds) {
5116 MCSymbol *Dot = Ctx.createTempSymbol();
5117 OutStreamer->emitLabel(Dot);
5118 OutStreamer->emitValueImpl(
5120 MCSymbolRefExpr::create(Dot, Ctx), Ctx),
5121 WordSizeBytes);
5122 OutStreamer->emitValueImpl(
5126 MCConstantExpr::create(WordSizeBytes, Ctx),
5127 Ctx),
5128 Ctx),
5129 WordSizeBytes);
5130 Sled.emit(WordSizeBytes, OutStreamer.get());
5131 }
5132 MCSymbol *SledsEnd = OutContext.createTempSymbol("xray_sleds_end", true);
5133 OutStreamer->emitLabel(SledsEnd);
5134
5135 // We then emit a single entry in the index per function. We use the symbols
5136 // that bound the instrumentation map as the range for a specific function.
5137 // Each entry contains 2 words and needs to be word-aligned.
5138 if (FnSledIndex) {
5139 OutStreamer->switchSection(FnSledIndex);
5140 OutStreamer->emitValueToAlignment(Align(WordSizeBytes));
5141 // For Mach-O, use an "l" symbol as the atom of this subsection. The label
5142 // difference uses a SUBTRACTOR external relocation which references the
5143 // symbol.
5144 MCSymbol *Dot = Ctx.createLinkerPrivateSymbol("xray_fn_idx");
5145 OutStreamer->emitLabel(Dot);
5146 OutStreamer->emitValueImpl(
5148 MCSymbolRefExpr::create(Dot, Ctx), Ctx),
5149 WordSizeBytes);
5150 OutStreamer->emitValueImpl(MCConstantExpr::create(Sleds.size(), Ctx),
5151 WordSizeBytes);
5152 OutStreamer->switchSection(PrevSection);
5153 }
5154 Sleds.clear();
5155}
5156
5158 SledKind Kind, uint8_t Version) {
5159 const Function &F = MI.getMF()->getFunction();
5160 auto Attr = F.getFnAttribute("function-instrument");
5161 bool LogArgs = F.hasFnAttribute("xray-log-args");
5162 bool AlwaysInstrument =
5163 Attr.isStringAttribute() && Attr.getValueAsString() == "xray-always";
5164 if (Kind == SledKind::FUNCTION_ENTER && LogArgs)
5166 Sleds.emplace_back(XRayFunctionEntry{Sled, CurrentFnSym, Kind,
5167 AlwaysInstrument, &F, Version});
5168}
5169
5171 const Function &F = MF->getFunction();
5172 unsigned PatchableFunctionPrefix =
5173 F.getFnAttributeAsParsedInteger("patchable-function-prefix");
5174 unsigned PatchableFunctionEntry =
5175 F.getFnAttributeAsParsedInteger("patchable-function-entry");
5176 if (!PatchableFunctionPrefix && !PatchableFunctionEntry)
5177 return;
5178 const unsigned PointerSize = getPointerSize();
5179 if (TM.getTargetTriple().isOSBinFormatELF()) {
5180 auto Flags = ELF::SHF_WRITE | ELF::SHF_ALLOC;
5181 const MCSymbolELF *LinkedToSym = nullptr;
5182 StringRef GroupName, SectionName;
5183
5184 if (F.hasFnAttribute("patchable-function-entry-section"))
5185 SectionName = F.getFnAttribute("patchable-function-entry-section")
5186 .getValueAsString();
5187 if (SectionName.empty())
5188 SectionName = "__patchable_function_entries";
5189
5190 // GNU as < 2.35 did not support section flag 'o'. GNU ld < 2.36 did not
5191 // support mixed SHF_LINK_ORDER and non-SHF_LINK_ORDER sections.
5192 if (MAI.useIntegratedAssembler() || MAI.binutilsIsAtLeast(2, 36)) {
5193 Flags |= ELF::SHF_LINK_ORDER;
5194 if (F.hasComdat()) {
5195 Flags |= ELF::SHF_GROUP;
5196 GroupName = F.getComdat()->getName();
5197 }
5198 LinkedToSym = static_cast<const MCSymbolELF *>(CurrentFnSym);
5199 }
5200 OutStreamer->switchSection(OutContext.getELFSection(
5201 SectionName, ELF::SHT_PROGBITS, Flags, 0, GroupName, F.hasComdat(),
5202 MCSection::NonUniqueID, LinkedToSym));
5205 }
5206}
5207
5209 return OutStreamer->getContext().getDwarfVersion();
5210}
5211
5213 OutStreamer->getContext().setDwarfVersion(Version);
5214}
5215
5217 return OutStreamer->getContext().getDwarfFormat() == dwarf::DWARF64;
5218}
5219
5222 OutStreamer->getContext().getDwarfFormat());
5223}
5224
5226 return {getDwarfVersion(), uint8_t(MAI.getCodePointerSize()),
5227 OutStreamer->getContext().getDwarfFormat(),
5229}
5230
5233 OutStreamer->getContext().getDwarfFormat());
5234}
5235
5236std::tuple<const MCSymbol *, uint64_t, const MCSymbol *,
5239 const MCSymbol *BranchLabel) const {
5240 const auto TLI = MF->getSubtarget().getTargetLowering();
5241 const auto BaseExpr =
5242 TLI->getPICJumpTableRelocBaseExpr(MF, JTI, MMI->getContext());
5243 const auto Base = &cast<MCSymbolRefExpr>(BaseExpr)->getSymbol();
5244
5245 // By default, for the architectures that support CodeView,
5246 // EK_LabelDifference32 is implemented as an Int32 from the base address.
5247 return std::make_tuple(Base, 0, BranchLabel,
5249}
5250
5252 const Triple &TT = M.getTargetTriple();
5253 assert(TT.isOSBinFormatCOFF());
5254
5255 bool IsTargetArm64EC = TT.isWindowsArm64EC();
5257 SmallVector<MCSymbol *> FuncOverrideDefaultSymbols;
5258 bool SwitchedToDirectiveSection = false;
5259 for (const Function &F : M.functions()) {
5260 if (F.hasFnAttribute("loader-replaceable")) {
5261 if (!SwitchedToDirectiveSection) {
5262 OutStreamer->switchSection(
5263 OutContext.getObjectFileInfo()->getDrectveSection());
5264 SwitchedToDirectiveSection = true;
5265 }
5266
5267 StringRef Name = F.getName();
5268
5269 // For hybrid-patchable targets, strip the prefix so that we can mark
5270 // the real function as replaceable.
5271 if (IsTargetArm64EC && Name.ends_with(HybridPatchableTargetSuffix)) {
5272 Name = Name.drop_back(HybridPatchableTargetSuffix.size());
5273 }
5274
5275 MCSymbol *FuncOverrideSymbol =
5276 MMI->getContext().getOrCreateSymbol(Name + "_$fo$");
5277 OutStreamer->beginCOFFSymbolDef(FuncOverrideSymbol);
5278 OutStreamer->emitCOFFSymbolStorageClass(COFF::IMAGE_SYM_CLASS_EXTERNAL);
5279 OutStreamer->emitCOFFSymbolType(COFF::IMAGE_SYM_DTYPE_NULL);
5280 OutStreamer->endCOFFSymbolDef();
5281
5282 MCSymbol *FuncOverrideDefaultSymbol =
5283 MMI->getContext().getOrCreateSymbol(Name + "_$fo_default$");
5284 OutStreamer->beginCOFFSymbolDef(FuncOverrideDefaultSymbol);
5285 OutStreamer->emitCOFFSymbolStorageClass(COFF::IMAGE_SYM_CLASS_EXTERNAL);
5286 OutStreamer->emitCOFFSymbolType(COFF::IMAGE_SYM_DTYPE_NULL);
5287 OutStreamer->endCOFFSymbolDef();
5288 FuncOverrideDefaultSymbols.push_back(FuncOverrideDefaultSymbol);
5289
5290 OutStreamer->emitBytes((Twine(" /ALTERNATENAME:") +
5291 FuncOverrideSymbol->getName() + "=" +
5292 FuncOverrideDefaultSymbol->getName())
5293 .toStringRef(Buf));
5294 Buf.clear();
5295 }
5296 }
5297
5298 if (SwitchedToDirectiveSection)
5299 OutStreamer->popSection();
5300
5301 if (FuncOverrideDefaultSymbols.empty())
5302 return;
5303
5304 // MSVC emits the symbols for the default variables pointing at the start of
5305 // the .data section, but doesn't actually allocate any space for them. LLVM
5306 // can't do this, so have all of the variables pointing at a single byte
5307 // instead.
5308 OutStreamer->switchSection(OutContext.getObjectFileInfo()->getDataSection());
5309 for (MCSymbol *Symbol : FuncOverrideDefaultSymbols) {
5310 OutStreamer->emitLabel(Symbol);
5311 }
5312 OutStreamer->emitZeros(1);
5313 OutStreamer->popSection();
5314}
5315
5317 const Triple &TT = M.getTargetTriple();
5318 assert(TT.isOSBinFormatCOFF());
5319
5320 // Emit an absolute @feat.00 symbol.
5321 MCSymbol *S = MMI->getContext().getOrCreateSymbol(StringRef("@feat.00"));
5322 OutStreamer->beginCOFFSymbolDef(S);
5323 OutStreamer->emitCOFFSymbolStorageClass(COFF::IMAGE_SYM_CLASS_STATIC);
5324 OutStreamer->emitCOFFSymbolType(COFF::IMAGE_SYM_DTYPE_NULL);
5325 OutStreamer->endCOFFSymbolDef();
5326 int64_t Feat00Value = 0;
5327
5328 if (TT.getArch() == Triple::x86) {
5329 // According to the PE-COFF spec, the LSB of this value marks the object
5330 // for "registered SEH". This means that all SEH handler entry points
5331 // must be registered in .sxdata. Use of any unregistered handlers will
5332 // cause the process to terminate immediately. LLVM does not know how to
5333 // register any SEH handlers, so its object files should be safe.
5334 Feat00Value |= COFF::Feat00Flags::SafeSEH;
5335 }
5336
5337 if (M.getControlFlowGuardMode() == ControlFlowGuardMode::Enabled) {
5338 // Object is CFG-aware. Only set if we actually inserted the checks.
5339 Feat00Value |= COFF::Feat00Flags::GuardCF;
5340 }
5341
5342 if (M.getModuleFlag("ehcontguard")) {
5343 // Object also has EHCont.
5344 Feat00Value |= COFF::Feat00Flags::GuardEHCont;
5345 }
5346
5347 if (M.getModuleFlag("ms-kernel")) {
5348 // Object is compiled with /kernel.
5349 Feat00Value |= COFF::Feat00Flags::Kernel;
5350 }
5351
5352 OutStreamer->emitSymbolAttribute(S, MCSA_Global);
5353 OutStreamer->emitAssignment(
5354 S, MCConstantExpr::create(Feat00Value, MMI->getContext()));
5355}
5356
5357namespace llvm {
5358namespace {
5360 return MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
5361}
5362
5364 MachineFunction &MF) {
5366 .getManager();
5367}
5368
5370 MachineFunction &MF) {
5372 getFAM(M, MAM)
5374 MF.getFunction())
5375 .getManager();
5376 return MFAM;
5377}
5378} // anonymous namespace
5379
5382 MachineModuleInfo &MMI = MAM.getResult<MachineModuleAnalysis>(M).getMMI();
5383 AsmPrinter.GetMMI = [&MMI]() { return &MMI; };
5384 AsmPrinter.MMI = &MMI;
5385 AsmPrinter.GetORE = [&MAM, &M](MachineFunction &MF) {
5386 return &getMFAM(M, MAM, MF)
5388 };
5389 AsmPrinter.GetMDT = [&MAM, &M](MachineFunction &MF) {
5390 return &getMFAM(M, MAM, MF).getResult<MachineDominatorTreeAnalysis>(MF);
5391 };
5392 AsmPrinter.GetMLI = [&MAM, &M](MachineFunction &MF) {
5393 return &getMFAM(M, MAM, MF).getResult<MachineLoopAnalysis>(MF);
5394 };
5395 AsmPrinter.GetMBPI = [&MAM, &M](MachineFunction &MF) {
5396 return &getMFAM(M, MAM, MF).getResult<MachineBranchProbabilityAnalysis>(MF);
5397 };
5398 AsmPrinter.GetMBFI = [&MAM, &M](MachineFunction &MF) {
5399 return &getMFAM(M, MAM, MF).getResult<MachineBlockFrequencyAnalysis>(MF);
5400 };
5401 AsmPrinter.GetMBHI = [&MAM, &M](MachineFunction &MF) {
5402 return &getMFAM(M, MAM, MF).getResult<MachineBlockHashInfoAnalysis>(MF);
5403 };
5404 AsmPrinter.GetBBSPR = [&MAM, &M](MachineFunction &MF) {
5405 return getFAM(M, MAM)
5407 MF.getFunction());
5408 };
5409 // TODO(boomanaiden154): Get GC working with the new pass manager.
5410 AsmPrinter.BeginGCAssembly = [](Module &M) {};
5412 AsmPrinter.EmitStackMaps = [](Module &M) {};
5414}
5415
5417 MachineFunction &MF,
5419 const ModuleAnalysisManagerMachineFunctionProxy::Result &MAMProxy =
5421 MachineModuleInfo &MMI =
5422 MAMProxy
5423 .getCachedResult<MachineModuleAnalysis>(*MF.getFunction().getParent())
5424 ->getMMI();
5425 AsmPrinter.GetMMI = [&MMI]() { return &MMI; };
5426 AsmPrinter.MMI = &MMI;
5427 AsmPrinter.GetORE = [&MFAM](MachineFunction &MF) {
5429 };
5430 AsmPrinter.GetMDT = [&MFAM](MachineFunction &MF) {
5431 return &MFAM.getResult<MachineDominatorTreeAnalysis>(MF);
5432 };
5433 AsmPrinter.GetMLI = [&MFAM](MachineFunction &MF) {
5434 return &MFAM.getResult<MachineLoopAnalysis>(MF);
5435 };
5436 AsmPrinter.GetMBPI = [&MFAM](MachineFunction &MF) {
5438 };
5439 AsmPrinter.GetMBFI = [&MFAM](MachineFunction &MF) {
5440 return &MFAM.getResult<MachineBlockFrequencyAnalysis>(MF);
5441 };
5442 AsmPrinter.GetMBHI = [&MFAM](MachineFunction &MF) {
5443 return &MFAM.getResult<MachineBlockHashInfoAnalysis>(MF);
5444 };
5445 AsmPrinter.GetBBSPR = [&MFAM](MachineFunction &MF) {
5446 return getFAM(MFAM, MF)
5448 MF.getFunction());
5449 };
5450 // TODO(boomanaiden154): Get GC working with the new pass manager.
5451 AsmPrinter.BeginGCAssembly = [](Module &M) {};
5453 AsmPrinter.EmitStackMaps = [](Module &M) {};
5455}
5456
5458
5459} // namespace llvm
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned uint64_t
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...
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static cl::opt< bool > PgoAnalysisMapEmitBBSectionsCfg("pgo-analysis-map-emit-bb-sections-cfg", cl::desc("Enable the post-link cfg information from the basic block " "sections profile in the PGO analysis map"), cl::Hidden, cl::init(false))
static bool emitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP)
emitDebugValueComment - This method handles the target-independent form of DBG_VALUE,...
static cl::opt< std::string > StackUsageFile("stack-usage-file", cl::desc("Output filename for stack usage information"), cl::value_desc("filename"), cl::Hidden)
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 cl::opt< bool > BBAddrMapSkipEmitBBEntries("basic-block-address-map-skip-bb-entries", cl::desc("Skip emitting basic block entries in the SHT_LLVM_BB_ADDR_MAP " "section. It's used to save binary size when BB entries are " "unnecessary for some PGOAnalysisMap features."), cl::Hidden, cl::init(false))
static void emitGlobalConstantFP(const ConstantFP *CFP, AsmPrinter &AP)
static void emitFakeUse(const MachineInstr *MI, AsmPrinter &AP)
static bool isGOTEquivalentCandidate(const GlobalVariable *GV, unsigned &NumGOTEquivUsers, bool &HasNonGlobalUsers)
Only consider global GOT equivalents if at least one user is a cstexpr inside an initializer of anoth...
static void emitGlobalConstantLargeByte(const ConstantByte *CB, AsmPrinter &AP)
static void tagGlobalDefinition(Module &M, GlobalVariable *G)
static void emitBasicBlockLoopComments(const MachineBasicBlock &MBB, const MachineLoopInfo *LI, const AsmPrinter &AP)
emitBasicBlockLoopComments - Pretty-print comments for basic blocks.
static void emitGlobalConstantLargeAPInt(const APInt &Val, uint64_t TypeStoreSize, AsmPrinter &AP)
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 llvm::object::BBAddrMap::Features getBBAddrMapFeature(const MachineFunction &MF, int NumMBBSectionRanges, bool HasCalls, const CFGProfile *FuncCFGProfile)
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)
static bool needFuncLabels(const MachineFunction &MF, const AsmPrinter &Asm)
Returns true if function begin and end labels should be emitted.
static unsigned getNumGlobalVariableUses(const Constant *C, bool &HasNonGlobalUsers)
Compute the number of Global Variables that uses a Constant.
static void removeMemtagFromGlobal(GlobalVariable &G)
static uint64_t globalSize(const llvm::GlobalVariable &G)
static void PrintChildLoopComment(raw_ostream &OS, const MachineLoop *Loop, unsigned FunctionNumber)
PrintChildLoopComment - Print comments about child loops within the loop for this basic block,...
static StringRef getMIMnemonic(const MachineInstr &MI, MCStreamer &Streamer)
PGOMapFeaturesEnum
static void emitComments(const MachineInstr &MI, const MCSubtargetInfo *STI, raw_ostream &CommentOS)
emitComments - Pretty-print comments for instructions.
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)
static bool shouldTagGlobal(const llvm::GlobalVariable &G)
static void emitGlobalConstantImpl(const DataLayout &DL, const Constant *C, AsmPrinter &AP, const Constant *BaseCV=nullptr, uint64_t Offset=0, AsmPrinter::AliasMapTy *AliasList=nullptr)
static cl::list< PGOMapFeaturesEnum > PgoAnalysisMapFeatures("pgo-analysis-map", cl::Hidden, cl::CommaSeparated, cl::values(clEnumValN(PGOMapFeaturesEnum::None, "none", "Disable all options"), clEnumValN(PGOMapFeaturesEnum::FuncEntryCount, "func-entry-count", "Function Entry Count"), clEnumValN(PGOMapFeaturesEnum::BBFreq, "bb-freq", "Basic Block Frequency"), clEnumValN(PGOMapFeaturesEnum::BrProb, "br-prob", "Branch Probability"), clEnumValN(PGOMapFeaturesEnum::All, "all", "Enable all options")), cl::desc("Enable extended information within the SHT_LLVM_BB_ADDR_MAP that is " "extracted from PGO related analysis."))
static ConstantInt * extractNumericCGTypeId(const Function &F)
Extracts a numeric type identifier of a Function's type from callgraph metadata.
static cl::opt< bool > PrintLatency("asm-print-latency", cl::desc("Print instruction latencies as verbose asm comments"), cl::Hidden, cl::init(false))
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)
static void emitGlobalConstantVector(const DataLayout &DL, const Constant *CV, AsmPrinter &AP, AsmPrinter::AliasMapTy *AliasList)
static cl::opt< bool > EmitJumpTableSizesSection("emit-jump-table-sizes-section", cl::desc("Emit a section containing jump table addresses and sizes"), cl::Hidden, cl::init(false))
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 const Function * getParent(const Value *V)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
#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
Module.h This file contains the declarations for the Module class.
This file contains common utilities for code prefetch insertion.
===- LazyMachineBlockFrequencyInfo.h - Lazy Block Frequency -*- C++ -*–===//
const FeatureInfo AllFeatures[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
===- MachineOptimizationRemarkEmitter.h - Opt Diagnostics -*- C++ -*-—===//
Register Reg
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.
static constexpr StringLiteral Filename
OptimizedStructLayoutField Field
ModuleAnalysisManager MAM
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
This file contains some templates that are useful if you are working with the STL at all.
#define OP(OPC)
Definition Instruction.h:46
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:171
This file contains some functions that are useful when dealing with strings.
std::unique_ptr< MCStreamer > && Streamer
This file describes how to lower LLVM code to machine code.
Defines the virtual file system interface vfs::FileSystem.
Value * LHS
static const fltSemantics & IEEEdouble()
Definition APFloat.h:305
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:361
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition APFloat.cpp:6034
LLVM_ABI double convertToDouble() const
Converts this APFloat to host double value.
Definition APFloat.cpp:6093
void toString(SmallVectorImpl< char > &Str, unsigned FormatPrecision=0, unsigned FormatMaxPadding=3, bool TruncateZero=true) const
Definition APFloat.h:1620
APInt bitcastToAPInt() const
Definition APFloat.h:1475
Class for arbitrary precision integers.
Definition APInt.h:78
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1508
unsigned getNumWords() const
Get the number of words.
Definition APInt.h:1515
const uint64_t * getRawData() const
This function returns a pointer to the internal storage of the APInt.
Definition APInt.h:571
int64_t getSExtValue() const
Get sign extended value.
Definition APInt.h:1582
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition APInt.h:860
AddrLabelMap(MCContext &context)
void UpdateForRAUWBlock(BasicBlock *Old, BasicBlock *New)
void takeDeletedSymbolsForFunction(Function *F, std::vector< MCSymbol * > &Result)
If we have any deleted symbols for F, return them.
void UpdateForDeletedBlock(BasicBlock *BB)
ArrayRef< MCSymbol * > getAddrLabelSymbolToEmit(BasicBlock *BB)
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addUsedIfAvailable()
Add the specified Pass class to the set of analyses used by this pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
const T & front() const
Get the first element.
Definition ArrayRef.h:144
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
static LLVM_ABI AnalysisKey Key
virtual ~AsmPrinterHandler()
Pin vtables to this file.
virtual void markFunctionEnd()
This class is intended to be used as a driving class for all asm writers.
Definition AsmPrinter.h:95
virtual void emitInstruction(const MachineInstr *)
Targets should implement this to emit instructions.
Definition AsmPrinter.h:654
void emitDanglingPrefetchTargets()
Emit prefetch targets that were not mapped to any basic block.
const TargetLoweringObjectFile & getObjFileLowering() const
Return information about object file lowering.
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
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:439
MapVector< MBBSectionID, MBBSectionRange > MBBSectionRanges
Definition AsmPrinter.h:165
bool isDwarf64() const
void emitNops(unsigned N)
Emit N NOP instructions.
MCSymbol * CurrentFnBegin
Definition AsmPrinter.h:246
MachineLoopInfo * MLI
This is a pointer to the current MachineLoopInfo.
Definition AsmPrinter.h:125
virtual void emitDebugValue(const MCExpr *Value, unsigned Size) const
Emit the directive and value for debug thread local expression.
void EmitToStreamer(MCStreamer &S, const MCInst &Inst)
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.
std::function< MachineOptimizationRemarkEmitter *(MachineFunction &)> GetORE
Definition AsmPrinter.h:184
virtual const MCExpr * lowerConstantPtrAuth(const ConstantPtrAuth &CPA)
Definition AsmPrinter.h:675
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...
unsigned getPointerSize() const
Return the pointer size in bytes from the target triple.
Definition AsmPrinter.h:369
virtual bool emitTargetFeaturePush(const MCSubtargetInfo &STI)
Emit necessary directives to allow use of instructions that are permitted by target features enabled ...
Definition AsmPrinter.h:953
~AsmPrinter() override
TargetMachine & TM
Target machine description.
Definition AsmPrinter.h:98
void emitXRayTable()
Emit a table with all XRay instrumentation points.
virtual void emitGlobalAlias(const Module &M, const GlobalAlias &GA)
DenseMap< const MachineBasicBlock *, SmallVector< MCSymbol *, 1 > > CurrentFnCallsiteEndSymbols
Vector of symbols marking the end of the callsites in the current function, keyed by their containing...
Definition AsmPrinter.h:151
virtual void emitBasicBlockEnd(const MachineBasicBlock &MBB)
Targets can override this to emit stuff at the end of a basic block.
Align emitAlignment(Align Alignment, const GlobalObject *GV=nullptr, unsigned MaxBytesToEmit=0) const
Emit an alignment directive to the specified power of two boundary.
virtual void emitJumpTableEntry(const MachineJumpTableInfo &MJTI, const MachineBasicBlock *MBB, unsigned uid) const
EmitJumpTableEntry - Emit a jump table entry for the specified MBB to the current stream.
MCSymbol * CurrentFnDescSym
The symbol for the current function descriptor on AIX.
Definition AsmPrinter.h:139
MCSymbol * CurrentFnBeginLocal
For dso_local functions, the current $local alias for the function.
Definition AsmPrinter.h:249
MapVector< const MCSymbol *, GOTEquivUsePair > GlobalGOTEquivs
Definition AsmPrinter.h:170
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:332
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)
SmallVector< std::unique_ptr< EHStreamer >, 1 > EHHandlers
A handle to the EH info emitter (if present).
Definition AsmPrinter.h:252
virtual void emitMachOIFuncStubHelperBody(Module &M, const GlobalIFunc &GI, MCSymbol *LazyPointer)
Definition AsmPrinter.h:706
MCSymbol * getMBBExceptionSym(const MachineBasicBlock &MBB)
std::function< void(Module &)> EmitStackMaps
Definition AsmPrinter.h:195
MCSymbol * getAddrLabelSymbol(const BasicBlock *BB)
Return the symbol to be used for the specified basic block when its address is taken.
Definition AsmPrinter.h:342
virtual DwarfDebug * createDwarfDebug()
Create the DwarfDebug handler.
std::function< BasicBlockSectionsProfileReader *(MachineFunction &)> GetBBSPR
Returns the basic block sections profile reader if available, nullptr otherwise.
Definition AsmPrinter.h:192
SmallVector< std::unique_ptr< AsmPrinterHandler >, 2 > Handlers
Definition AsmPrinter.h:257
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:113
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.
MCSymbol * createCallsiteEndSymbol(const MachineBasicBlock &MBB)
Creates a new symbol to be used for the end of a callsite at the specified basic block.
virtual const MCExpr * lowerConstant(const Constant *CV, const Constant *BaseCV=nullptr, uint64_t Offset=0)
Lower the specified LLVM Constant to an MCExpr.
void emitCallGraphSection(const MachineFunction &MF, FunctionCallGraphInfo &FuncCGInfo)
Emits .llvm.callgraph section.
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.
MachineDominatorTree * MDT
This is a pointer to the current MachineDominatorTree.
Definition AsmPrinter.h:122
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:630
unsigned PointerSize
The pointer size in bytes for the default address space.
Definition AsmPrinter.h:119
MCSymbol * GetJTISymbol(unsigned JTID, bool isLinkerPrivate=false) const
Return the symbol for the specified jump table entry.
std::function< void(Module &)> FinishGCAssembly
Definition AsmPrinter.h:194
virtual void emitMachineConstantPoolValue(MachineConstantPoolValue *MCPV)
bool hasDebugInfo() const
Returns true if valid debug info is present.
Definition AsmPrinter.h:528
virtual void emitFunctionBodyStart()
Targets can override this to emit stuff before the first basic block in the function.
Definition AsmPrinter.h:638
std::function< MachineDominatorTree *(MachineFunction &)> GetMDT
Definition AsmPrinter.h:185
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:169
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:634
bool doInitialization(Module &M) override
Set up the AsmPrinter when we are working on a new module.
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:700
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.
void getAnalysisUsage(AnalysisUsage &AU) const override
Record analysis usage.
unsigned getFunctionNumber() const
Return a unique ID for the current function.
MachineOptimizationRemarkEmitter * ORE
Optimization remark emitter.
Definition AsmPrinter.h:128
DenseMap< uint64_t, SmallVector< const GlobalAlias *, 1 > > AliasMapTy
Print a general LLVM constant to the .s file.
Definition AsmPrinter.h:600
virtual bool shouldEmitWeakSwiftAsyncExtendedFramePointerFlags() const
std::function< MachineBlockHashInfoResult *(MachineFunction &)> GetMBHI
Definition AsmPrinter.h:189
AsmPrinter(TargetMachine &TM, std::unique_ptr< MCStreamer > Streamer, char &ID=AsmPrinter::ID)
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.
std::function< void(Module &)> BeginGCAssembly
Definition AsmPrinter.h:193
MCSymbol * CurrentFnSym
The symbol for the current function.
Definition AsmPrinter.h:135
MachineModuleInfo * MMI
This is a pointer to the current MachineModuleInfo.
Definition AsmPrinter.h:116
void emitSLEB128(int64_t Value, const char *Desc=nullptr) const
Emit the specified signed leb128 value.
std::function< MachineBlockFrequencyInfo *(MachineFunction &)> GetMBFI
Definition AsmPrinter.h:188
MCContext & OutContext
This is the context for the output file that we are streaming.
Definition AsmPrinter.h:105
const StaticDataProfileInfo * SDPI
Provides the profile information for constants.
Definition AsmPrinter.h:154
void emitCFIInstruction(const MachineInstr &MI)
MCSymbol * createTempSymbol(const Twine &Name) const
bool doFinalization(Module &M) override
Shut down the asmprinter.
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:696
void emitStackUsage(const MachineFunction &MF)
virtual void emitKCFITypeId(const MachineFunction &MF)
bool isPositionIndependent() const
virtual void emitTargetFeaturePop(const MCSubtargetInfo &STI, bool DidPush)
Emit necessary directives to restore target feature state.
Definition AsmPrinter.h:960
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:131
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,...
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:110
const ProfileSummaryInfo * PSI
The profile summary information.
Definition AsmPrinter.h:157
const MCAsmInfo & MAI
Target Asm Printer information.
Definition AsmPrinter.h:101
std::function< void()> AssertDebugEHFinalized
Definition AsmPrinter.h:196
virtual void emitFunctionDescriptor()
Definition AsmPrinter.h:663
const MCSection * getCurrentSection() const
Return the current section we are emitting to.
unsigned int getDwarfOffsetByteSize() const
Returns 4 for DWARF32 and 8 for DWARF64.
size_t NumUserHandlers
Definition AsmPrinter.h:258
MCSymbol * CurrentFnSymForSize
The symbol used to represent the start of the current function for the purpose of calculating its siz...
Definition AsmPrinter.h:144
std::function< MachineLoopInfo *(MachineFunction &)> GetMLI
Definition AsmPrinter.h:186
std::function< MachineModuleInfo *()> GetMMI
Definition AsmPrinter.h:183
bool isVerbose() const
Return true if assembly output should contain comments.
Definition AsmPrinter.h:323
MCSymbol * getFunctionEnd() const
Definition AsmPrinter.h:333
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:671
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
StringRef getConstantSectionSuffix(const Constant *C) const
Returns a section suffix (hot or unlikely) for the constant if profiles are available.
void emitPseudoProbe(const MachineInstr &MI)
void emitRemarksSection(remarks::RemarkStreamer &RS)
virtual MaybeAlign getRequiredGlobalAlignmentGranule(const GlobalVariable &GV)
Returns a optional minimum alignment that applies to both the address and the allocation size of the ...
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.
virtual void emitFunctionBodyEnd()
Targets can override this to emit stuff after the last basic block in the function.
Definition AsmPrinter.h:642
const DataLayout & getDataLayout() const
Return information about data layout.
void emitCOFFFeatureSymbol(Module &M)
Emits the @feat.00 symbol indicating the features enabled in this module.
virtual void emitFunctionEntryLabel()
EmitFunctionEntryLabel - Emit the label that is the entrypoint for the function.
MCSymbol * GetExternalSymbolSymbol(const Twine &Sym) const
Return the MCSymbol for the specified ExternalSymbol.
void handleCallsiteForCallgraph(FunctionCallGraphInfo &FuncCGInfo, const MachineFunction::CallSiteInfoMap &CallSitesInfoMap, const MachineInstr &MI)
If MI is an indirect call, add expected type IDs to indirect type ids list.
void emitPrefetchTargetSymbol(const UniqueBBID &BBID, unsigned CallsiteIndex)
Helper to emit a symbol for the prefetch target associated with the given BBID and callsite index.
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.
void emitCOFFReplaceableFunctionData(Module &M)
Emits symbols and data to allow functions marked with the loader-replaceable attribute to be replacea...
bool usesCFIWithoutEH() const
Since emitting CFI unwind information is entangled with supporting the exceptions,...
bool doesDwarfUseRelocationsAcrossSections() const
Definition AsmPrinter.h:389
@ None
Do not emit either .eh_frame or .debug_frame.
Definition AsmPrinter.h:174
@ Debug
Emit .debug_frame.
Definition AsmPrinter.h:176
std::function< MachineBranchProbabilityInfo *(MachineFunction &)> GetMBPI
Definition AsmPrinter.h:187
void addAsmPrinterHandler(std::unique_ptr< AsmPrinterHandler > Handler)
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".
virtual const MCExpr * lowerBlockAddressConstant(const BlockAddress &BA)
Lower the specified BlockAddress to an MCExpr.
Analysis pass providing the BasicBlockSectionsProfileReader.
const CFGProfile * getFunctionCFGProfile(StringRef FuncName) const
LLVM Basic Block Representation.
Definition BasicBlock.h:62
unsigned getNumber() const
Definition BasicBlock.h:95
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
bool hasAddressTaken() const
Returns true if there are any uses of this basic block other than direct branches,...
Definition BasicBlock.h:672
The address of a basic block.
Definition Constants.h:1088
BasicBlock * getBasicBlock() const
Definition Constants.h:1125
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.
ConstMIBundleOperands - Iterate over all operands in a const bundle of machine instructions.
ConstantArray - Constant Array Declarations.
Definition Constants.h:590
ArrayType * getType() const
Specialize the getType() method to always return an ArrayType, which reduces the amount of casting ne...
Definition Constants.h:609
Class for constant bytes.
Definition Constants.h:281
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:345
static Constant * get(LLVMContext &Context, ArrayRef< ElementTy > Elts)
get() constructor - Return a constant with array type with an element count and element type matching...
Definition Constants.h:878
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
Definition Constants.h:755
LLVM_ABI APFloat getElementAsAPFloat(uint64_t i) const
If this is a sequential container of floating point type, return the specified element as an APFloat.
LLVM_ABI uint64_t getElementAsInteger(uint64_t i) const
If this is a sequential container of integers (of any size), return the specified element in the low ...
StringRef getAsString() const
If this array is isString(), then this method returns the array as a StringRef.
Definition Constants.h:831
LLVM_ABI uint64_t getElementByteSize() const
Return the size (in bytes) of each element in the array/vector.
LLVM_ABI bool isString(unsigned CharSize=8) const
This method returns true if this is an array of CharSize integers or bytes.
LLVM_ABI uint64_t getNumElements() const
Return the number of elements in the array or vector.
LLVM_ABI Type * getElementType() const
Return the element type of the array/vector.
A constant value that is initialized with an expression using other constant values.
Definition Constants.h:1316
static LLVM_ABI Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
const APFloat & getValueAPF() const
Definition Constants.h:463
This is the shared class of boolean and integer constants.
Definition Constants.h:87
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:269
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
A signed pointer, in the ptrauth sense.
Definition Constants.h:1223
StructType * getType() const
Specialization - reduce amount of casting.
Definition Constants.h:661
static Constant * getAnon(ArrayRef< Constant * > V, bool Packed=false)
Return an anonymous struct that has the specified elements.
Definition Constants.h:643
This is an important base class in LLVM.
Definition Constant.h:43
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constant.h:64
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
DWARF expression.
iterator_range< expr_op_iterator > expr_ops() const
unsigned getNumElements() const
static LLVM_ABI std::optional< const DIExpression * > convertToNonVariadicExpression(const DIExpression *Expr)
If Expr is a valid single-location expression, i.e.
Subprogram description. Uses SubclassData1.
Wrapper for a function that represents a value that functionally represents the original function.
Definition Constants.h:1143
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isBigEndian() const
Definition DataLayout.h:218
TypeSize getTypeStoreSize(Type *Ty) const
Returns the maximum number of bytes that may be overwritten by storing the specified type.
Definition DataLayout.h:579
A debug info location.
Definition DebugLoc.h:126
bool empty() const
Definition DenseMap.h:717
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:767
iterator end()
Definition DenseMap.h:687
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
Collects and handles dwarf debug information.
Definition DwarfDebug.h:352
Emits exception handling directives.
Definition EHStreamer.h:30
bool hasPersonalityFn() const
Check whether this function has a personality function.
Definition Function.h:890
Constant * getPersonalityFn() const
Get the personality function associated with this function.
const Function & getFunction() const
Definition Function.h:167
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition Function.cpp:356
GCMetadataPrinter - Emits GC metadata as assembly code.
An analysis pass which caches information about the entire Module.
Definition GCMetadata.h:237
SmallVector< std::unique_ptr< GCStrategy >, 1 >::const_iterator iterator
Definition GCMetadata.h:266
GCStrategy describes a garbage collector algorithm's code generation requirements,...
Definition GCStrategy.h:64
bool usesMetadata() const
If set, appropriate metadata tables must be emitted by the back-end (assembler, JIT,...
Definition GCStrategy.h:120
const std::string & getName() const
Return the name of the GC strategy.
Definition GCStrategy.h:90
LLVM_ABI const GlobalObject * getAliaseeObject() const
Definition Globals.cpp:730
const Constant * getAliasee() const
Definition GlobalAlias.h:87
LLVM_ABI const Function * getResolverFunction() const
Definition Globals.cpp:759
const Constant * getResolver() const
Definition GlobalIFunc.h:73
StringRef getSection() const
Get the custom section of this global if it has one.
bool hasMetadata() const
Return true if this GlobalObject has any metadata attached to it.
bool hasSection() const
Check if this global has a custom object file section.
bool hasLinkOnceLinkage() const
bool hasExternalLinkage() const
bool isDSOLocal() const
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
VisibilityTypes getVisibility() const
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
Definition Globals.cpp:408
LinkageTypes getLinkage() const
bool hasLocalLinkage() const
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
bool hasPrivateLinkage() const
bool isTagged() const
bool isDeclarationForLinker() const
Module * getParent()
Get the module that this global value is contained inside of...
PointerType * getType() const
Global values are always pointers.
VisibilityTypes
An enumeration for the kinds of visibility of global values.
Definition GlobalValue.h:67
@ DefaultVisibility
The GV is visible.
Definition GlobalValue.h:68
@ HiddenVisibility
The GV is hidden.
Definition GlobalValue.h:69
@ ProtectedVisibility
The GV is protected.
Definition GlobalValue.h:70
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this global belongs to.
Definition Globals.cpp:205
LLVM_ABI bool canBenefitFromLocalAlias() const
Definition Globals.cpp:187
bool hasComdat() const
bool hasWeakLinkage() const
bool hasCommonLinkage() const
bool hasGlobalUnnamedAddr() const
bool hasAppendingLinkage() const
static bool isDiscardableIfUnused(LinkageTypes Linkage)
Whether the definition of this global may be discarded if it is not used in its compilation unit.
LLVM_ABI bool canBeOmittedFromSymbolTable() const
True if GV can be left out of the object symbol table.
Definition Globals.cpp:546
bool hasAvailableExternallyLinkage() const
LinkageTypes
An enumeration for the kinds of linkage for global values.
Definition GlobalValue.h:52
@ PrivateLinkage
Like Internal, but omit from symbol table.
Definition GlobalValue.h:61
@ CommonLinkage
Tentative definitions.
Definition GlobalValue.h:63
@ InternalLinkage
Rename collisions when linking (static functions).
Definition GlobalValue.h:60
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
Definition GlobalValue.h:55
@ WeakODRLinkage
Same, but only replaced by something equivalent.
Definition GlobalValue.h:58
@ ExternalLinkage
Externally visible function.
Definition GlobalValue.h:53
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
Definition GlobalValue.h:57
@ AppendingLinkage
Special purpose, only applies to global arrays.
Definition GlobalValue.h:59
@ AvailableExternallyLinkage
Available for inspection, not emission.
Definition GlobalValue.h:54
@ ExternalWeakLinkage
ExternalWeak linkage description.
Definition GlobalValue.h:62
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
Definition GlobalValue.h:56
Type * getValueType() const
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool hasInitializer() const
Definitions have initializers, declarations don't.
LLVM_ABI uint64_t getGlobalSize(const DataLayout &DL) const
Get the size of this global variable in bytes.
Definition Globals.cpp:640
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
Itinerary data supplied by a subtarget to be used by a target.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:338
LLVM_ABI void emitError(const Instruction *I, const Twine &ErrorStr)
emitError - Emit an error message to the currently installed error handler with optional location inf...
This is an alternative analysis pass to MachineBlockFrequencyInfo.
A helper class to return the specified delimiter string after the first invocation of operator String...
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.
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition MCAsmInfo.h:67
bool hasWeakDefCanBeHiddenDirective() const
Definition MCAsmInfo.h:636
bool hasSubsectionsViaSymbols() const
Definition MCAsmInfo.h:468
const char * getWeakRefDirective() const
Definition MCAsmInfo.h:634
bool hasIdentDirective() const
Definition MCAsmInfo.h:631
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.h:342
static const MCBinaryExpr * createAnd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Definition MCExpr.h:347
static const MCBinaryExpr * createGTE(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Definition MCExpr.h:367
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Definition MCExpr.h:427
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Definition MCExpr.cpp:212
Context object for machine code objects.
Definition MCContext.h:83
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
MCFragment * getNext() const
Definition MCSection.h:177
size_t getFixedSize() const
Definition MCSection.h:223
Instances of this class represent a single low-level machine instruction.
Definition MCInst.h:188
unsigned getOpcode() const
Definition MCInst.h:202
void setOpcode(unsigned Op)
Definition MCInst.h:201
Interface to description of machine instruction set.
Definition MCInstrInfo.h:27
MCSection * getTLSBSSSection() const
MCSection * getStackSizesSection(const MCSection &TextSec) const
MCSection * getBBAddrMapSection(const MCSection &TextSec) const
MCSection * getTLSExtraDataSection() const
MCSection * getKCFITrapSection(const MCSection &TextSec) const
MCSection * getPCSection(StringRef Name, const MCSection *TextSec) const
MCSection * getCallGraphSection(const MCSection &TextSec) const
MCSection * getDataSection() const
This represents a section on Windows.
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition MCSection.h:580
bool isBssSection() const
Check whether this section is "virtual", that is has no actual object file contents.
Definition MCSection.h:697
static constexpr unsigned NonUniqueID
Definition MCSection.h:585
Streaming machine code generation interface.
Definition MCStreamer.h:222
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
Generic base class for all target subtargets.
const MCSchedModel & getSchedModel() const
Get the machine model for this subtarget's CPU.
LLVM_ABI unsigned getBinding() const
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.h:213
StringRef getSymbolTableName() const
bool hasRename() const
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
bool isDefined() const
isDefined - Check if this symbol is defined (i.e., it has an address).
Definition MCSymbol.h:233
bool isUndefined() const
isUndefined - Check if this symbol undefined (i.e., implicitly defined).
Definition MCSymbol.h:243
StringRef getName() const
getName - Get the symbol name.
Definition MCSymbol.h:188
bool isVariable() const
isVariable - Check if this is a variable symbol.
Definition MCSymbol.h:267
void redefineIfPossible()
Prepare this symbol to be redefined.
Definition MCSymbol.h:212
const MCSymbol * getAddSym() const
Definition MCValue.h:49
int64_t getConstant() const
Definition MCValue.h:44
const MCSymbol * getSubSym() const
Definition MCValue.h:51
bool isAbsolute() const
Is this an absolute (as opposed to relocatable) value.
Definition MCValue.h:54
Metadata node.
Definition Metadata.h:1081
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1437
ArrayRef< MDOperand > operands() const
Definition Metadata.h:1435
Tracking metadata reference owned by Metadata.
Definition Metadata.h:902
A single uniqued string.
Definition Metadata.h:733
LLVM_ABI StringRef getString() const
Definition Metadata.cpp:615
LLVM_ABI MCSymbol * getSymbol() const
Return the MCSymbol for this basic block.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
LLVM_ABI BlockFrequency getBlockFreq(const MachineBasicBlock *MBB) const
getblockFreq - Return block frequency.
Result object for MachineBlockHashInfo.
LLVM_ABI uint64_t getMBBHash(const MachineBasicBlock &MBB) const
Legacy MachineFunctionPass for MachineBlockHashInfo.
LLVM_ABI BranchProbability getEdgeProbability(const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const
This class is a data container for one entry in a MachineConstantPool.
union llvm::MachineConstantPoolEntry::@004270020304201266316354007027341142157160323045 Val
The constant itself.
bool isMachineConstantPoolEntry() const
isMachineConstantPoolEntry - Return true if the MachineConstantPoolEntry is indeed a target specific ...
MachineConstantPoolValue * MachineCPVal
Align Alignment
The required alignment for this entry.
LLVM_ABI unsigned getSizeInBytes(const DataLayout &DL) const
LLVM_ABI 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
Analysis pass which computes a MachineDominatorTree.
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
DenseMap< const MachineInstr *, CallSiteInfo > CallSiteInfoMap
bool hasBBSections() const
Returns true if this function has basic block sections enabled.
Function & getFunction()
Return the LLVM function that this machine code represents.
const std::vector< LandingPadInfo > & getLandingPads() const
Return a reference to the landing pad info for the current function.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Representation of each machine instruction.
LLVM_ABI 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,...
LLVM_ABI unsigned getEntryAlignment(const DataLayout &TD) const
getEntryAlignment - Return the alignment of each entry in the jump table.
const std::vector< MachineJumpTableEntry > & getJumpTables() const
Analysis pass that exposes the MachineLoopInfo for a machine function.
An analysis that produces MachineModuleInfo for a module.
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.
MachineOperand class - Representation of each machine instruction operand.
const GlobalValue * getGlobal() const
bool isSymbol() const
isSymbol - Tests if this is a MO_ExternalSymbol operand.
bool isGlobal() const
isGlobal - Tests if this is a MO_GlobalAddress operand.
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
const char * getSymbolName() const
@ MO_Immediate
Immediate operand.
@ MO_GlobalAddress
Address of a global value.
@ MO_CImmediate
Immediate >64bit operand.
@ MO_FrameIndex
Abstract Stack Frame Index.
@ MO_Register
Register operand.
@ MO_ExternalSymbol
Name of external global symbol.
@ MO_TargetIndex
Target-dependent index+offset operand.
@ MO_FPImmediate
Floating-point immediate operand.
Diagnostic information for optimization analysis remarks.
LLVM_ABI 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:121
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
A tuple of MDNodes.
Definition Metadata.h:1797
LLVM_ABI unsigned getNumOperands() const
iterator_range< op_iterator > operands()
Definition Metadata.h:1893
Wrapper for a value that won't be replaced with a CFI jump table pointer in LowerTypeTestsModule.
Definition Constants.h:1182
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
AnalysisType * getAnalysisIfAvailable() const
getAnalysisIfAvailable<AnalysisType>() - Subclasses use this function to get analysis information tha...
static PointerType * getUnqual(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
Wrapper class representing virtual and physical registers.
Definition Register.h:20
SimpleRegistryEntry< GCMetadataPrinter, CtorParamTypes... > entry
Definition Registry.h:123
static iterator_range< iterator > entries()
Definition Registry.h:183
Represents a location in source code.
Definition SMLoc.h:22
SectionKind - This is a simple POD value that classifies the properties of a section.
Definition SectionKind.h:22
bool isCommon() const
bool isBSS() const
static SectionKind getReadOnlyWithRel()
bool isBSSLocal() const
bool isThreadBSS() const
bool isThreadLocal() const
bool isThreadData() const
static SectionKind getReadOnly()
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
int64_t getFixed() const
Returns the fixed component of the stack.
Definition TypeSize.h:46
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition StringRef.h:597
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
Definition StringRef.h:446
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:743
TypeSize getSizeInBytes() const
Definition DataLayout.h:752
TypeSize getElementOffset(unsigned Idx) const
Definition DataLayout.h:774
Class to represent struct types.
unsigned getNumElements() const
Random access to the elements.
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.
@ AllowOverEstimate
Allow the reported instruction size to be larger than the actual size.
@ NoVerify
Do not verify instruction size.
Align getMinFunctionAlignment() const
Return the minimum function alignment.
virtual const MCExpr * lowerDSOLocalEquivalent(const MCSymbol *LHS, const MCSymbol *RHS, int64_t Addend, std::optional< int64_t > PCRelativeOffset, const TargetMachine &TM) const
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 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 MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment, const Function *F) const
Given a constant with the SectionKind, return a section that it should be placed in.
virtual const MCExpr * lowerRelativeReference(const GlobalValue *LHS, const GlobalValue *RHS, int64_t Addend, std::optional< int64_t > PCRelativeOffset, const TargetMachine &TM) const
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...
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 void emitModuleMetadata(MCStreamer &Streamer, const Module &M) const
Emit the module-level metadata that the platform cares about.
virtual MCSymbol * getFunctionEntryPointSymbol(const GlobalValue *Func, const TargetMachine &TM) const
If supported, return the function entry point symbol.
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,...
Primary interface to the complete machine description for the target machine.
const Triple & getTargetTriple() const
TargetOptions Options
unsigned EnableStaticDataPartitioning
Enables the StaticDataSplitter pass.
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
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...
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
bool isOSBinFormatXCOFF() const
Tests whether the OS uses the XCOFF binary format.
Definition Triple.h:882
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:300
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
Definition Type.h:167
bool isSized() const
Return true if it makes sense to take the size of this type.
Definition Type.h:321
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false, bool NoDetails=false) const
Print the current type.
bool isFunctionTy() const
True if this is an instance of FunctionType.
Definition Type.h:268
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
Value * operator=(Value *RHS)
Definition ValueHandle.h:81
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
LLVM_ABI std::string getNameOrAsOperand() const
Definition Value.cpp:461
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:441
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
iterator_range< user_iterator > users()
Definition Value.h:428
User * user_back()
Definition Value.h:414
LLVM_ABI 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.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:712
bool use_empty() const
Definition Value.h:348
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:209
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:182
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
A raw_ostream that writes to an std::string.
std::string & str()
Returns the string's reference.
A raw_ostream that writes to an SmallVector or SmallString.
StringRef str() const
Return a StringRef for the vector contents.
LLVM_ABI 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.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
@ IMAGE_SCN_MEM_READ
Definition COFF.h:336
@ IMAGE_SCN_MEM_DISCARDABLE
Definition COFF.h:331
@ IMAGE_SCN_LNK_INFO
Definition COFF.h:307
@ IMAGE_SCN_CNT_INITIALIZED_DATA
Definition COFF.h:304
@ IMAGE_SCN_LNK_COMDAT
Definition COFF.h:309
@ IMAGE_SYM_CLASS_EXTERNAL
External symbol.
Definition COFF.h:224
@ IMAGE_SYM_CLASS_STATIC
Static.
Definition COFF.h:225
@ IMAGE_COMDAT_SELECT_ASSOCIATIVE
Definition COFF.h:459
@ IMAGE_COMDAT_SELECT_ANY
Definition COFF.h:456
@ SafeSEH
Definition COFF.h:847
@ GuardEHCont
Definition COFF.h:855
@ GuardCF
Definition COFF.h:853
@ Kernel
Definition COFF.h:857
@ IMAGE_SYM_DTYPE_NULL
No complex type; simple scalar variable.
Definition COFF.h:274
@ IMAGE_SYM_DTYPE_FUNCTION
A function that returns a base type.
Definition COFF.h:276
@ SCT_COMPLEX_TYPE_SHIFT
Type is formed as (base + (derived << SCT_COMPLEX_TYPE_SHIFT))
Definition COFF.h:280
@ SHF_ALLOC
Definition ELF.h:1259
@ SHF_LINK_ORDER
Definition ELF.h:1274
@ SHF_GROUP
Definition ELF.h:1281
@ SHF_WRITE
Definition ELF.h:1256
@ SHT_LLVM_JT_SIZES
Definition ELF.h:1198
@ SHT_PROGBITS
Definition ELF.h:1157
@ SHT_LLVM_SYMPART
Definition ELF.h:1190
@ STB_WEAK
Definition ELF.h:1423
constexpr uint32_t S_ATTR_LIVE_SUPPORT
Blocks are live if they reference live blocks.
Definition MachO.h:200
@ Itanium
Windows CE ARM, PowerPC, SH3, SH4.
Definition MCAsmInfo.h:52
@ X86
Windows x64, Windows Itanium (IA-64)
Definition MCAsmInfo.h:53
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
uint8_t getUnitLengthFieldByteSize(DwarfFormat Format)
Get the byte size of the unit length field depending on the DWARF format.
Definition Dwarf.h:1245
@ DWARF64
Definition Dwarf.h:93
uint8_t getDwarfOffsetByteSize(DwarfFormat Format)
The size of a reference determined by the DWARF 32/64-bit format.
Definition Dwarf.h:1203
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:679
DiagnosticInfoOptimizationBase::Argument NV
uint64_t MD5Hash(const FunctionId &Obj)
Definition FunctionId.h:167
@ OF_Text
The file should be opened in text mode on platforms like z/OS that make this distinction.
Definition FileSystem.h:777
LLVM_ABI std::error_code make_absolute(SmallVectorImpl< char > &path)
Make path an absolute path.
Definition Path.cpp:979
LLVM_ABI StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
Definition Path.cpp:594
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
void stable_sort(R &&Range)
Definition STLExtras.h:2132
LLVM_ABI bool shouldEmitBBHash()
Returns whether -emit-bb-hash is set.
OuterAnalysisManagerProxy< ModuleAnalysisManager, MachineFunction > ModuleAnalysisManagerMachineFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
LLVM_ABI std::pair< StringRef, StringRef > getToken(StringRef Source, StringRef Delimiters=" \t\n\v\f\r")
getToken - This function extracts one token from source, ignoring any leading characters that appear ...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI 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:2224
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
bool isa_and_nonnull(const Y &Val)
Definition Casting.h:676
Op::Description Desc
@ MCDR_DataRegionEnd
.end_data_region
@ MCDR_DataRegionJT32
.data_region jt32
bool isNoOpWithoutInvoke(EHPersonality Pers)
Return true if this personality may be safely removed if there are no invoke instructions remaining i...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
constexpr T MinAlign(U A, V B)
A and B are either alignments or offsets.
Definition MathExtras.h:352
LLVM_ABI Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1652
LLVM_ABI void setupModuleAsmPrinter(Module &M, ModuleAnalysisManager &MAM, AsmPrinter &AsmPrinter)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:149
LLVM_ABI SmallString< 128 > getPrefetchTargetSymbolName(StringRef FunctionName, const UniqueBBID &BBID, unsigned CallsiteIndex)
SmallVector< ValueTypeFromRangeType< R >, Size > to_vector(R &&Range)
Given a range of type R, iterate the entire range and return a SmallVector with elements of the vecto...
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
InnerAnalysisManagerProxy< MachineFunctionAnalysisManager, Function > MachineFunctionAnalysisManagerFunctionProxy
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
Definition Format.h:102
constexpr std::string_view HybridPatchableTargetSuffix
Definition Mangler.h:37
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Global
Append to llvm.global_dtors.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
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:1933
ExceptionHandling
Definition CodeGen.h:54
@ SjLj
setjmp/longjmp based exceptions
Definition CodeGen.h:58
@ ZOS
z/OS MVS Exception Handling.
Definition CodeGen.h:64
@ Emscripten
Emscripten JavaScript-based exception handling.
Definition CodeGen.h:62
@ None
No exception support.
Definition CodeGen.h:56
@ Default
Not specified; resolve to the target's default model.
Definition CodeGen.h:55
@ AIX
AIX Exception Handling.
Definition CodeGen.h:63
@ DwarfCFI
DWARF-like instruction based exceptions.
Definition CodeGen.h:57
@ WinEH
Windows Exception Handling.
Definition CodeGen.h:60
@ Wasm
WebAssembly Exception Handling.
Definition CodeGen.h:61
LLVM_ABI void setupMachineFunctionAsmPrinter(MachineFunctionAnalysisManager &MFAM, MachineFunction &MF, AsmPrinter &AsmPrinter)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
Definition Sequence.h:341
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1963
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition STLExtras.h:2182
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
@ TypeHash
Token ID based on allocated type hash.
Definition AllocToken.h:32
@ End
Run the machine verifier once, at the end of the pipeline.
Definition CodeGen.h:267
LLVM_ABI 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...
LLVM_ABI 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.
@ MCSA_Local
.local (ELF)
@ MCSA_WeakDefAutoPrivate
.weak_def_can_be_hidden (MachO)
@ MCSA_Memtag
.memtag (ELF)
@ MCSA_WeakReference
.weak_reference (MachO)
@ MCSA_AltEntry
.alt_entry (MachO)
@ MCSA_ELF_TypeIndFunction
.type _foo, STT_GNU_IFUNC
@ MCSA_Weak
.weak
@ MCSA_WeakDefinition
.weak_definition (MachO)
@ MCSA_Global
.type _foo, @gnu_unique_object
@ MCSA_Cold
.cold (MachO)
@ MCSA_ELF_TypeObject
.type _foo, STT_OBJECT # aka @object
@ MCSA_ELF_TypeFunction
.type _foo, STT_FUNC # aka @function
@ MCSA_Invalid
Not a valid directive.
@ MCSA_NoDeadStrip
.no_dead_strip (MachO)
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
constexpr const char * PseudoProbeDescMetadataName
Definition PseudoProbe.h:26
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define N
#define NC
Definition regutils.h:42
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
Map a basic block section ID to the begin and end symbols of that section which determine the section...
Definition AsmPrinter.h:161
llvm.global_ctors and llvm.global_dtors are arrays of Structor structs.
Definition AsmPrinter.h:563
LLVM_ABI void emit(int, MCStreamer *) const
uint64_t getEdgeCount(const UniqueBBID &SrcBBID, const UniqueBBID &SinkBBID) const
uint64_t getBlockCount(const UniqueBBID &BBID) const
Machine model for scheduling, bundling, and heuristics.
Definition MCSchedule.h:273
static LLVM_ABI int computeInstrLatency(const MCSubtargetInfo &STI, const MCSchedClassDesc &SCDesc)
Returns the latency value for the scheduling class.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:111
A helper struct providing information about the byte size of DW_FORM values that vary in size dependi...
Definition Dwarf.h:1216
This is the base class for a remark serializer.
virtual std::unique_ptr< MetaSerializer > metaSerializer(raw_ostream &OS, StringRef ExternalFilename)=0
Return the corresponding metadata serializer.