LLVM 22.0.0git
AsmPrinter.cpp
Go to the documentation of this file.
1//===- AsmPrinter.cpp - Common AsmPrinter code ----------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the AsmPrinter class.
10//
11//===----------------------------------------------------------------------===//
12
14#include "CodeViewDebug.h"
15#include "DwarfDebug.h"
16#include "DwarfException.h"
17#include "PseudoProbePrinter.h"
18#include "WasmException.h"
19#include "WinCFGuard.h"
20#include "WinException.h"
21#include "llvm/ADT/APFloat.h"
22#include "llvm/ADT/APInt.h"
23#include "llvm/ADT/DenseMap.h"
24#include "llvm/ADT/STLExtras.h"
28#include "llvm/ADT/Statistic.h"
30#include "llvm/ADT/StringRef.h"
32#include "llvm/ADT/Twine.h"
64#include "llvm/Config/config.h"
65#include "llvm/IR/BasicBlock.h"
66#include "llvm/IR/Comdat.h"
67#include "llvm/IR/Constant.h"
68#include "llvm/IR/Constants.h"
69#include "llvm/IR/DataLayout.h"
73#include "llvm/IR/Function.h"
74#include "llvm/IR/GCStrategy.h"
75#include "llvm/IR/GlobalAlias.h"
76#include "llvm/IR/GlobalIFunc.h"
78#include "llvm/IR/GlobalValue.h"
80#include "llvm/IR/Instruction.h"
81#include "llvm/IR/Mangler.h"
82#include "llvm/IR/Metadata.h"
83#include "llvm/IR/Module.h"
84#include "llvm/IR/Operator.h"
85#include "llvm/IR/PseudoProbe.h"
86#include "llvm/IR/Type.h"
87#include "llvm/IR/Value.h"
88#include "llvm/IR/ValueHandle.h"
89#include "llvm/MC/MCAsmInfo.h"
90#include "llvm/MC/MCContext.h"
92#include "llvm/MC/MCExpr.h"
93#include "llvm/MC/MCInst.h"
94#include "llvm/MC/MCSchedule.h"
95#include "llvm/MC/MCSection.h"
100#include "llvm/MC/MCStreamer.h"
102#include "llvm/MC/MCSymbol.h"
103#include "llvm/MC/MCSymbolELF.h"
105#include "llvm/MC/MCValue.h"
106#include "llvm/MC/SectionKind.h"
107#include "llvm/Object/ELFTypes.h"
108#include "llvm/Pass.h"
110#include "llvm/Support/Casting.h"
115#include "llvm/Support/Format.h"
117#include "llvm/Support/Path.h"
118#include "llvm/Support/VCSRevision.h"
124#include <algorithm>
125#include <cassert>
126#include <cinttypes>
127#include <cstdint>
128#include <iterator>
129#include <memory>
130#include <optional>
131#include <string>
132#include <utility>
133#include <vector>
134
135using namespace llvm;
136
137#define DEBUG_TYPE "asm-printer"
138
139// This is a replication of fields of object::PGOAnalysisMap::Features. It
140// should match the order of the fields so that
141// `object::PGOAnalysisMap::Features::decode(PgoAnalysisMapFeatures.getBits())`
142// succeeds.
144 None,
146 BBFreq,
147 BrProb,
148 All,
149};
151 "pgo-analysis-map", cl::Hidden, cl::CommaSeparated,
153 clEnumValN(PGOMapFeaturesEnum::None, "none", "Disable all options"),
155 "Function Entry Count"),
157 "Basic Block Frequency"),
158 clEnumValN(PGOMapFeaturesEnum::BrProb, "br-prob", "Branch Probability"),
159 clEnumValN(PGOMapFeaturesEnum::All, "all", "Enable all options")),
160 cl::desc(
161 "Enable extended information within the SHT_LLVM_BB_ADDR_MAP that is "
162 "extracted from PGO related analysis."));
163
165 "basic-block-address-map-skip-bb-entries",
166 cl::desc("Skip emitting basic block entries in the SHT_LLVM_BB_ADDR_MAP "
167 "section. It's used to save binary size when BB entries are "
168 "unnecessary for some PGOAnalysisMap features."),
169 cl::Hidden, cl::init(false));
170
172 "emit-jump-table-sizes-section",
173 cl::desc("Emit a section containing jump table addresses and sizes"),
174 cl::Hidden, cl::init(false));
175
176// This isn't turned on by default, since several of the scheduling models are
177// not completely accurate, and we don't want to be misleading.
179 "asm-print-latency",
180 cl::desc("Print instruction latencies as verbose asm comments"), cl::Hidden,
181 cl::init(false));
182
183STATISTIC(EmittedInsts, "Number of machine instrs printed");
184
185char AsmPrinter::ID = 0;
186
187namespace {
188class AddrLabelMapCallbackPtr final : CallbackVH {
189 AddrLabelMap *Map = nullptr;
190
191public:
192 AddrLabelMapCallbackPtr() = default;
193 AddrLabelMapCallbackPtr(Value *V) : CallbackVH(V) {}
194
195 void setPtr(BasicBlock *BB) {
197 }
198
199 void setMap(AddrLabelMap *map) { Map = map; }
200
201 void deleted() override;
202 void allUsesReplacedWith(Value *V2) override;
203};
204} // namespace
205
207 MCContext &Context;
208 struct AddrLabelSymEntry {
209 /// The symbols for the label.
211
212 Function *Fn; // The containing function of the BasicBlock.
213 unsigned Index; // The index in BBCallbacks for the BasicBlock.
214 };
215
216 DenseMap<AssertingVH<BasicBlock>, AddrLabelSymEntry> AddrLabelSymbols;
217
218 /// Callbacks for the BasicBlock's that we have entries for. We use this so
219 /// we get notified if a block is deleted or RAUWd.
220 std::vector<AddrLabelMapCallbackPtr> BBCallbacks;
221
222 /// This is a per-function list of symbols whose corresponding BasicBlock got
223 /// deleted. These symbols need to be emitted at some point in the file, so
224 /// AsmPrinter emits them after the function body.
225 DenseMap<AssertingVH<Function>, std::vector<MCSymbol *>>
226 DeletedAddrLabelsNeedingEmission;
227
228public:
229 AddrLabelMap(MCContext &context) : Context(context) {}
230
232 assert(DeletedAddrLabelsNeedingEmission.empty() &&
233 "Some labels for deleted blocks never got emitted");
234 }
235
237
239 std::vector<MCSymbol *> &Result);
240
243};
244
246 assert(BB->hasAddressTaken() &&
247 "Shouldn't get label for block without address taken");
248 AddrLabelSymEntry &Entry = AddrLabelSymbols[BB];
249
250 // If we already had an entry for this block, just return it.
251 if (!Entry.Symbols.empty()) {
252 assert(BB->getParent() == Entry.Fn && "Parent changed");
253 return Entry.Symbols;
254 }
255
256 // Otherwise, this is a new entry, create a new symbol for it and add an
257 // entry to BBCallbacks so we can be notified if the BB is deleted or RAUWd.
258 BBCallbacks.emplace_back(BB);
259 BBCallbacks.back().setMap(this);
260 Entry.Index = BBCallbacks.size() - 1;
261 Entry.Fn = BB->getParent();
263 : Context.createTempSymbol();
264 Entry.Symbols.push_back(Sym);
265 return Entry.Symbols;
266}
267
268/// If we have any deleted symbols for F, return them.
270 Function *F, std::vector<MCSymbol *> &Result) {
271 DenseMap<AssertingVH<Function>, std::vector<MCSymbol *>>::iterator I =
272 DeletedAddrLabelsNeedingEmission.find(F);
273
274 // If there are no entries for the function, just return.
275 if (I == DeletedAddrLabelsNeedingEmission.end())
276 return;
277
278 // Otherwise, take the list.
279 std::swap(Result, I->second);
280 DeletedAddrLabelsNeedingEmission.erase(I);
281}
282
283//===- Address of Block Management ----------------------------------------===//
284
287 // Lazily create AddrLabelSymbols.
288 if (!AddrLabelSymbols)
289 AddrLabelSymbols = std::make_unique<AddrLabelMap>(OutContext);
290 return AddrLabelSymbols->getAddrLabelSymbolToEmit(
291 const_cast<BasicBlock *>(BB));
292}
293
295 const Function *F, std::vector<MCSymbol *> &Result) {
296 // If no blocks have had their addresses taken, we're done.
297 if (!AddrLabelSymbols)
298 return;
299 return AddrLabelSymbols->takeDeletedSymbolsForFunction(
300 const_cast<Function *>(F), Result);
301}
302
304 // If the block got deleted, there is no need for the symbol. If the symbol
305 // was already emitted, we can just forget about it, otherwise we need to
306 // queue it up for later emission when the function is output.
307 AddrLabelSymEntry Entry = std::move(AddrLabelSymbols[BB]);
308 AddrLabelSymbols.erase(BB);
309 assert(!Entry.Symbols.empty() && "Didn't have a symbol, why a callback?");
310 BBCallbacks[Entry.Index] = nullptr; // Clear the callback.
311
312#if !LLVM_MEMORY_SANITIZER_BUILD
313 // BasicBlock is destroyed already, so this access is UB detectable by msan.
314 assert((BB->getParent() == nullptr || BB->getParent() == Entry.Fn) &&
315 "Block/parent mismatch");
316#endif
317
318 for (MCSymbol *Sym : Entry.Symbols) {
319 if (Sym->isDefined())
320 return;
321
322 // If the block is not yet defined, we need to emit it at the end of the
323 // function. Add the symbol to the DeletedAddrLabelsNeedingEmission list
324 // for the containing Function. Since the block is being deleted, its
325 // parent may already be removed, we have to get the function from 'Entry'.
326 DeletedAddrLabelsNeedingEmission[Entry.Fn].push_back(Sym);
327 }
328}
329
331 // Get the entry for the RAUW'd block and remove it from our map.
332 AddrLabelSymEntry OldEntry = std::move(AddrLabelSymbols[Old]);
333 AddrLabelSymbols.erase(Old);
334 assert(!OldEntry.Symbols.empty() && "Didn't have a symbol, why a callback?");
335
336 AddrLabelSymEntry &NewEntry = AddrLabelSymbols[New];
337
338 // If New is not address taken, just move our symbol over to it.
339 if (NewEntry.Symbols.empty()) {
340 BBCallbacks[OldEntry.Index].setPtr(New); // Update the callback.
341 NewEntry = std::move(OldEntry); // Set New's entry.
342 return;
343 }
344
345 BBCallbacks[OldEntry.Index] = nullptr; // Update the callback.
346
347 // Otherwise, we need to add the old symbols to the new block's set.
348 llvm::append_range(NewEntry.Symbols, OldEntry.Symbols);
349}
350
351void AddrLabelMapCallbackPtr::deleted() {
352 Map->UpdateForDeletedBlock(cast<BasicBlock>(getValPtr()));
353}
354
355void AddrLabelMapCallbackPtr::allUsesReplacedWith(Value *V2) {
356 Map->UpdateForRAUWBlock(cast<BasicBlock>(getValPtr()), cast<BasicBlock>(V2));
357}
358
359/// getGVAlignment - Return the alignment to use for the specified global
360/// value. This rounds up to the preferred alignment if possible and legal.
362 Align InAlign) {
363 Align Alignment;
364 if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV))
365 Alignment = DL.getPreferredAlign(GVar);
366
367 // If InAlign is specified, round it to it.
368 if (InAlign > Alignment)
369 Alignment = InAlign;
370
371 // If the GV has a specified alignment, take it into account.
372 MaybeAlign GVAlign;
373 if (auto *GVar = dyn_cast<GlobalVariable>(GV))
374 GVAlign = GVar->getAlign();
375 else if (auto *F = dyn_cast<Function>(GV))
376 GVAlign = F->getAlign();
377 if (!GVAlign)
378 return Alignment;
379
380 assert(GVAlign && "GVAlign must be set");
381
382 // If the GVAlign is larger than NumBits, or if we are required to obey
383 // NumBits because the GV has an assigned section, obey it.
384 if (*GVAlign > Alignment || GV->hasSection())
385 Alignment = *GVAlign;
386 return Alignment;
387}
388
389AsmPrinter::AsmPrinter(TargetMachine &tm, std::unique_ptr<MCStreamer> Streamer,
390 char &ID)
391 : MachineFunctionPass(ID), TM(tm), MAI(tm.getMCAsmInfo()),
392 OutContext(Streamer->getContext()), OutStreamer(std::move(Streamer)),
393 SM(*this) {
394 VerboseAsm = OutStreamer->isVerboseAsm();
395 DwarfUsesRelocationsAcrossSections =
397}
398
400 assert(!DD && Handlers.size() == NumUserHandlers &&
401 "Debug/EH info didn't get finalized");
402}
403
405 return TM.isPositionIndependent();
406}
407
408/// getFunctionNumber - Return a unique ID for the current function.
410 return MF->getFunctionNumber();
411}
412
414 return *TM.getObjFileLowering();
415}
416
418 assert(MMI && "MMI could not be nullptr!");
419 return MMI->getModule()->getDataLayout();
420}
421
422// Do not use the cached DataLayout because some client use it without a Module
423// (dsymutil, llvm-dwarfdump).
425 return TM.getPointerSize(0); // FIXME: Default address space
426}
427
429 assert(MF && "getSubtargetInfo requires a valid MachineFunction!");
431}
432
435}
436
438 if (DD) {
439 assert(OutStreamer->hasRawTextSupport() &&
440 "Expected assembly output mode.");
441 // This is NVPTX specific and it's unclear why.
442 // PR51079: If we have code without debug information we need to give up.
444 if (!MFSP)
445 return;
446 (void)DD->emitInitialLocDirective(MF, /*CUID=*/0);
447 }
448}
449
450/// getCurrentSection() - Return the current section we are emitting to.
452 return OutStreamer->getCurrentSectionOnly();
453}
454
456 AU.setPreservesAll();
462}
463
465 auto *MMIWP = getAnalysisIfAvailable<MachineModuleInfoWrapperPass>();
466 MMI = MMIWP ? &MMIWP->getMMI() : nullptr;
467 HasSplitStack = false;
468 HasNoSplitStack = false;
469 DbgInfoAvailable = !M.debug_compile_units().empty();
470
471 AddrLabelSymbols = nullptr;
472
473 // Initialize TargetLoweringObjectFile.
475 .Initialize(OutContext, TM);
476
478 .getModuleMetadata(M);
479
480 // On AIX, we delay emitting any section information until
481 // after emitting the .file pseudo-op. This allows additional
482 // information (such as the embedded command line) to be associated
483 // with all sections in the object file rather than a single section.
485 OutStreamer->initSections(false, *TM.getMCSubtargetInfo());
486
487 // Emit the version-min deployment target directive if needed.
488 //
489 // FIXME: If we end up with a collection of these sorts of Darwin-specific
490 // or ELF-specific things, it may make sense to have a platform helper class
491 // that will work with the target helper class. For now keep it here, as the
492 // alternative is duplicated code in each of the target asm printers that
493 // use the directive, where it would need the same conditionalization
494 // anyway.
495 const Triple &Target = TM.getTargetTriple();
496 if (Target.isOSBinFormatMachO() && Target.isOSDarwin()) {
497 Triple TVT(M.getDarwinTargetVariantTriple());
498 OutStreamer->emitVersionForTarget(
499 Target, M.getSDKVersion(),
500 M.getDarwinTargetVariantTriple().empty() ? nullptr : &TVT,
501 M.getDarwinTargetVariantSDKVersion());
502 }
503
504 // Allow the target to emit any magic that it wants at the start of the file.
506
507 // Very minimal debug info. It is ignored if we emit actual debug info. If we
508 // don't, this at least helps the user find where a global came from.
510 // .file "foo.c"
511 if (MAI->isAIX()) {
512 const char VerStr[] =
513#ifdef PACKAGE_VENDOR
514 PACKAGE_VENDOR " "
515#endif
516 PACKAGE_NAME " version " PACKAGE_VERSION
517#ifdef LLVM_REVISION
518 " (" LLVM_REVISION ")"
519#endif
520 ;
521 // TODO: Add timestamp and description.
522 OutStreamer->emitFileDirective(M.getSourceFileName(), VerStr, "", "");
523 } else {
524 OutStreamer->emitFileDirective(
525 llvm::sys::path::filename(M.getSourceFileName()));
526 }
527 }
528
529 // On AIX, emit bytes for llvm.commandline metadata after .file so that the
530 // C_INFO symbol is preserved if any csect is kept by the linker.
532 emitModuleCommandLines(M);
533 // Now we can generate section information.
534 OutStreamer->switchSection(
536
537 // To work around an AIX assembler and/or linker bug, generate
538 // a rename for the default text-section symbol name. This call has
539 // no effect when generating object code directly.
540 MCSection *TextSection =
541 OutStreamer->getContext().getObjectFileInfo()->getTextSection();
542 MCSymbolXCOFF *XSym =
543 static_cast<MCSectionXCOFF *>(TextSection)->getQualNameSymbol();
544 if (XSym->hasRename())
545 OutStreamer->emitXCOFFRenameDirective(XSym, XSym->getSymbolTableName());
546 }
547
548 GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
549 assert(MI && "AsmPrinter didn't require GCModuleInfo?");
550 for (const auto &I : *MI)
551 if (GCMetadataPrinter *MP = getOrCreateGCPrinter(*I))
552 MP->beginAssembly(M, *MI, *this);
553
554 // Emit module-level inline asm if it exists.
555 if (!M.getModuleInlineAsm().empty()) {
556 OutStreamer->AddComment("Start of file scope inline assembly");
557 OutStreamer->addBlankLine();
558 emitInlineAsm(
559 M.getModuleInlineAsm() + "\n", *TM.getMCSubtargetInfo(),
560 TM.Options.MCOptions, nullptr,
562 OutStreamer->AddComment("End of file scope inline assembly");
563 OutStreamer->addBlankLine();
564 }
565
567 bool EmitCodeView = M.getCodeViewFlag();
568 // On Windows targets, emit minimal CodeView compiler info even when debug
569 // info is disabled.
570 if ((TM.getTargetTriple().isOSWindows() &&
571 M.getNamedMetadata("llvm.dbg.cu")) ||
572 (TM.getTargetTriple().isUEFI() && EmitCodeView))
573 Handlers.push_back(std::make_unique<CodeViewDebug>(this));
574 if (!EmitCodeView || M.getDwarfVersion()) {
575 if (hasDebugInfo()) {
576 DD = new DwarfDebug(this);
577 Handlers.push_back(std::unique_ptr<DwarfDebug>(DD));
578 }
579 }
580 }
581
582 if (M.getNamedMetadata(PseudoProbeDescMetadataName))
583 PP = std::make_unique<PseudoProbeHandler>(this);
584
585 switch (MAI->getExceptionHandlingType()) {
587 // We may want to emit CFI for debug.
588 [[fallthrough]];
592 for (auto &F : M.getFunctionList()) {
594 ModuleCFISection = getFunctionCFISectionType(F);
595 // If any function needsUnwindTableEntry(), it needs .eh_frame and hence
596 // the module needs .eh_frame. If we have found that case, we are done.
597 if (ModuleCFISection == CFISection::EH)
598 break;
599 }
601 usesCFIWithoutEH() || ModuleCFISection != CFISection::EH);
602 break;
603 default:
604 break;
605 }
606
607 EHStreamer *ES = nullptr;
608 switch (MAI->getExceptionHandlingType()) {
610 if (!usesCFIWithoutEH())
611 break;
612 [[fallthrough]];
616 ES = new DwarfCFIException(this);
617 break;
619 ES = new ARMException(this);
620 break;
622 switch (MAI->getWinEHEncodingType()) {
623 default: llvm_unreachable("unsupported unwinding information encoding");
625 break;
628 ES = new WinException(this);
629 break;
630 }
631 break;
633 ES = new WasmException(this);
634 break;
636 ES = new AIXException(this);
637 break;
638 }
639 if (ES)
640 Handlers.push_back(std::unique_ptr<EHStreamer>(ES));
641
642 // Emit tables for any value of cfguard flag (i.e. cfguard=1 or cfguard=2).
643 if (mdconst::extract_or_null<ConstantInt>(M.getModuleFlag("cfguard")))
644 EHHandlers.push_back(std::make_unique<WinCFGuard>(this));
645
646 for (auto &Handler : Handlers)
647 Handler->beginModule(&M);
648 for (auto &Handler : EHHandlers)
649 Handler->beginModule(&M);
650
651 return false;
652}
653
654static bool canBeHidden(const GlobalValue *GV, const MCAsmInfo &MAI) {
656 return false;
657
658 return GV->canBeOmittedFromSymbolTable();
659}
660
661void AsmPrinter::emitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const {
663 switch (Linkage) {
669 if (MAI->isMachO()) {
670 // .globl _foo
671 OutStreamer->emitSymbolAttribute(GVSym, MCSA_Global);
672
673 if (!canBeHidden(GV, *MAI))
674 // .weak_definition _foo
675 OutStreamer->emitSymbolAttribute(GVSym, MCSA_WeakDefinition);
676 else
677 OutStreamer->emitSymbolAttribute(GVSym, MCSA_WeakDefAutoPrivate);
678 } else if (MAI->avoidWeakIfComdat() && GV->hasComdat()) {
679 // .globl _foo
680 OutStreamer->emitSymbolAttribute(GVSym, MCSA_Global);
681 //NOTE: linkonce is handled by the section the symbol was assigned to.
682 } else {
683 // .weak _foo
684 OutStreamer->emitSymbolAttribute(GVSym, MCSA_Weak);
685 }
686 return;
688 OutStreamer->emitSymbolAttribute(GVSym, MCSA_Global);
689 return;
692 return;
696 llvm_unreachable("Should never emit this");
697 }
698 llvm_unreachable("Unknown linkage type!");
699}
700
702 const GlobalValue *GV) const {
703 TM.getNameWithPrefix(Name, GV, getObjFileLowering().getMangler());
704}
705
707 return TM.getSymbol(GV);
708}
709
711 // On ELF, use .Lfoo$local if GV is a non-interposable GlobalObject with an
712 // exact definion (intersection of GlobalValue::hasExactDefinition() and
713 // !isInterposable()). These linkages include: external, appending, internal,
714 // private. It may be profitable to use a local alias for external. The
715 // assembler would otherwise be conservative and assume a global default
716 // visibility symbol can be interposable, even if the code generator already
717 // assumed it.
719 const Module &M = *GV.getParent();
721 M.getPIELevel() == PIELevel::Default && GV.isDSOLocal())
722 return getSymbolWithGlobalValueBase(&GV, "$local");
723 }
724 return TM.getSymbol(&GV);
725}
726
727/// EmitGlobalVariable - Emit the specified global variable to the .s file.
729 bool IsEmuTLSVar = TM.useEmulatedTLS() && GV->isThreadLocal();
730 assert(!(IsEmuTLSVar && GV->hasCommonLinkage()) &&
731 "No emulated TLS variables in the common section");
732
733 // Never emit TLS variable xyz in emulated TLS model.
734 // The initialization value is in __emutls_t.xyz instead of xyz.
735 if (IsEmuTLSVar)
736 return;
737
738 if (GV->hasInitializer()) {
739 // Check to see if this is a special global used by LLVM, if so, emit it.
740 if (emitSpecialLLVMGlobal(GV))
741 return;
742
743 // Skip the emission of global equivalents. The symbol can be emitted later
744 // on by emitGlobalGOTEquivs in case it turns out to be needed.
745 if (GlobalGOTEquivs.count(getSymbol(GV)))
746 return;
747
748 if (isVerbose()) {
749 // When printing the control variable __emutls_v.*,
750 // we don't need to print the original TLS variable name.
751 GV->printAsOperand(OutStreamer->getCommentOS(),
752 /*PrintType=*/false, GV->getParent());
753 OutStreamer->getCommentOS() << '\n';
754 }
755 }
756
757 MCSymbol *GVSym = getSymbol(GV);
758 MCSymbol *EmittedSym = GVSym;
759
760 // getOrCreateEmuTLSControlSym only creates the symbol with name and default
761 // attributes.
762 // GV's or GVSym's attributes will be used for the EmittedSym.
763 emitVisibility(EmittedSym, GV->getVisibility(), !GV->isDeclaration());
764
765 if (GV->isTagged()) {
767
768 if (T.getArch() != Triple::aarch64 || !T.isAndroid())
770 "tagged symbols (-fsanitize=memtag-globals) are "
771 "only supported on AArch64 Android");
772 OutStreamer->emitSymbolAttribute(EmittedSym, MCSA_Memtag);
773 }
774
775 if (!GV->hasInitializer()) // External globals require no extra code.
776 return;
777
778 GVSym->redefineIfPossible();
779 if (GVSym->isDefined() || GVSym->isVariable())
780 OutContext.reportError(SMLoc(), "symbol '" + Twine(GVSym->getName()) +
781 "' is already defined");
782
784 OutStreamer->emitSymbolAttribute(EmittedSym, MCSA_ELF_TypeObject);
785
787
788 const DataLayout &DL = GV->getDataLayout();
789 uint64_t Size = DL.getTypeAllocSize(GV->getValueType());
790
791 // If the alignment is specified, we *must* obey it. Overaligning a global
792 // with a specified alignment is a prompt way to break globals emitted to
793 // sections and expected to be contiguous (e.g. ObjC metadata).
794 const Align Alignment = getGVAlignment(GV, DL);
795
796 for (auto &Handler : Handlers)
797 Handler->setSymbolSize(GVSym, Size);
798
799 // Handle common symbols
800 if (GVKind.isCommon()) {
801 if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it.
802 // .comm _foo, 42, 4
803 OutStreamer->emitCommonSymbol(GVSym, Size, Alignment);
804 return;
805 }
806
807 // Determine to which section this global should be emitted.
808 MCSection *TheSection = getObjFileLowering().SectionForGlobal(GV, GVKind, TM);
809
810 // If we have a bss global going to a section that supports the
811 // zerofill directive, do so here.
812 if (GVKind.isBSS() && MAI->isMachO() && TheSection->isBssSection()) {
813 if (Size == 0)
814 Size = 1; // zerofill of 0 bytes is undefined.
815 emitLinkage(GV, GVSym);
816 // .zerofill __DATA, __bss, _foo, 400, 5
817 OutStreamer->emitZerofill(TheSection, GVSym, Size, Alignment);
818 return;
819 }
820
821 // If this is a BSS local symbol and we are emitting in the BSS
822 // section use .lcomm/.comm directive.
823 if (GVKind.isBSSLocal() &&
824 getObjFileLowering().getBSSSection() == TheSection) {
825 if (Size == 0)
826 Size = 1; // .comm Foo, 0 is undefined, avoid it.
827
828 // Use .lcomm only if it supports user-specified alignment.
829 // Otherwise, while it would still be correct to use .lcomm in some
830 // cases (e.g. when Align == 1), the external assembler might enfore
831 // some -unknown- default alignment behavior, which could cause
832 // spurious differences between external and integrated assembler.
833 // Prefer to simply fall back to .local / .comm in this case.
835 // .lcomm _foo, 42
836 OutStreamer->emitLocalCommonSymbol(GVSym, Size, Alignment);
837 return;
838 }
839
840 // .local _foo
841 OutStreamer->emitSymbolAttribute(GVSym, MCSA_Local);
842 // .comm _foo, 42, 4
843 OutStreamer->emitCommonSymbol(GVSym, Size, Alignment);
844 return;
845 }
846
847 // Handle thread local data for mach-o which requires us to output an
848 // additional structure of data and mangle the original symbol so that we
849 // can reference it later.
850 //
851 // TODO: This should become an "emit thread local global" method on TLOF.
852 // All of this macho specific stuff should be sunk down into TLOFMachO and
853 // stuff like "TLSExtraDataSection" should no longer be part of the parent
854 // TLOF class. This will also make it more obvious that stuff like
855 // MCStreamer::EmitTBSSSymbol is macho specific and only called from macho
856 // specific code.
857 if (GVKind.isThreadLocal() && MAI->isMachO()) {
858 // Emit the .tbss symbol
859 MCSymbol *MangSym =
860 OutContext.getOrCreateSymbol(GVSym->getName() + Twine("$tlv$init"));
861
862 if (GVKind.isThreadBSS()) {
863 TheSection = getObjFileLowering().getTLSBSSSection();
864 OutStreamer->emitTBSSSymbol(TheSection, MangSym, Size, Alignment);
865 } else if (GVKind.isThreadData()) {
866 OutStreamer->switchSection(TheSection);
867
868 emitAlignment(Alignment, GV);
869 OutStreamer->emitLabel(MangSym);
870
872 GV->getInitializer());
873 }
874
875 OutStreamer->addBlankLine();
876
877 // Emit the variable struct for the runtime.
879
880 OutStreamer->switchSection(TLVSect);
881 // Emit the linkage here.
882 emitLinkage(GV, GVSym);
883 OutStreamer->emitLabel(GVSym);
884
885 // Three pointers in size:
886 // - __tlv_bootstrap - used to make sure support exists
887 // - spare pointer, used when mapped by the runtime
888 // - pointer to mangled symbol above with initializer
889 unsigned PtrSize = DL.getPointerTypeSize(GV->getType());
890 OutStreamer->emitSymbolValue(GetExternalSymbolSymbol("_tlv_bootstrap"),
891 PtrSize);
892 OutStreamer->emitIntValue(0, PtrSize);
893 OutStreamer->emitSymbolValue(MangSym, PtrSize);
894
895 OutStreamer->addBlankLine();
896 return;
897 }
898
899 MCSymbol *EmittedInitSym = GVSym;
900
901 OutStreamer->switchSection(TheSection);
902
903 emitLinkage(GV, EmittedInitSym);
904 emitAlignment(Alignment, GV);
905
906 OutStreamer->emitLabel(EmittedInitSym);
907 MCSymbol *LocalAlias = getSymbolPreferLocal(*GV);
908 if (LocalAlias != EmittedInitSym)
909 OutStreamer->emitLabel(LocalAlias);
910
912
914 // .size foo, 42
915 OutStreamer->emitELFSize(EmittedInitSym,
917
918 OutStreamer->addBlankLine();
919}
920
921/// Emit the directive and value for debug thread local expression
922///
923/// \p Value - The value to emit.
924/// \p Size - The size of the integer (in bytes) to emit.
925void AsmPrinter::emitDebugValue(const MCExpr *Value, unsigned Size) const {
926 OutStreamer->emitValue(Value, Size);
927}
928
929void AsmPrinter::emitFunctionHeaderComment() {}
930
931void AsmPrinter::emitFunctionPrefix(ArrayRef<const Constant *> Prefix) {
932 const Function &F = MF->getFunction();
934 for (auto &C : Prefix)
935 emitGlobalConstant(F.getDataLayout(), C);
936 return;
937 }
938 // Preserving prefix-like data on platforms which use subsections-via-symbols
939 // is a bit tricky. Here we introduce a symbol for the prefix-like data
940 // and use the .alt_entry attribute to mark the function's real entry point
941 // as an alternative entry point to the symbol that precedes the function..
943
944 for (auto &C : Prefix) {
945 emitGlobalConstant(F.getDataLayout(), C);
946 }
947
948 // Emit an .alt_entry directive for the actual function symbol.
949 OutStreamer->emitSymbolAttribute(CurrentFnSym, MCSA_AltEntry);
950}
951
952/// EmitFunctionHeader - This method emits the header for the current
953/// function.
954void AsmPrinter::emitFunctionHeader() {
955 const Function &F = MF->getFunction();
956
957 if (isVerbose())
958 OutStreamer->getCommentOS()
959 << "-- Begin function "
960 << GlobalValue::dropLLVMManglingEscape(F.getName()) << '\n';
961
962 // Print out constants referenced by the function
964
965 // Print the 'header' of function.
966 // If basic block sections are desired, explicitly request a unique section
967 // for this function's entry block.
968 if (MF->front().isBeginSection())
969 MF->setSection(getObjFileLowering().getUniqueSectionForFunction(F, TM));
970 else
971 MF->setSection(getObjFileLowering().SectionForGlobal(&F, TM));
972 OutStreamer->switchSection(MF->getSection());
973
974 if (MAI->isAIX())
976 else
977 emitVisibility(CurrentFnSym, F.getVisibility());
978
982
984 OutStreamer->emitSymbolAttribute(CurrentFnSym, MCSA_ELF_TypeFunction);
985
986 if (F.hasFnAttribute(Attribute::Cold))
987 OutStreamer->emitSymbolAttribute(CurrentFnSym, MCSA_Cold);
988
989 // Emit the prefix data.
990 if (F.hasPrefixData())
991 emitFunctionPrefix({F.getPrefixData()});
992
993 // Emit KCFI type information before patchable-function-prefix nops.
995
996 // Emit M NOPs for -fpatchable-function-entry=N,M where M>0. We arbitrarily
997 // place prefix data before NOPs.
998 unsigned PatchableFunctionPrefix = 0;
999 unsigned PatchableFunctionEntry = 0;
1000 (void)F.getFnAttribute("patchable-function-prefix")
1001 .getValueAsString()
1002 .getAsInteger(10, PatchableFunctionPrefix);
1003 (void)F.getFnAttribute("patchable-function-entry")
1004 .getValueAsString()
1005 .getAsInteger(10, PatchableFunctionEntry);
1006 if (PatchableFunctionPrefix) {
1010 emitNops(PatchableFunctionPrefix);
1011 } else if (PatchableFunctionEntry) {
1012 // May be reassigned when emitting the body, to reference the label after
1013 // the initial BTI (AArch64) or endbr32/endbr64 (x86).
1015 }
1016
1017 // Emit the function prologue data for the indirect call sanitizer.
1018 if (const MDNode *MD = F.getMetadata(LLVMContext::MD_func_sanitize)) {
1019 assert(MD->getNumOperands() == 2);
1020
1021 auto *PrologueSig = mdconst::extract<Constant>(MD->getOperand(0));
1022 auto *TypeHash = mdconst::extract<Constant>(MD->getOperand(1));
1023 emitFunctionPrefix({PrologueSig, TypeHash});
1024 }
1025
1026 if (isVerbose()) {
1027 F.printAsOperand(OutStreamer->getCommentOS(),
1028 /*PrintType=*/false, F.getParent());
1029 emitFunctionHeaderComment();
1030 OutStreamer->getCommentOS() << '\n';
1031 }
1032
1033 // Emit the function descriptor. This is a virtual function to allow targets
1034 // to emit their specific function descriptor. Right now it is only used by
1035 // the AIX target. The PowerPC 64-bit V1 ELF target also uses function
1036 // descriptors and should be converted to use this hook as well.
1037 if (MAI->isAIX())
1039
1040 // Emit the CurrentFnSym. This is a virtual function to allow targets to do
1041 // their wild and crazy things as required.
1043
1044 // If the function had address-taken blocks that got deleted, then we have
1045 // references to the dangling symbols. Emit them at the start of the function
1046 // so that we don't get references to undefined symbols.
1047 std::vector<MCSymbol*> DeadBlockSyms;
1048 takeDeletedSymbolsForFunction(&F, DeadBlockSyms);
1049 for (MCSymbol *DeadBlockSym : DeadBlockSyms) {
1050 OutStreamer->AddComment("Address taken block that was later removed");
1051 OutStreamer->emitLabel(DeadBlockSym);
1052 }
1053
1054 if (CurrentFnBegin) {
1057 OutStreamer->emitLabel(CurPos);
1058 OutStreamer->emitAssignment(CurrentFnBegin,
1060 } else {
1061 OutStreamer->emitLabel(CurrentFnBegin);
1062 }
1063 }
1064
1065 // Emit pre-function debug and/or EH information.
1066 for (auto &Handler : Handlers) {
1067 Handler->beginFunction(MF);
1068 Handler->beginBasicBlockSection(MF->front());
1069 }
1070 for (auto &Handler : EHHandlers) {
1071 Handler->beginFunction(MF);
1072 Handler->beginBasicBlockSection(MF->front());
1073 }
1074
1075 // Emit the prologue data.
1076 if (F.hasPrologueData())
1077 emitGlobalConstant(F.getDataLayout(), F.getPrologueData());
1078}
1079
1080/// EmitFunctionEntryLabel - Emit the label that is the entrypoint for the
1081/// function. This can be overridden by targets as required to do custom stuff.
1084 OutStreamer->emitLabel(CurrentFnSym);
1085
1088 if (Sym != CurrentFnSym) {
1090 OutStreamer->emitLabel(Sym);
1091 OutStreamer->emitSymbolAttribute(Sym, MCSA_ELF_TypeFunction);
1092 }
1093 }
1094}
1095
1096/// emitComments - Pretty-print comments for instructions.
1097static void emitComments(const MachineInstr &MI, const MCSubtargetInfo *STI,
1098 raw_ostream &CommentOS) {
1099 const MachineFunction *MF = MI.getMF();
1101
1102 // Check for spills and reloads
1103
1104 // We assume a single instruction only has a spill or reload, not
1105 // both.
1106 std::optional<LocationSize> Size;
1107 if ((Size = MI.getRestoreSize(TII))) {
1108 CommentOS << Size->getValue() << "-byte Reload\n";
1109 } else if ((Size = MI.getFoldedRestoreSize(TII))) {
1110 if (!Size->hasValue())
1111 CommentOS << "Unknown-size Folded Reload\n";
1112 else if (Size->getValue())
1113 CommentOS << Size->getValue() << "-byte Folded Reload\n";
1114 } else if ((Size = MI.getSpillSize(TII))) {
1115 CommentOS << Size->getValue() << "-byte Spill\n";
1116 } else if ((Size = MI.getFoldedSpillSize(TII))) {
1117 if (!Size->hasValue())
1118 CommentOS << "Unknown-size Folded Spill\n";
1119 else if (Size->getValue())
1120 CommentOS << Size->getValue() << "-byte Folded Spill\n";
1121 }
1122
1123 // Check for spill-induced copies
1124 if (MI.getAsmPrinterFlag(MachineInstr::ReloadReuse))
1125 CommentOS << " Reload Reuse\n";
1126
1127 if (PrintLatency) {
1129 const MCSchedModel &SCModel = STI->getSchedModel();
1132 *STI, *TII, MI);
1133 // Report only interesting latencies.
1134 if (1 < Latency)
1135 CommentOS << " Latency: " << Latency << "\n";
1136 }
1137}
1138
1139/// emitImplicitDef - This method emits the specified machine instruction
1140/// that is an implicit def.
1142 Register RegNo = MI->getOperand(0).getReg();
1143
1144 SmallString<128> Str;
1146 OS << "implicit-def: "
1147 << printReg(RegNo, MF->getSubtarget().getRegisterInfo());
1148
1149 OutStreamer->AddComment(OS.str());
1150 OutStreamer->addBlankLine();
1151}
1152
1153static void emitKill(const MachineInstr *MI, AsmPrinter &AP) {
1154 std::string Str;
1156 OS << "kill:";
1157 for (const MachineOperand &Op : MI->operands()) {
1158 assert(Op.isReg() && "KILL instruction must have only register operands");
1159 OS << ' ' << (Op.isDef() ? "def " : "killed ")
1160 << printReg(Op.getReg(), AP.MF->getSubtarget().getRegisterInfo());
1161 }
1162 AP.OutStreamer->AddComment(Str);
1163 AP.OutStreamer->addBlankLine();
1164}
1165
1166static void emitFakeUse(const MachineInstr *MI, AsmPrinter &AP) {
1167 std::string Str;
1169 OS << "fake_use:";
1170 for (const MachineOperand &Op : MI->operands()) {
1171 // In some circumstances we can end up with fake uses of constants; skip
1172 // these.
1173 if (!Op.isReg())
1174 continue;
1175 OS << ' ' << printReg(Op.getReg(), AP.MF->getSubtarget().getRegisterInfo());
1176 }
1177 AP.OutStreamer->AddComment(OS.str());
1178 AP.OutStreamer->addBlankLine();
1179}
1180
1181/// emitDebugValueComment - This method handles the target-independent form
1182/// of DBG_VALUE, returning true if it was able to do so. A false return
1183/// means the target will need to handle MI in EmitInstruction.
1185 // This code handles only the 4-operand target-independent form.
1186 if (MI->isNonListDebugValue() && MI->getNumOperands() != 4)
1187 return false;
1188
1189 SmallString<128> Str;
1191 OS << "DEBUG_VALUE: ";
1192
1193 const DILocalVariable *V = MI->getDebugVariable();
1194 if (auto *SP = dyn_cast<DISubprogram>(V->getScope())) {
1195 StringRef Name = SP->getName();
1196 if (!Name.empty())
1197 OS << Name << ":";
1198 }
1199 OS << V->getName();
1200 OS << " <- ";
1201
1202 const DIExpression *Expr = MI->getDebugExpression();
1203 // First convert this to a non-variadic expression if possible, to simplify
1204 // the output.
1205 if (auto NonVariadicExpr = DIExpression::convertToNonVariadicExpression(Expr))
1206 Expr = *NonVariadicExpr;
1207 // Then, output the possibly-simplified expression.
1208 if (Expr->getNumElements()) {
1209 OS << '[';
1210 ListSeparator LS;
1211 for (auto &Op : Expr->expr_ops()) {
1212 OS << LS << dwarf::OperationEncodingString(Op.getOp());
1213 for (unsigned I = 0; I < Op.getNumArgs(); ++I)
1214 OS << ' ' << Op.getArg(I);
1215 }
1216 OS << "] ";
1217 }
1218
1219 // Register or immediate value. Register 0 means undef.
1220 for (const MachineOperand &Op : MI->debug_operands()) {
1221 if (&Op != MI->debug_operands().begin())
1222 OS << ", ";
1223 switch (Op.getType()) {
1225 APFloat APF = APFloat(Op.getFPImm()->getValueAPF());
1226 Type *ImmTy = Op.getFPImm()->getType();
1227 if (ImmTy->isBFloatTy() || ImmTy->isHalfTy() || ImmTy->isFloatTy() ||
1228 ImmTy->isDoubleTy()) {
1229 OS << APF.convertToDouble();
1230 } else {
1231 // There is no good way to print long double. Convert a copy to
1232 // double. Ah well, it's only a comment.
1233 bool ignored;
1235 &ignored);
1236 OS << "(long double) " << APF.convertToDouble();
1237 }
1238 break;
1239 }
1241 OS << Op.getImm();
1242 break;
1243 }
1245 Op.getCImm()->getValue().print(OS, false /*isSigned*/);
1246 break;
1247 }
1249 OS << "!target-index(" << Op.getIndex() << "," << Op.getOffset() << ")";
1250 break;
1251 }
1254 Register Reg;
1255 std::optional<StackOffset> Offset;
1256 if (Op.isReg()) {
1257 Reg = Op.getReg();
1258 } else {
1259 const TargetFrameLowering *TFI =
1261 Offset = TFI->getFrameIndexReference(*AP.MF, Op.getIndex(), Reg);
1262 }
1263 if (!Reg) {
1264 // Suppress offset, it is not meaningful here.
1265 OS << "undef";
1266 break;
1267 }
1268 // The second operand is only an offset if it's an immediate.
1269 if (MI->isIndirectDebugValue())
1270 Offset = StackOffset::getFixed(MI->getDebugOffset().getImm());
1271 if (Offset)
1272 OS << '[';
1273 OS << printReg(Reg, AP.MF->getSubtarget().getRegisterInfo());
1274 if (Offset)
1275 OS << '+' << Offset->getFixed() << ']';
1276 break;
1277 }
1278 default:
1279 llvm_unreachable("Unknown operand type");
1280 }
1281 }
1282
1283 // NOTE: Want this comment at start of line, don't emit with AddComment.
1284 AP.OutStreamer->emitRawComment(Str);
1285 return true;
1286}
1287
1288/// This method handles the target-independent form of DBG_LABEL, returning
1289/// true if it was able to do so. A false return means the target will need
1290/// to handle MI in EmitInstruction.
1292 if (MI->getNumOperands() != 1)
1293 return false;
1294
1295 SmallString<128> Str;
1297 OS << "DEBUG_LABEL: ";
1298
1299 const DILabel *V = MI->getDebugLabel();
1300 if (auto *SP = dyn_cast<DISubprogram>(
1301 V->getScope()->getNonLexicalBlockFileScope())) {
1302 StringRef Name = SP->getName();
1303 if (!Name.empty())
1304 OS << Name << ":";
1305 }
1306 OS << V->getName();
1307
1308 // NOTE: Want this comment at start of line, don't emit with AddComment.
1309 AP.OutStreamer->emitRawComment(OS.str());
1310 return true;
1311}
1312
1315 // Ignore functions that won't get emitted.
1316 if (F.isDeclarationForLinker())
1317 return CFISection::None;
1318
1320 F.needsUnwindTableEntry())
1321 return CFISection::EH;
1322
1323 if (MAI->usesCFIWithoutEH() && F.hasUWTable())
1324 return CFISection::EH;
1325
1327 return CFISection::Debug;
1328
1329 return CFISection::None;
1330}
1331
1335}
1336
1339}
1340
1342 return MAI->usesCFIWithoutEH() && ModuleCFISection != CFISection::None;
1343}
1344
1346 ExceptionHandling ExceptionHandlingType = MAI->getExceptionHandlingType();
1347 if (!usesCFIWithoutEH() &&
1348 ExceptionHandlingType != ExceptionHandling::DwarfCFI &&
1349 ExceptionHandlingType != ExceptionHandling::ARM)
1350 return;
1351
1353 return;
1354
1355 // If there is no "real" instruction following this CFI instruction, skip
1356 // emitting it; it would be beyond the end of the function's FDE range.
1357 auto *MBB = MI.getParent();
1358 auto I = std::next(MI.getIterator());
1359 while (I != MBB->end() && I->isTransient())
1360 ++I;
1361 if (I == MBB->instr_end() &&
1363 return;
1364
1365 const std::vector<MCCFIInstruction> &Instrs = MF->getFrameInstructions();
1366 unsigned CFIIndex = MI.getOperand(0).getCFIIndex();
1367 const MCCFIInstruction &CFI = Instrs[CFIIndex];
1368 emitCFIInstruction(CFI);
1369}
1370
1372 // The operands are the MCSymbol and the frame offset of the allocation.
1373 MCSymbol *FrameAllocSym = MI.getOperand(0).getMCSymbol();
1374 int FrameOffset = MI.getOperand(1).getImm();
1375
1376 // Emit a symbol assignment.
1377 OutStreamer->emitAssignment(FrameAllocSym,
1378 MCConstantExpr::create(FrameOffset, OutContext));
1379}
1380
1381/// Returns the BB metadata to be emitted in the SHT_LLVM_BB_ADDR_MAP section
1382/// for a given basic block. This can be used to capture more precise profile
1383/// information.
1388 MBB.isEHPad(), const_cast<MachineBasicBlock &>(MBB).canFallThrough(),
1389 !MBB.empty() && MBB.rbegin()->isIndirectBranch()}
1390 .encode();
1391}
1392
1394getBBAddrMapFeature(const MachineFunction &MF, int NumMBBSectionRanges,
1395 bool HasCalls) {
1396 // Ensure that the user has not passed in additional options while also
1397 // specifying all or none.
1398 if ((PgoAnalysisMapFeatures.isSet(PGOMapFeaturesEnum::None) ||
1399 PgoAnalysisMapFeatures.isSet(PGOMapFeaturesEnum::All)) &&
1400 popcount(PgoAnalysisMapFeatures.getBits()) != 1) {
1402 "-pgo-anaylsis-map can accept only all or none with no additional "
1403 "values.");
1404 }
1405
1406 bool NoFeatures = PgoAnalysisMapFeatures.isSet(PGOMapFeaturesEnum::None);
1407 bool AllFeatures = PgoAnalysisMapFeatures.isSet(PGOMapFeaturesEnum::All);
1408 bool FuncEntryCountEnabled =
1409 AllFeatures || (!NoFeatures && PgoAnalysisMapFeatures.isSet(
1410 PGOMapFeaturesEnum::FuncEntryCount));
1411 bool BBFreqEnabled =
1412 AllFeatures ||
1413 (!NoFeatures && PgoAnalysisMapFeatures.isSet(PGOMapFeaturesEnum::BBFreq));
1414 bool BrProbEnabled =
1415 AllFeatures ||
1416 (!NoFeatures && PgoAnalysisMapFeatures.isSet(PGOMapFeaturesEnum::BrProb));
1417
1418 if ((BBFreqEnabled || BrProbEnabled) && BBAddrMapSkipEmitBBEntries) {
1420 "BB entries info is required for BBFreq and BrProb "
1421 "features");
1422 }
1423 return {FuncEntryCountEnabled,
1424 BBFreqEnabled,
1425 BrProbEnabled,
1426 MF.hasBBSections() && NumMBBSectionRanges > 1,
1427 static_cast<bool>(BBAddrMapSkipEmitBBEntries),
1428 HasCalls};
1429}
1430
1432 MCSection *BBAddrMapSection =
1434 assert(BBAddrMapSection && ".llvm_bb_addr_map section is not initialized.");
1435 bool HasCalls = !CurrentFnCallsiteEndSymbols.empty();
1436
1437 const MCSymbol *FunctionSymbol = getFunctionBegin();
1438
1439 OutStreamer->pushSection();
1440 OutStreamer->switchSection(BBAddrMapSection);
1441 OutStreamer->AddComment("version");
1442 uint8_t BBAddrMapVersion = OutStreamer->getContext().getBBAddrMapVersion();
1443 OutStreamer->emitInt8(BBAddrMapVersion);
1444 OutStreamer->AddComment("feature");
1445 auto Features = getBBAddrMapFeature(MF, MBBSectionRanges.size(), HasCalls);
1446 OutStreamer->emitInt8(Features.encode());
1447 // Emit BB Information for each basic block in the function.
1448 if (Features.MultiBBRange) {
1449 OutStreamer->AddComment("number of basic block ranges");
1450 OutStreamer->emitULEB128IntValue(MBBSectionRanges.size());
1451 }
1452 // Number of blocks in each MBB section.
1453 MapVector<MBBSectionID, unsigned> MBBSectionNumBlocks;
1454 const MCSymbol *PrevMBBEndSymbol = nullptr;
1455 if (!Features.MultiBBRange) {
1456 OutStreamer->AddComment("function address");
1457 OutStreamer->emitSymbolValue(FunctionSymbol, getPointerSize());
1458 OutStreamer->AddComment("number of basic blocks");
1459 OutStreamer->emitULEB128IntValue(MF.size());
1460 PrevMBBEndSymbol = FunctionSymbol;
1461 } else {
1462 unsigned BBCount = 0;
1463 for (const MachineBasicBlock &MBB : MF) {
1464 BBCount++;
1465 if (MBB.isEndSection()) {
1466 // Store each section's basic block count when it ends.
1467 MBBSectionNumBlocks[MBB.getSectionID()] = BBCount;
1468 // Reset the count for the next section.
1469 BBCount = 0;
1470 }
1471 }
1472 }
1473 // Emit the BB entry for each basic block in the function.
1474 for (const MachineBasicBlock &MBB : MF) {
1475 const MCSymbol *MBBSymbol =
1476 MBB.isEntryBlock() ? FunctionSymbol : MBB.getSymbol();
1477 bool IsBeginSection =
1478 Features.MultiBBRange && (MBB.isBeginSection() || MBB.isEntryBlock());
1479 if (IsBeginSection) {
1480 OutStreamer->AddComment("base address");
1481 OutStreamer->emitSymbolValue(MBBSymbol, getPointerSize());
1482 OutStreamer->AddComment("number of basic blocks");
1483 OutStreamer->emitULEB128IntValue(MBBSectionNumBlocks[MBB.getSectionID()]);
1484 PrevMBBEndSymbol = MBBSymbol;
1485 }
1486
1487 if (!Features.OmitBBEntries) {
1488 OutStreamer->AddComment("BB id");
1489 // Emit the BB ID for this basic block.
1490 // We only emit BaseID since CloneID is unset for
1491 // -basic-block-adress-map.
1492 // TODO: Emit the full BBID when labels and sections can be mixed
1493 // together.
1494 OutStreamer->emitULEB128IntValue(MBB.getBBID()->BaseID);
1495 // Emit the basic block offset relative to the end of the previous block.
1496 // This is zero unless the block is padded due to alignment.
1497 emitLabelDifferenceAsULEB128(MBBSymbol, PrevMBBEndSymbol);
1498 const MCSymbol *CurrentLabel = MBBSymbol;
1499 if (HasCalls) {
1500 auto CallsiteEndSymbols = CurrentFnCallsiteEndSymbols.lookup(&MBB);
1501 OutStreamer->AddComment("number of callsites");
1502 OutStreamer->emitULEB128IntValue(CallsiteEndSymbols.size());
1503 for (const MCSymbol *CallsiteEndSymbol : CallsiteEndSymbols) {
1504 // Emit the callsite offset.
1505 emitLabelDifferenceAsULEB128(CallsiteEndSymbol, CurrentLabel);
1506 CurrentLabel = CallsiteEndSymbol;
1507 }
1508 }
1509 // Emit the offset to the end of the block, which can be used to compute
1510 // the total block size.
1512 // Emit the Metadata.
1513 OutStreamer->emitULEB128IntValue(getBBAddrMapMetadata(MBB));
1514 }
1515 PrevMBBEndSymbol = MBB.getEndSymbol();
1516 }
1517
1518 if (Features.hasPGOAnalysis()) {
1519 assert(BBAddrMapVersion >= 2 &&
1520 "PGOAnalysisMap only supports version 2 or later");
1521
1522 if (Features.FuncEntryCount) {
1523 OutStreamer->AddComment("function entry count");
1524 auto MaybeEntryCount = MF.getFunction().getEntryCount();
1525 OutStreamer->emitULEB128IntValue(
1526 MaybeEntryCount ? MaybeEntryCount->getCount() : 0);
1527 }
1528 const MachineBlockFrequencyInfo *MBFI =
1529 Features.BBFreq
1530 ? &getAnalysis<LazyMachineBlockFrequencyInfoPass>().getBFI()
1531 : nullptr;
1532 const MachineBranchProbabilityInfo *MBPI =
1533 Features.BrProb
1534 ? &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI()
1535 : nullptr;
1536
1537 if (Features.BBFreq || Features.BrProb) {
1538 for (const MachineBasicBlock &MBB : MF) {
1539 if (Features.BBFreq) {
1540 OutStreamer->AddComment("basic block frequency");
1541 OutStreamer->emitULEB128IntValue(
1542 MBFI->getBlockFreq(&MBB).getFrequency());
1543 }
1544 if (Features.BrProb) {
1545 unsigned SuccCount = MBB.succ_size();
1546 OutStreamer->AddComment("basic block successor count");
1547 OutStreamer->emitULEB128IntValue(SuccCount);
1548 for (const MachineBasicBlock *SuccMBB : MBB.successors()) {
1549 OutStreamer->AddComment("successor BB ID");
1550 OutStreamer->emitULEB128IntValue(SuccMBB->getBBID()->BaseID);
1551 OutStreamer->AddComment("successor branch probability");
1552 OutStreamer->emitULEB128IntValue(
1553 MBPI->getEdgeProbability(&MBB, SuccMBB).getNumerator());
1554 }
1555 }
1556 }
1557 }
1558 }
1559
1560 OutStreamer->popSection();
1561}
1562
1564 const MCSymbol *Symbol) {
1565 MCSection *Section =
1567 if (!Section)
1568 return;
1569
1570 OutStreamer->pushSection();
1571 OutStreamer->switchSection(Section);
1572
1574 OutStreamer->emitLabel(Loc);
1575 OutStreamer->emitAbsoluteSymbolDiff(Symbol, Loc, 4);
1576
1577 OutStreamer->popSection();
1578}
1579
1581 const Function &F = MF.getFunction();
1582 if (const MDNode *MD = F.getMetadata(LLVMContext::MD_kcfi_type))
1583 emitGlobalConstant(F.getDataLayout(),
1584 mdconst::extract<ConstantInt>(MD->getOperand(0)));
1585}
1586
1588 if (PP) {
1589 auto GUID = MI.getOperand(0).getImm();
1590 auto Index = MI.getOperand(1).getImm();
1591 auto Type = MI.getOperand(2).getImm();
1592 auto Attr = MI.getOperand(3).getImm();
1593 DILocation *DebugLoc = MI.getDebugLoc();
1594 PP->emitPseudoProbe(GUID, Index, Type, Attr, DebugLoc);
1595 }
1596}
1597
1600 return;
1601
1602 MCSection *StackSizeSection =
1604 if (!StackSizeSection)
1605 return;
1606
1607 const MachineFrameInfo &FrameInfo = MF.getFrameInfo();
1608 // Don't emit functions with dynamic stack allocations.
1609 if (FrameInfo.hasVarSizedObjects())
1610 return;
1611
1612 OutStreamer->pushSection();
1613 OutStreamer->switchSection(StackSizeSection);
1614
1615 const MCSymbol *FunctionSymbol = getFunctionBegin();
1616 uint64_t StackSize =
1617 FrameInfo.getStackSize() + FrameInfo.getUnsafeStackSize();
1618 OutStreamer->emitSymbolValue(FunctionSymbol, TM.getProgramPointerSize());
1619 OutStreamer->emitULEB128IntValue(StackSize);
1620
1621 OutStreamer->popSection();
1622}
1623
1625 const std::string &OutputFilename = MF.getTarget().Options.StackUsageOutput;
1626
1627 // OutputFilename empty implies -fstack-usage is not passed.
1628 if (OutputFilename.empty())
1629 return;
1630
1631 const MachineFrameInfo &FrameInfo = MF.getFrameInfo();
1632 uint64_t StackSize =
1633 FrameInfo.getStackSize() + FrameInfo.getUnsafeStackSize();
1634
1635 if (StackUsageStream == nullptr) {
1636 std::error_code EC;
1637 StackUsageStream =
1638 std::make_unique<raw_fd_ostream>(OutputFilename, EC, sys::fs::OF_Text);
1639 if (EC) {
1640 errs() << "Could not open file: " << EC.message();
1641 return;
1642 }
1643 }
1644
1645 if (const DISubprogram *DSP = MF.getFunction().getSubprogram())
1646 *StackUsageStream << DSP->getFilename() << ':' << DSP->getLine();
1647 else
1648 *StackUsageStream << MF.getFunction().getParent()->getName();
1649
1650 *StackUsageStream << ':' << MF.getName() << '\t' << StackSize << '\t';
1651 if (FrameInfo.hasVarSizedObjects())
1652 *StackUsageStream << "dynamic\n";
1653 else
1654 *StackUsageStream << "static\n";
1655}
1656
1657/// Extracts a generalized numeric type identifier of a Function's type from
1658/// type metadata. Returns null if metadata cannot be found.
1661 F.getMetadata(LLVMContext::MD_type, Types);
1662 for (const auto &Type : Types) {
1663 if (Type->hasGeneralizedMDString()) {
1664 MDString *MDGeneralizedTypeId = cast<MDString>(Type->getOperand(1));
1665 uint64_t TypeIdVal = llvm::MD5Hash(MDGeneralizedTypeId->getString());
1666 IntegerType *Int64Ty = Type::getInt64Ty(F.getContext());
1667 return ConstantInt::get(Int64Ty, TypeIdVal);
1668 }
1669 }
1670 return nullptr;
1671}
1672
1673/// Emits .callgraph section.
1675 FunctionInfo &FuncInfo) {
1677 return;
1678
1679 // Switch to the call graph section for the function
1680 MCSection *FuncCGSection =
1682 assert(FuncCGSection && "null callgraph section");
1683 OutStreamer->pushSection();
1684 OutStreamer->switchSection(FuncCGSection);
1685
1686 // Emit format version number.
1687 OutStreamer->emitInt64(CallGraphSectionFormatVersion::V_0);
1688
1689 // Emit function's self information, which is composed of:
1690 // 1) FunctionEntryPc
1691 // 2) FunctionKind: Whether the function is indirect target, and if so,
1692 // whether its type id is known.
1693 // 3) FunctionTypeId: Emit only when the function is an indirect target
1694 // and its type id is known.
1695
1696 // Emit function entry pc.
1697 const MCSymbol *FunctionSymbol = getFunctionBegin();
1698 OutStreamer->emitSymbolValue(FunctionSymbol, TM.getProgramPointerSize());
1699
1700 // If this function has external linkage or has its address taken and
1701 // it is not a callback, then anything could call it.
1702 const Function &F = MF.getFunction();
1703 bool IsIndirectTarget =
1704 !F.hasLocalLinkage() || F.hasAddressTaken(nullptr,
1705 /*IgnoreCallbackUses=*/true,
1706 /*IgnoreAssumeLikeCalls=*/true,
1707 /*IgnoreLLVMUsed=*/false);
1708
1709 // FIXME: FunctionKind takes a few values but emitted as a 64-bit value.
1710 // Can be optimized to occupy 2 bits instead.
1711 // Emit function kind, and type id if available.
1712 if (!IsIndirectTarget) {
1713 OutStreamer->emitInt64(
1714 static_cast<uint64_t>(FunctionInfo::FunctionKind::NOT_INDIRECT_TARGET));
1715 } else {
1716 if (const auto *TypeId = extractNumericCGTypeId(F)) {
1717 OutStreamer->emitInt64(static_cast<uint64_t>(
1718 FunctionInfo::FunctionKind::INDIRECT_TARGET_KNOWN_TID));
1719 OutStreamer->emitInt64(TypeId->getZExtValue());
1720 } else {
1721 OutStreamer->emitInt64(static_cast<uint64_t>(
1722 FunctionInfo::FunctionKind::INDIRECT_TARGET_UNKNOWN_TID));
1723 }
1724 }
1725
1726 // Emit callsite labels, where each element is a pair of type id and
1727 // indirect callsite pc.
1728 const auto &CallSiteLabels = FuncInfo.CallSiteLabels;
1729 OutStreamer->emitInt64(CallSiteLabels.size());
1730 for (const auto &[TypeId, Label] : CallSiteLabels) {
1731 OutStreamer->emitInt64(TypeId);
1732 OutStreamer->emitSymbolValue(Label, TM.getProgramPointerSize());
1733 }
1734 FuncInfo.CallSiteLabels.clear();
1735
1736 OutStreamer->popSection();
1737}
1738
1740 const MDNode &MD) {
1741 MCSymbol *S = MF.getContext().createTempSymbol("pcsection");
1742 OutStreamer->emitLabel(S);
1743 PCSectionsSymbols[&MD].emplace_back(S);
1744}
1745
1747 const Function &F = MF.getFunction();
1748 if (PCSectionsSymbols.empty() && !F.hasMetadata(LLVMContext::MD_pcsections))
1749 return;
1750
1752 const unsigned RelativeRelocSize =
1754 : 4;
1755
1756 // Switch to PCSection, short-circuiting the common case where the current
1757 // section is still valid (assume most MD_pcsections contain just 1 section).
1758 auto SwitchSection = [&, Prev = StringRef()](const StringRef &Sec) mutable {
1759 if (Sec == Prev)
1760 return;
1762 assert(S && "PC section is not initialized");
1763 OutStreamer->switchSection(S);
1764 Prev = Sec;
1765 };
1766 // Emit symbols into sections and data as specified in the pcsections MDNode.
1767 auto EmitForMD = [&](const MDNode &MD, ArrayRef<const MCSymbol *> Syms,
1768 bool Deltas) {
1769 // Expect the first operand to be a section name. After that, a tuple of
1770 // constants may appear, which will simply be emitted into the current
1771 // section (the user of MD_pcsections decides the format of encoded data).
1772 assert(isa<MDString>(MD.getOperand(0)) && "first operand not a string");
1773 bool ConstULEB128 = false;
1774 for (const MDOperand &MDO : MD.operands()) {
1775 if (auto *S = dyn_cast<MDString>(MDO)) {
1776 // Found string, start of new section!
1777 // Find options for this section "<section>!<opts>" - supported options:
1778 // C = Compress constant integers of size 2-8 bytes as ULEB128.
1779 const StringRef SecWithOpt = S->getString();
1780 const size_t OptStart = SecWithOpt.find('!'); // likely npos
1781 const StringRef Sec = SecWithOpt.substr(0, OptStart);
1782 const StringRef Opts = SecWithOpt.substr(OptStart); // likely empty
1783 ConstULEB128 = Opts.contains('C');
1784#ifndef NDEBUG
1785 for (char O : Opts)
1786 assert((O == '!' || O == 'C') && "Invalid !pcsections options");
1787#endif
1788 SwitchSection(Sec);
1789 const MCSymbol *Prev = Syms.front();
1790 for (const MCSymbol *Sym : Syms) {
1791 if (Sym == Prev || !Deltas) {
1792 // Use the entry itself as the base of the relative offset.
1793 MCSymbol *Base = MF.getContext().createTempSymbol("pcsection_base");
1794 OutStreamer->emitLabel(Base);
1795 // Emit relative relocation `addr - base`, which avoids a dynamic
1796 // relocation in the final binary. User will get the address with
1797 // `base + addr`.
1798 emitLabelDifference(Sym, Base, RelativeRelocSize);
1799 } else {
1800 // Emit delta between symbol and previous symbol.
1801 if (ConstULEB128)
1803 else
1804 emitLabelDifference(Sym, Prev, 4);
1805 }
1806 Prev = Sym;
1807 }
1808 } else {
1809 // Emit auxiliary data after PC.
1810 assert(isa<MDNode>(MDO) && "expecting either string or tuple");
1811 const auto *AuxMDs = cast<MDNode>(MDO);
1812 for (const MDOperand &AuxMDO : AuxMDs->operands()) {
1813 assert(isa<ConstantAsMetadata>(AuxMDO) && "expecting a constant");
1814 const Constant *C = cast<ConstantAsMetadata>(AuxMDO)->getValue();
1815 const DataLayout &DL = F.getDataLayout();
1816 const uint64_t Size = DL.getTypeStoreSize(C->getType());
1817
1818 if (auto *CI = dyn_cast<ConstantInt>(C);
1819 CI && ConstULEB128 && Size > 1 && Size <= 8) {
1820 emitULEB128(CI->getZExtValue());
1821 } else {
1823 }
1824 }
1825 }
1826 }
1827 };
1828
1829 OutStreamer->pushSection();
1830 // Emit PCs for function start and function size.
1831 if (const MDNode *MD = F.getMetadata(LLVMContext::MD_pcsections))
1832 EmitForMD(*MD, {getFunctionBegin(), getFunctionEnd()}, true);
1833 // Emit PCs for instructions collected.
1834 for (const auto &MS : PCSectionsSymbols)
1835 EmitForMD(*MS.first, MS.second, false);
1836 OutStreamer->popSection();
1837 PCSectionsSymbols.clear();
1838}
1839
1840/// Returns true if function begin and end labels should be emitted.
1841static bool needFuncLabels(const MachineFunction &MF, const AsmPrinter &Asm) {
1842 if (Asm.hasDebugInfo() || !MF.getLandingPads().empty() ||
1843 MF.hasEHFunclets() ||
1844 MF.getFunction().hasMetadata(LLVMContext::MD_pcsections))
1845 return true;
1846
1847 // We might emit an EH table that uses function begin and end labels even if
1848 // we don't have any landingpads.
1849 if (!MF.getFunction().hasPersonalityFn())
1850 return false;
1851 return !isNoOpWithoutInvoke(
1853}
1854
1855// Return the mnemonic of a MachineInstr if available, or the MachineInstr
1856// opcode name otherwise.
1858 const TargetInstrInfo *TII =
1859 MI.getParent()->getParent()->getSubtarget().getInstrInfo();
1860 MCInst MCI;
1861 MCI.setOpcode(MI.getOpcode());
1862 if (StringRef Name = Streamer.getMnemonic(MCI); !Name.empty())
1863 return Name;
1864 StringRef Name = TII->getName(MI.getOpcode());
1865 assert(!Name.empty() && "Missing mnemonic and name for opcode");
1866 return Name;
1867}
1868
1870 FunctionInfo &FuncInfo,
1871 const MachineFunction::CallSiteInfoMap &CallSitesInfoMap,
1872 const MachineInstr &MI) {
1873 // Only indirect calls have type identifiers set.
1874 const auto &CallSiteInfo = CallSitesInfoMap.find(&MI);
1875 if (CallSiteInfo == CallSitesInfoMap.end())
1876 return;
1877
1878 for (ConstantInt *CalleeTypeId : CallSiteInfo->second.CalleeTypeIds) {
1880 OutStreamer->emitLabel(S);
1881 uint64_t CalleeTypeIdVal = CalleeTypeId->getZExtValue();
1882 FuncInfo.CallSiteLabels.emplace_back(CalleeTypeIdVal, S);
1883 }
1884}
1885
1886/// EmitFunctionBody - This method emits the body and trailer for a
1887/// function.
1889 emitFunctionHeader();
1890
1891 // Emit target-specific gunk before the function body.
1893
1894 if (isVerbose()) {
1895 // Get MachineDominatorTree or compute it on the fly if it's unavailable
1896 auto MDTWrapper = getAnalysisIfAvailable<MachineDominatorTreeWrapperPass>();
1897 MDT = MDTWrapper ? &MDTWrapper->getDomTree() : nullptr;
1898 if (!MDT) {
1899 OwnedMDT = std::make_unique<MachineDominatorTree>();
1900 OwnedMDT->recalculate(*MF);
1901 MDT = OwnedMDT.get();
1902 }
1903
1904 // Get MachineLoopInfo or compute it on the fly if it's unavailable
1905 auto *MLIWrapper = getAnalysisIfAvailable<MachineLoopInfoWrapperPass>();
1906 MLI = MLIWrapper ? &MLIWrapper->getLI() : nullptr;
1907 if (!MLI) {
1908 OwnedMLI = std::make_unique<MachineLoopInfo>();
1909 OwnedMLI->analyze(*MDT);
1910 MLI = OwnedMLI.get();
1911 }
1912 }
1913
1914 // Print out code for the function.
1915 bool HasAnyRealCode = false;
1916 int NumInstsInFunction = 0;
1917 bool IsEHa = MMI->getModule()->getModuleFlag("eh-asynch");
1918
1919 const MCSubtargetInfo *STI = nullptr;
1920 if (this->MF)
1921 STI = &getSubtargetInfo();
1922 else
1923 STI = TM.getMCSubtargetInfo();
1924
1925 bool CanDoExtraAnalysis = ORE->allowExtraAnalysis(DEBUG_TYPE);
1926 // Create a slot for the entry basic block section so that the section
1927 // order is preserved when iterating over MBBSectionRanges.
1928 if (!MF->empty())
1931
1932 FunctionInfo FuncInfo;
1933 const auto &CallSitesInfoMap = MF->getCallSitesInfo();
1934 for (auto &MBB : *MF) {
1935 // Print a label for the basic block.
1937 DenseMap<StringRef, unsigned> MnemonicCounts;
1938 for (auto &MI : MBB) {
1939 // Print the assembly for the instruction.
1940 if (!MI.isPosition() && !MI.isImplicitDef() && !MI.isKill() &&
1941 !MI.isDebugInstr()) {
1942 HasAnyRealCode = true;
1943 }
1944
1945 // If there is a pre-instruction symbol, emit a label for it here.
1946 if (MCSymbol *S = MI.getPreInstrSymbol())
1947 OutStreamer->emitLabel(S);
1948
1949 if (MDNode *MD = MI.getPCSections())
1950 emitPCSectionsLabel(*MF, *MD);
1951
1952 for (auto &Handler : Handlers)
1953 Handler->beginInstruction(&MI);
1954
1955 if (isVerbose())
1956 emitComments(MI, STI, OutStreamer->getCommentOS());
1957
1958 switch (MI.getOpcode()) {
1959 case TargetOpcode::CFI_INSTRUCTION:
1961 break;
1962 case TargetOpcode::LOCAL_ESCAPE:
1964 break;
1965 case TargetOpcode::ANNOTATION_LABEL:
1966 case TargetOpcode::GC_LABEL:
1967 OutStreamer->emitLabel(MI.getOperand(0).getMCSymbol());
1968 break;
1969 case TargetOpcode::EH_LABEL:
1970 OutStreamer->AddComment("EH_LABEL");
1971 OutStreamer->emitLabel(MI.getOperand(0).getMCSymbol());
1972 // For AsynchEH, insert a Nop if followed by a trap inst
1973 // Or the exception won't be caught.
1974 // (see MCConstantExpr::create(1,..) in WinException.cpp)
1975 // Ignore SDiv/UDiv because a DIV with Const-0 divisor
1976 // must have being turned into an UndefValue.
1977 // Div with variable opnds won't be the first instruction in
1978 // an EH region as it must be led by at least a Load
1979 {
1980 auto MI2 = std::next(MI.getIterator());
1981 if (IsEHa && MI2 != MBB.end() &&
1982 (MI2->mayLoadOrStore() || MI2->mayRaiseFPException()))
1983 emitNops(1);
1984 }
1985 break;
1986 case TargetOpcode::INLINEASM:
1987 case TargetOpcode::INLINEASM_BR:
1988 emitInlineAsm(&MI);
1989 break;
1990 case TargetOpcode::DBG_VALUE:
1991 case TargetOpcode::DBG_VALUE_LIST:
1992 if (isVerbose()) {
1993 if (!emitDebugValueComment(&MI, *this))
1995 }
1996 break;
1997 case TargetOpcode::DBG_INSTR_REF:
1998 // This instruction reference will have been resolved to a machine
1999 // location, and a nearby DBG_VALUE created. We can safely ignore
2000 // the instruction reference.
2001 break;
2002 case TargetOpcode::DBG_PHI:
2003 // This instruction is only used to label a program point, it's purely
2004 // meta information.
2005 break;
2006 case TargetOpcode::DBG_LABEL:
2007 if (isVerbose()) {
2008 if (!emitDebugLabelComment(&MI, *this))
2010 }
2011 break;
2012 case TargetOpcode::IMPLICIT_DEF:
2013 if (isVerbose()) emitImplicitDef(&MI);
2014 break;
2015 case TargetOpcode::KILL:
2016 if (isVerbose()) emitKill(&MI, *this);
2017 break;
2018 case TargetOpcode::FAKE_USE:
2019 if (isVerbose())
2020 emitFakeUse(&MI, *this);
2021 break;
2022 case TargetOpcode::PSEUDO_PROBE:
2024 break;
2025 case TargetOpcode::ARITH_FENCE:
2026 if (isVerbose())
2027 OutStreamer->emitRawComment("ARITH_FENCE");
2028 break;
2029 case TargetOpcode::MEMBARRIER:
2030 OutStreamer->emitRawComment("MEMBARRIER");
2031 break;
2032 case TargetOpcode::JUMP_TABLE_DEBUG_INFO:
2033 // This instruction is only used to note jump table debug info, it's
2034 // purely meta information.
2035 break;
2036 case TargetOpcode::INIT_UNDEF:
2037 // This is only used to influence register allocation behavior, no
2038 // actual initialization is needed.
2039 break;
2040 default:
2042
2043 auto CountInstruction = [&](const MachineInstr &MI) {
2044 // Skip Meta instructions inside bundles.
2045 if (MI.isMetaInstruction())
2046 return;
2047 ++NumInstsInFunction;
2048 if (CanDoExtraAnalysis) {
2050 ++MnemonicCounts[Name];
2051 }
2052 };
2053 if (!MI.isBundle()) {
2054 CountInstruction(MI);
2055 break;
2056 }
2057 // Separately count all the instructions in a bundle.
2058 for (auto It = std::next(MI.getIterator());
2059 It != MBB.end() && It->isInsideBundle(); ++It) {
2060 CountInstruction(*It);
2061 }
2062 break;
2063 }
2064
2065 if (MI.isCall() && MF->getTarget().Options.BBAddrMap)
2067
2068 if (TM.Options.EmitCallGraphSection && MI.isCall())
2069 emitIndirectCalleeLabels(FuncInfo, CallSitesInfoMap, MI);
2070
2071 // If there is a post-instruction symbol, emit a label for it here.
2072 if (MCSymbol *S = MI.getPostInstrSymbol())
2073 OutStreamer->emitLabel(S);
2074
2075 for (auto &Handler : Handlers)
2076 Handler->endInstruction();
2077 }
2078
2079 // We must emit temporary symbol for the end of this basic block, if either
2080 // we have BBLabels enabled or if this basic blocks marks the end of a
2081 // section.
2082 if (MF->getTarget().Options.BBAddrMap ||
2084 OutStreamer->emitLabel(MBB.getEndSymbol());
2085
2086 if (MBB.isEndSection()) {
2087 // The size directive for the section containing the entry block is
2088 // handled separately by the function section.
2089 if (!MBB.sameSection(&MF->front())) {
2091 // Emit the size directive for the basic block section.
2092 const MCExpr *SizeExp = MCBinaryExpr::createSub(
2094 MCSymbolRefExpr::create(CurrentSectionBeginSym, OutContext),
2095 OutContext);
2096 OutStreamer->emitELFSize(CurrentSectionBeginSym, SizeExp);
2097 }
2098 assert(!MBBSectionRanges.contains(MBB.getSectionID()) &&
2099 "Overwrite section range");
2101 MBBSectionRange{CurrentSectionBeginSym, MBB.getEndSymbol()};
2102 }
2103 }
2105
2106 if (CanDoExtraAnalysis) {
2107 // Skip empty blocks.
2108 if (MBB.empty())
2109 continue;
2110
2112 MBB.begin()->getDebugLoc(), &MBB);
2113
2114 // Generate instruction mix remark. First, sort counts in descending order
2115 // by count and name.
2117 for (auto &KV : MnemonicCounts)
2118 MnemonicVec.emplace_back(KV.first, KV.second);
2119
2120 sort(MnemonicVec, [](const std::pair<StringRef, unsigned> &A,
2121 const std::pair<StringRef, unsigned> &B) {
2122 if (A.second > B.second)
2123 return true;
2124 if (A.second == B.second)
2125 return StringRef(A.first) < StringRef(B.first);
2126 return false;
2127 });
2128 R << "BasicBlock: " << ore::NV("BasicBlock", MBB.getName()) << "\n";
2129 for (auto &KV : MnemonicVec) {
2130 auto Name = (Twine("INST_") + getToken(KV.first.trim()).first).str();
2131 R << KV.first << ": " << ore::NV(Name, KV.second) << "\n";
2132 }
2133 ORE->emit(R);
2134 }
2135 }
2136
2137 EmittedInsts += NumInstsInFunction;
2138 MachineOptimizationRemarkAnalysis R(DEBUG_TYPE, "InstructionCount",
2140 &MF->front());
2141 R << ore::NV("NumInstructions", NumInstsInFunction)
2142 << " instructions in function";
2143 ORE->emit(R);
2144
2145 // If the function is empty and the object file uses .subsections_via_symbols,
2146 // then we need to emit *something* to the function body to prevent the
2147 // labels from collapsing together. Just emit a noop.
2148 // Similarly, don't emit empty functions on Windows either. It can lead to
2149 // duplicate entries (two functions with the same RVA) in the Guard CF Table
2150 // after linking, causing the kernel not to load the binary:
2151 // https://developercommunity.visualstudio.com/content/problem/45366/vc-linker-creates-invalid-dll-with-clang-cl.html
2152 // FIXME: Hide this behind some API in e.g. MCAsmInfo or MCTargetStreamer.
2153 const Triple &TT = TM.getTargetTriple();
2154 if (!HasAnyRealCode && (MAI->hasSubsectionsViaSymbols() ||
2155 (TT.isOSWindows() && TT.isOSBinFormatCOFF()))) {
2156 MCInst Noop = MF->getSubtarget().getInstrInfo()->getNop();
2157
2158 // Targets can opt-out of emitting the noop here by leaving the opcode
2159 // unspecified.
2160 if (Noop.getOpcode()) {
2161 OutStreamer->AddComment("avoids zero-length function");
2162 emitNops(1);
2163 }
2164 }
2165
2166 // Switch to the original section in case basic block sections was used.
2167 OutStreamer->switchSection(MF->getSection());
2168
2169 const Function &F = MF->getFunction();
2170 for (const auto &BB : F) {
2171 if (!BB.hasAddressTaken())
2172 continue;
2174 if (Sym->isDefined())
2175 continue;
2176 OutStreamer->AddComment("Address of block that was removed by CodeGen");
2177 OutStreamer->emitLabel(Sym);
2178 }
2179
2180 // Emit target-specific gunk after the function body.
2182
2183 // Even though wasm supports .type and .size in general, function symbols
2184 // are automatically sized.
2185 bool EmitFunctionSize = MAI->hasDotTypeDotSizeDirective() && !TT.isWasm();
2186
2187 // SPIR-V supports label instructions only inside a block, not after the
2188 // function body.
2189 if (TT.getObjectFormat() != Triple::SPIRV &&
2190 (EmitFunctionSize || needFuncLabels(*MF, *this))) {
2191 // Create a symbol for the end of function.
2192 CurrentFnEnd = createTempSymbol("func_end");
2193 OutStreamer->emitLabel(CurrentFnEnd);
2194 }
2195
2196 // If the target wants a .size directive for the size of the function, emit
2197 // it.
2198 if (EmitFunctionSize) {
2199 // We can get the size as difference between the function label and the
2200 // temp label.
2201 const MCExpr *SizeExp = MCBinaryExpr::createSub(
2202 MCSymbolRefExpr::create(CurrentFnEnd, OutContext),
2204 OutStreamer->emitELFSize(CurrentFnSym, SizeExp);
2206 OutStreamer->emitELFSize(CurrentFnBeginLocal, SizeExp);
2207 }
2208
2209 // Call endBasicBlockSection on the last block now, if it wasn't already
2210 // called.
2211 if (!MF->back().isEndSection()) {
2212 for (auto &Handler : Handlers)
2213 Handler->endBasicBlockSection(MF->back());
2214 for (auto &Handler : EHHandlers)
2215 Handler->endBasicBlockSection(MF->back());
2216 }
2217 for (auto &Handler : Handlers)
2218 Handler->markFunctionEnd();
2219 for (auto &Handler : EHHandlers)
2220 Handler->markFunctionEnd();
2221 // Update the end label of the entry block's section.
2222 MBBSectionRanges[MF->front().getSectionID()].EndLabel = CurrentFnEnd;
2223
2224 // Print out jump tables referenced by the function.
2226
2227 // Emit post-function debug and/or EH information.
2228 for (auto &Handler : Handlers)
2229 Handler->endFunction(MF);
2230 for (auto &Handler : EHHandlers)
2231 Handler->endFunction(MF);
2232
2233 // Emit section containing BB address offsets and their metadata, when
2234 // BB labels are requested for this function. Skip empty functions.
2235 if (HasAnyRealCode) {
2238 else if (PgoAnalysisMapFeatures.getBits() != 0)
2240 SMLoc(), "pgo-analysis-map is enabled for function " + MF->getName() +
2241 " but it does not have labels");
2242 }
2243
2244 // Emit sections containing instruction and function PCs.
2246
2247 // Emit section containing stack size metadata.
2249
2250 // Emit section containing call graph metadata.
2251 emitCallGraphSection(*MF, FuncInfo);
2252
2253 // Emit .su file containing function stack size information.
2255
2257
2258 if (isVerbose())
2259 OutStreamer->getCommentOS() << "-- End function\n";
2260
2261 OutStreamer->addBlankLine();
2262}
2263
2264/// Compute the number of Global Variables that uses a Constant.
2265static unsigned getNumGlobalVariableUses(const Constant *C,
2266 bool &HasNonGlobalUsers) {
2267 if (!C) {
2268 HasNonGlobalUsers = true;
2269 return 0;
2270 }
2271
2272 if (isa<GlobalVariable>(C))
2273 return 1;
2274
2275 unsigned NumUses = 0;
2276 for (const auto *CU : C->users())
2277 NumUses +=
2278 getNumGlobalVariableUses(dyn_cast<Constant>(CU), HasNonGlobalUsers);
2279
2280 return NumUses;
2281}
2282
2283/// Only consider global GOT equivalents if at least one user is a
2284/// cstexpr inside an initializer of another global variables. Also, don't
2285/// handle cstexpr inside instructions. During global variable emission,
2286/// candidates are skipped and are emitted later in case at least one cstexpr
2287/// isn't replaced by a PC relative GOT entry access.
2289 unsigned &NumGOTEquivUsers,
2290 bool &HasNonGlobalUsers) {
2291 // Global GOT equivalents are unnamed private globals with a constant
2292 // pointer initializer to another global symbol. They must point to a
2293 // GlobalVariable or Function, i.e., as GlobalValue.
2294 if (!GV->hasGlobalUnnamedAddr() || !GV->hasInitializer() ||
2295 !GV->isConstant() || !GV->isDiscardableIfUnused() ||
2296 !isa<GlobalValue>(GV->getOperand(0)))
2297 return false;
2298
2299 // To be a got equivalent, at least one of its users need to be a constant
2300 // expression used by another global variable.
2301 for (const auto *U : GV->users())
2302 NumGOTEquivUsers +=
2303 getNumGlobalVariableUses(dyn_cast<Constant>(U), HasNonGlobalUsers);
2304
2305 return NumGOTEquivUsers > 0;
2306}
2307
2308/// Unnamed constant global variables solely contaning a pointer to
2309/// another globals variable is equivalent to a GOT table entry; it contains the
2310/// the address of another symbol. Optimize it and replace accesses to these
2311/// "GOT equivalents" by using the GOT entry for the final global instead.
2312/// Compute GOT equivalent candidates among all global variables to avoid
2313/// emitting them if possible later on, after it use is replaced by a GOT entry
2314/// access.
2316 if (!getObjFileLowering().supportIndirectSymViaGOTPCRel())
2317 return;
2318
2319 for (const auto &G : M.globals()) {
2320 unsigned NumGOTEquivUsers = 0;
2321 bool HasNonGlobalUsers = false;
2322 if (!isGOTEquivalentCandidate(&G, NumGOTEquivUsers, HasNonGlobalUsers))
2323 continue;
2324 // If non-global variables use it, we still need to emit it.
2325 // Add 1 here, then emit it in `emitGlobalGOTEquivs`.
2326 if (HasNonGlobalUsers)
2327 NumGOTEquivUsers += 1;
2328 const MCSymbol *GOTEquivSym = getSymbol(&G);
2329 GlobalGOTEquivs[GOTEquivSym] = std::make_pair(&G, NumGOTEquivUsers);
2330 }
2331}
2332
2333/// Constant expressions using GOT equivalent globals may not be eligible
2334/// for PC relative GOT entry conversion, in such cases we need to emit such
2335/// globals we previously omitted in EmitGlobalVariable.
2337 if (!getObjFileLowering().supportIndirectSymViaGOTPCRel())
2338 return;
2339
2341 for (auto &I : GlobalGOTEquivs) {
2342 const GlobalVariable *GV = I.second.first;
2343 unsigned Cnt = I.second.second;
2344 if (Cnt)
2345 FailedCandidates.push_back(GV);
2346 }
2347 GlobalGOTEquivs.clear();
2348
2349 for (const auto *GV : FailedCandidates)
2351}
2352
2354 MCSymbol *Name = getSymbol(&GA);
2355 bool IsFunction = GA.getValueType()->isFunctionTy();
2356 // Treat bitcasts of functions as functions also. This is important at least
2357 // on WebAssembly where object and function addresses can't alias each other.
2358 if (!IsFunction)
2359 IsFunction = isa<Function>(GA.getAliasee()->stripPointerCasts());
2360
2361 // AIX's assembly directive `.set` is not usable for aliasing purpose,
2362 // so AIX has to use the extra-label-at-definition strategy. At this
2363 // point, all the extra label is emitted, we just have to emit linkage for
2364 // those labels.
2366 // Linkage for alias of global variable has been emitted.
2367 if (isa<GlobalVariable>(GA.getAliaseeObject()))
2368 return;
2369
2370 emitLinkage(&GA, Name);
2371 // If it's a function, also emit linkage for aliases of function entry
2372 // point.
2373 if (IsFunction)
2374 emitLinkage(&GA,
2375 getObjFileLowering().getFunctionEntryPointSymbol(&GA, TM));
2376 return;
2377 }
2378
2380 OutStreamer->emitSymbolAttribute(Name, MCSA_Global);
2381 else if (GA.hasWeakLinkage() || GA.hasLinkOnceLinkage())
2382 OutStreamer->emitSymbolAttribute(Name, MCSA_WeakReference);
2383 else
2384 assert(GA.hasLocalLinkage() && "Invalid alias linkage");
2385
2386 // Set the symbol type to function if the alias has a function type.
2387 // This affects codegen when the aliasee is not a function.
2388 if (IsFunction) {
2389 OutStreamer->emitSymbolAttribute(Name, MCSA_ELF_TypeFunction);
2391 OutStreamer->beginCOFFSymbolDef(Name);
2392 OutStreamer->emitCOFFSymbolStorageClass(
2397 OutStreamer->endCOFFSymbolDef();
2398 }
2399 }
2400
2402
2403 const MCExpr *Expr = lowerConstant(GA.getAliasee());
2404
2405 if (MAI->isMachO() && isa<MCBinaryExpr>(Expr))
2406 OutStreamer->emitSymbolAttribute(Name, MCSA_AltEntry);
2407
2408 // Emit the directives as assignments aka .set:
2409 OutStreamer->emitAssignment(Name, Expr);
2410 MCSymbol *LocalAlias = getSymbolPreferLocal(GA);
2411 if (LocalAlias != Name)
2412 OutStreamer->emitAssignment(LocalAlias, Expr);
2413
2414 // If the aliasee does not correspond to a symbol in the output, i.e. the
2415 // alias is not of an object or the aliased object is private, then set the
2416 // size of the alias symbol from the type of the alias. We don't do this in
2417 // other situations as the alias and aliasee having differing types but same
2418 // size may be intentional.
2419 const GlobalObject *BaseObject = GA.getAliaseeObject();
2421 (!BaseObject || BaseObject->hasPrivateLinkage())) {
2422 const DataLayout &DL = M.getDataLayout();
2423 uint64_t Size = DL.getTypeAllocSize(GA.getValueType());
2425 }
2426}
2427
2428void AsmPrinter::emitGlobalIFunc(Module &M, const GlobalIFunc &GI) {
2430 "IFunc is not supported on AIX.");
2431
2432 auto EmitLinkage = [&](MCSymbol *Sym) {
2434 OutStreamer->emitSymbolAttribute(Sym, MCSA_Global);
2435 else if (GI.hasWeakLinkage() || GI.hasLinkOnceLinkage())
2436 OutStreamer->emitSymbolAttribute(Sym, MCSA_WeakReference);
2437 else
2438 assert(GI.hasLocalLinkage() && "Invalid ifunc linkage");
2439 };
2440
2442 MCSymbol *Name = getSymbol(&GI);
2443 EmitLinkage(Name);
2444 OutStreamer->emitSymbolAttribute(Name, MCSA_ELF_TypeIndFunction);
2446
2447 // Emit the directives as assignments aka .set:
2448 const MCExpr *Expr = lowerConstant(GI.getResolver());
2449 OutStreamer->emitAssignment(Name, Expr);
2450 MCSymbol *LocalAlias = getSymbolPreferLocal(GI);
2451 if (LocalAlias != Name)
2452 OutStreamer->emitAssignment(LocalAlias, Expr);
2453
2454 return;
2455 }
2456
2458 reportFatalUsageError("IFuncs are not supported on this platform");
2459
2460 // On Darwin platforms, emit a manually-constructed .symbol_resolver that
2461 // implements the symbol resolution duties of the IFunc.
2462 //
2463 // Normally, this would be handled by linker magic, but unfortunately there
2464 // are a few limitations in ld64 and ld-prime's implementation of
2465 // .symbol_resolver that mean we can't always use them:
2466 //
2467 // * resolvers cannot be the target of an alias
2468 // * resolvers cannot have private linkage
2469 // * resolvers cannot have linkonce linkage
2470 // * resolvers cannot appear in executables
2471 // * resolvers cannot appear in bundles
2472 //
2473 // This works around that by emitting a close approximation of what the
2474 // linker would have done.
2475
2476 MCSymbol *LazyPointer =
2477 GetExternalSymbolSymbol(GI.getName() + ".lazy_pointer");
2478 MCSymbol *StubHelper = GetExternalSymbolSymbol(GI.getName() + ".stub_helper");
2479
2481
2482 const DataLayout &DL = M.getDataLayout();
2483 emitAlignment(Align(DL.getPointerSize()));
2484 OutStreamer->emitLabel(LazyPointer);
2485 emitVisibility(LazyPointer, GI.getVisibility());
2486 OutStreamer->emitValue(MCSymbolRefExpr::create(StubHelper, OutContext), 8);
2487
2489
2490 const TargetSubtargetInfo *STI =
2492 const TargetLowering *TLI = STI->getTargetLowering();
2493 Align TextAlign(TLI->getMinFunctionAlignment());
2494
2495 MCSymbol *Stub = getSymbol(&GI);
2496 EmitLinkage(Stub);
2497 OutStreamer->emitCodeAlignment(TextAlign, getIFuncMCSubtargetInfo());
2498 OutStreamer->emitLabel(Stub);
2499 emitVisibility(Stub, GI.getVisibility());
2500 emitMachOIFuncStubBody(M, GI, LazyPointer);
2501
2502 OutStreamer->emitCodeAlignment(TextAlign, getIFuncMCSubtargetInfo());
2503 OutStreamer->emitLabel(StubHelper);
2504 emitVisibility(StubHelper, GI.getVisibility());
2505 emitMachOIFuncStubHelperBody(M, GI, LazyPointer);
2506}
2507
2509 if (!RS.needsSection())
2510 return;
2511
2512 MCSection *RemarksSection =
2514 if (!RemarksSection) {
2515 OutContext.reportWarning(SMLoc(), "Current object file format does not "
2516 "support remarks sections. Use the yaml "
2517 "remark format instead.");
2518 return;
2519 }
2520
2521 remarks::RemarkSerializer &RemarkSerializer = RS.getSerializer();
2522
2523 std::optional<SmallString<128>> Filename;
2524 if (std::optional<StringRef> FilenameRef = RS.getFilename()) {
2525 Filename = *FilenameRef;
2526 sys::fs::make_absolute(*Filename);
2527 assert(!Filename->empty() && "The filename can't be empty.");
2528 }
2529
2530 std::string Buf;
2532 std::unique_ptr<remarks::MetaSerializer> MetaSerializer =
2533 Filename ? RemarkSerializer.metaSerializer(OS, Filename->str())
2534 : RemarkSerializer.metaSerializer(OS);
2535 MetaSerializer->emit();
2536
2537 // Switch to the remarks section.
2538 OutStreamer->switchSection(RemarksSection);
2539 OutStreamer->emitBinaryData(Buf);
2540}
2541
2543 const Constant *Initializer = G.getInitializer();
2544 return G.getParent()->getDataLayout().getTypeAllocSize(
2545 Initializer->getType());
2546}
2547
2549 // We used to do this in clang, but there are optimization passes that turn
2550 // non-constant globals into constants. So now, clang only tells us whether
2551 // it would *like* a global to be tagged, but we still make the decision here.
2552 //
2553 // For now, don't instrument constant data, as it'll be in .rodata anyway. It
2554 // may be worth instrumenting these in future to stop them from being used as
2555 // gadgets.
2556 if (G.getName().starts_with("llvm.") || G.isThreadLocal() || G.isConstant())
2557 return false;
2558
2559 // Globals can be placed implicitly or explicitly in sections. There's two
2560 // different types of globals that meet this criteria that cause problems:
2561 // 1. Function pointers that are going into various init arrays (either
2562 // explicitly through `__attribute__((section(<foo>)))` or implicitly
2563 // through `__attribute__((constructor)))`, such as ".(pre)init(_array)",
2564 // ".fini(_array)", ".ctors", and ".dtors". These function pointers end up
2565 // overaligned and overpadded, making iterating over them problematic, and
2566 // each function pointer is individually tagged (so the iteration over
2567 // them causes SIGSEGV/MTE[AS]ERR).
2568 // 2. Global variables put into an explicit section, where the section's name
2569 // is a valid C-style identifier. The linker emits a `__start_<name>` and
2570 // `__stop_<name>` symbol for the section, so that you can iterate over
2571 // globals within this section. Unfortunately, again, these globals would
2572 // be tagged and so iteration causes SIGSEGV/MTE[AS]ERR.
2573 //
2574 // To mitigate both these cases, and because specifying a section is rare
2575 // outside of these two cases, disable MTE protection for globals in any
2576 // section.
2577 if (G.hasSection())
2578 return false;
2579
2580 return globalSize(G) > 0;
2581}
2582
2584 uint64_t SizeInBytes = globalSize(*G);
2585
2586 uint64_t NewSize = alignTo(SizeInBytes, 16);
2587 if (SizeInBytes != NewSize) {
2588 // Pad the initializer out to the next multiple of 16 bytes.
2589 llvm::SmallVector<uint8_t> Init(NewSize - SizeInBytes, 0);
2590 Constant *Padding = ConstantDataArray::get(M.getContext(), Init);
2591 Constant *Initializer = G->getInitializer();
2592 Initializer = ConstantStruct::getAnon({Initializer, Padding});
2593 auto *NewGV = new GlobalVariable(
2594 M, Initializer->getType(), G->isConstant(), G->getLinkage(),
2595 Initializer, "", G, G->getThreadLocalMode(), G->getAddressSpace());
2596 NewGV->copyAttributesFrom(G);
2597 NewGV->setComdat(G->getComdat());
2598 NewGV->copyMetadata(G, 0);
2599
2600 NewGV->takeName(G);
2601 G->replaceAllUsesWith(NewGV);
2602 G->eraseFromParent();
2603 G = NewGV;
2604 }
2605
2606 if (G->getAlign().valueOrOne() < 16)
2607 G->setAlignment(Align(16));
2608
2609 // Ensure that tagged globals don't get merged by ICF - as they should have
2610 // different tags at runtime.
2611 G->setUnnamedAddr(GlobalValue::UnnamedAddr::None);
2612}
2613
2615 auto Meta = G.getSanitizerMetadata();
2616 Meta.Memtag = false;
2617 G.setSanitizerMetadata(Meta);
2618}
2619
2621 // Set the MachineFunction to nullptr so that we can catch attempted
2622 // accesses to MF specific features at the module level and so that
2623 // we can conditionalize accesses based on whether or not it is nullptr.
2624 MF = nullptr;
2625
2626 std::vector<GlobalVariable *> GlobalsToTag;
2627 for (GlobalVariable &G : M.globals()) {
2628 if (G.isDeclaration() || !G.isTagged())
2629 continue;
2630 if (!shouldTagGlobal(G)) {
2631 assert(G.hasSanitizerMetadata()); // because isTagged.
2633 assert(!G.isTagged());
2634 continue;
2635 }
2636 GlobalsToTag.push_back(&G);
2637 }
2638 for (GlobalVariable *G : GlobalsToTag)
2640
2641 // Gather all GOT equivalent globals in the module. We really need two
2642 // passes over the globals: one to compute and another to avoid its emission
2643 // in EmitGlobalVariable, otherwise we would not be able to handle cases
2644 // where the got equivalent shows up before its use.
2646
2647 // Emit global variables.
2648 for (const auto &G : M.globals())
2650
2651 // Emit remaining GOT equivalent globals.
2653
2655
2656 // Emit linkage(XCOFF) and visibility info for declarations
2657 for (const Function &F : M) {
2658 if (!F.isDeclarationForLinker())
2659 continue;
2660
2661 MCSymbol *Name = getSymbol(&F);
2662 // Function getSymbol gives us the function descriptor symbol for XCOFF.
2663
2665 GlobalValue::VisibilityTypes V = F.getVisibility();
2667 continue;
2668
2669 emitVisibility(Name, V, false);
2670 continue;
2671 }
2672
2673 if (F.isIntrinsic())
2674 continue;
2675
2676 // Handle the XCOFF case.
2677 // Variable `Name` is the function descriptor symbol (see above). Get the
2678 // function entry point symbol.
2679 MCSymbol *FnEntryPointSym = TLOF.getFunctionEntryPointSymbol(&F, TM);
2680 // Emit linkage for the function entry point.
2681 emitLinkage(&F, FnEntryPointSym);
2682
2683 // If a function's address is taken, which means it may be called via a
2684 // function pointer, we need the function descriptor for it.
2685 if (F.hasAddressTaken())
2686 emitLinkage(&F, Name);
2687 }
2688
2689 // Emit the remarks section contents.
2690 // FIXME: Figure out when is the safest time to emit this section. It should
2691 // not come after debug info.
2692 if (remarks::RemarkStreamer *RS = M.getContext().getMainRemarkStreamer())
2693 emitRemarksSection(*RS);
2694
2696
2699
2700 // Output stubs for external and common global variables.
2702 if (!Stubs.empty()) {
2703 OutStreamer->switchSection(TLOF.getDataSection());
2704 const DataLayout &DL = M.getDataLayout();
2705
2706 emitAlignment(Align(DL.getPointerSize()));
2707 for (const auto &Stub : Stubs) {
2708 OutStreamer->emitLabel(Stub.first);
2709 OutStreamer->emitSymbolValue(Stub.second.getPointer(),
2710 DL.getPointerSize());
2711 }
2712 }
2713 }
2714
2716 MachineModuleInfoCOFF &MMICOFF =
2718
2719 // Output stubs for external and common global variables.
2721 if (!Stubs.empty()) {
2722 const DataLayout &DL = M.getDataLayout();
2723
2724 for (const auto &Stub : Stubs) {
2726 SectionName += Stub.first->getName();
2727 OutStreamer->switchSection(OutContext.getCOFFSection(
2731 Stub.first->getName(), COFF::IMAGE_COMDAT_SELECT_ANY));
2732 emitAlignment(Align(DL.getPointerSize()));
2733 OutStreamer->emitSymbolAttribute(Stub.first, MCSA_Global);
2734 OutStreamer->emitLabel(Stub.first);
2735 OutStreamer->emitSymbolValue(Stub.second.getPointer(),
2736 DL.getPointerSize());
2737 }
2738 }
2739 }
2740
2741 // This needs to happen before emitting debug information since that can end
2742 // arbitrary sections.
2743 if (auto *TS = OutStreamer->getTargetStreamer())
2744 TS->emitConstantPools();
2745
2746 // Emit Stack maps before any debug info. Mach-O requires that no data or
2747 // text sections come after debug info has been emitted. This matters for
2748 // stack maps as they are arbitrary data, and may even have a custom format
2749 // through user plugins.
2750 emitStackMaps();
2751
2752 // Print aliases in topological order, that is, for each alias a = b,
2753 // b must be printed before a.
2754 // This is because on some targets (e.g. PowerPC) linker expects aliases in
2755 // such an order to generate correct TOC information.
2758 for (const auto &Alias : M.aliases()) {
2759 if (Alias.hasAvailableExternallyLinkage())
2760 continue;
2761 for (const GlobalAlias *Cur = &Alias; Cur;
2762 Cur = dyn_cast<GlobalAlias>(Cur->getAliasee())) {
2763 if (!AliasVisited.insert(Cur).second)
2764 break;
2765 AliasStack.push_back(Cur);
2766 }
2767 for (const GlobalAlias *AncestorAlias : llvm::reverse(AliasStack))
2768 emitGlobalAlias(M, *AncestorAlias);
2769 AliasStack.clear();
2770 }
2771
2772 // IFuncs must come before deubginfo in case the backend decides to emit them
2773 // as actual functions, since on Mach-O targets, we cannot create regular
2774 // sections after DWARF.
2775 for (const auto &IFunc : M.ifuncs())
2776 emitGlobalIFunc(M, IFunc);
2777
2778 // Finalize debug and EH information.
2779 for (auto &Handler : Handlers)
2780 Handler->endModule();
2781 for (auto &Handler : EHHandlers)
2782 Handler->endModule();
2783
2784 // This deletes all the ephemeral handlers that AsmPrinter added, while
2785 // keeping all the user-added handlers alive until the AsmPrinter is
2786 // destroyed.
2787 EHHandlers.clear();
2788 Handlers.erase(Handlers.begin() + NumUserHandlers, Handlers.end());
2789 DD = nullptr;
2790
2791 // If the target wants to know about weak references, print them all.
2792 if (MAI->getWeakRefDirective()) {
2793 // FIXME: This is not lazy, it would be nice to only print weak references
2794 // to stuff that is actually used. Note that doing so would require targets
2795 // to notice uses in operands (due to constant exprs etc). This should
2796 // happen with the MC stuff eventually.
2797
2798 // Print out module-level global objects here.
2799 for (const auto &GO : M.global_objects()) {
2800 if (!GO.hasExternalWeakLinkage())
2801 continue;
2802 OutStreamer->emitSymbolAttribute(getSymbol(&GO), MCSA_WeakReference);
2803 }
2805 auto SymbolName = "swift_async_extendedFramePointerFlags";
2806 auto Global = M.getGlobalVariable(SymbolName);
2807 if (!Global) {
2808 auto PtrTy = PointerType::getUnqual(M.getContext());
2809 Global = new GlobalVariable(M, PtrTy, false,
2811 SymbolName);
2812 OutStreamer->emitSymbolAttribute(getSymbol(Global), MCSA_WeakReference);
2813 }
2814 }
2815 }
2816
2817 GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
2818 assert(MI && "AsmPrinter didn't require GCModuleInfo?");
2819 for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; )
2820 if (GCMetadataPrinter *MP = getOrCreateGCPrinter(**--I))
2821 MP->finishAssembly(M, *MI, *this);
2822
2823 // Emit llvm.ident metadata in an '.ident' directive.
2824 emitModuleIdents(M);
2825
2826 // Emit bytes for llvm.commandline metadata.
2827 // The command line metadata is emitted earlier on XCOFF.
2829 emitModuleCommandLines(M);
2830
2831 // Emit .note.GNU-split-stack and .note.GNU-no-split-stack sections if
2832 // split-stack is used.
2833 if (TM.getTargetTriple().isOSBinFormatELF() && HasSplitStack) {
2834 OutStreamer->switchSection(OutContext.getELFSection(".note.GNU-split-stack",
2835 ELF::SHT_PROGBITS, 0));
2836 if (HasNoSplitStack)
2837 OutStreamer->switchSection(OutContext.getELFSection(
2838 ".note.GNU-no-split-stack", ELF::SHT_PROGBITS, 0));
2839 }
2840
2841 // If we don't have any trampolines, then we don't require stack memory
2842 // to be executable. Some targets have a directive to declare this.
2843 Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline");
2844 if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty())
2846 OutStreamer->switchSection(S);
2847
2848 if (TM.Options.EmitAddrsig) {
2849 // Emit address-significance attributes for all globals.
2850 OutStreamer->emitAddrsig();
2851 for (const GlobalValue &GV : M.global_values()) {
2852 if (!GV.use_empty() && !GV.isThreadLocal() &&
2853 !GV.hasDLLImportStorageClass() &&
2854 !GV.getName().starts_with("llvm.") &&
2855 !GV.hasAtLeastLocalUnnamedAddr())
2856 OutStreamer->emitAddrsigSym(getSymbol(&GV));
2857 }
2858 }
2859
2860 // Emit symbol partition specifications (ELF only).
2862 unsigned UniqueID = 0;
2863 for (const GlobalValue &GV : M.global_values()) {
2864 if (!GV.hasPartition() || GV.isDeclarationForLinker() ||
2865 GV.getVisibility() != GlobalValue::DefaultVisibility)
2866 continue;
2867
2868 OutStreamer->switchSection(
2869 OutContext.getELFSection(".llvm_sympart", ELF::SHT_LLVM_SYMPART, 0, 0,
2870 "", false, ++UniqueID, nullptr));
2871 OutStreamer->emitBytes(GV.getPartition());
2872 OutStreamer->emitZeros(1);
2873 OutStreamer->emitValue(
2876 }
2877 }
2878
2879 // Allow the target to emit any magic that it wants at the end of the file,
2880 // after everything else has gone out.
2882
2883 MMI = nullptr;
2884 AddrLabelSymbols = nullptr;
2885
2886 OutStreamer->finish();
2887 OutStreamer->reset();
2888 OwnedMLI.reset();
2889 OwnedMDT.reset();
2890
2891 return false;
2892}
2893
2895 auto Res = MBBSectionExceptionSyms.try_emplace(MBB.getSectionID());
2896 if (Res.second)
2897 Res.first->second = createTempSymbol("exception");
2898 return Res.first->second;
2899}
2900
2902 MCContext &Ctx = MF->getContext();
2904 "_" + Twine(MBB.getNumber()) + "_CS");
2905 CurrentFnCallsiteEndSymbols[&MBB].push_back(Sym);
2906 return Sym;
2907}
2908
2910 this->MF = &MF;
2911 const Function &F = MF.getFunction();
2912
2913 // Record that there are split-stack functions, so we will emit a special
2914 // section to tell the linker.
2915 if (MF.shouldSplitStack()) {
2916 HasSplitStack = true;
2917
2919 HasNoSplitStack = true;
2920 } else
2921 HasNoSplitStack = true;
2922
2923 // Get the function symbol.
2924 if (!MAI->isAIX()) {
2926 } else {
2928 "Only AIX uses the function descriptor hooks.");
2929 // AIX is unique here in that the name of the symbol emitted for the
2930 // function body does not have the same name as the source function's
2931 // C-linkage name.
2932 assert(CurrentFnDescSym && "The function descriptor symbol needs to be"
2933 " initalized first.");
2934
2935 // Get the function entry point symbol.
2937 }
2938
2940 CurrentFnBegin = nullptr;
2941 CurrentFnBeginLocal = nullptr;
2942 CurrentSectionBeginSym = nullptr;
2944 MBBSectionRanges.clear();
2945 MBBSectionExceptionSyms.clear();
2946 bool NeedsLocalForSize = MAI->needsLocalForSize();
2947 if (F.hasFnAttribute("patchable-function-entry") ||
2948 F.hasFnAttribute("function-instrument") ||
2949 F.hasFnAttribute("xray-instruction-threshold") ||
2950 needFuncLabels(MF, *this) || NeedsLocalForSize ||
2954 CurrentFnBegin = createTempSymbol("func_begin");
2955 if (NeedsLocalForSize)
2957 }
2958
2959 ORE = &getAnalysis<MachineOptimizationRemarkEmitterPass>().getORE();
2960}
2961
2962namespace {
2963
2964// Keep track the alignment, constpool entries per Section.
2965 struct SectionCPs {
2966 MCSection *S;
2967 Align Alignment;
2969
2970 SectionCPs(MCSection *s, Align a) : S(s), Alignment(a) {}
2971 };
2972
2973} // end anonymous namespace
2974
2978
2979 return "";
2980}
2981
2982/// EmitConstantPool - Print to the current output stream assembly
2983/// representations of the constants in the constant pool MCP. This is
2984/// used to print out constants which have been "spilled to memory" by
2985/// the code generator.
2987 const MachineConstantPool *MCP = MF->getConstantPool();
2988 const std::vector<MachineConstantPoolEntry> &CP = MCP->getConstants();
2989 if (CP.empty()) return;
2990
2991 // Calculate sections for constant pool entries. We collect entries to go into
2992 // the same section together to reduce amount of section switch statements.
2993 SmallVector<SectionCPs, 4> CPSections;
2994 for (unsigned i = 0, e = CP.size(); i != e; ++i) {
2995 const MachineConstantPoolEntry &CPE = CP[i];
2996 Align Alignment = CPE.getAlign();
2997
2999
3000 const Constant *C = nullptr;
3001 if (!CPE.isMachineConstantPoolEntry())
3002 C = CPE.Val.ConstVal;
3003
3005 getDataLayout(), Kind, C, Alignment, getConstantSectionSuffix(C));
3006
3007 // The number of sections are small, just do a linear search from the
3008 // last section to the first.
3009 bool Found = false;
3010 unsigned SecIdx = CPSections.size();
3011 while (SecIdx != 0) {
3012 if (CPSections[--SecIdx].S == S) {
3013 Found = true;
3014 break;
3015 }
3016 }
3017 if (!Found) {
3018 SecIdx = CPSections.size();
3019 CPSections.push_back(SectionCPs(S, Alignment));
3020 }
3021
3022 if (Alignment > CPSections[SecIdx].Alignment)
3023 CPSections[SecIdx].Alignment = Alignment;
3024 CPSections[SecIdx].CPEs.push_back(i);
3025 }
3026
3027 // Now print stuff into the calculated sections.
3028 const MCSection *CurSection = nullptr;
3029 unsigned Offset = 0;
3030 for (const SectionCPs &CPSection : CPSections) {
3031 for (unsigned CPI : CPSection.CPEs) {
3032 MCSymbol *Sym = GetCPISymbol(CPI);
3033 if (!Sym->isUndefined())
3034 continue;
3035
3036 if (CurSection != CPSection.S) {
3037 OutStreamer->switchSection(CPSection.S);
3038 emitAlignment(Align(CPSection.Alignment));
3039 CurSection = CPSection.S;
3040 Offset = 0;
3041 }
3042
3043 MachineConstantPoolEntry CPE = CP[CPI];
3044
3045 // Emit inter-object padding for alignment.
3046 unsigned NewOffset = alignTo(Offset, CPE.getAlign());
3047 OutStreamer->emitZeros(NewOffset - Offset);
3048
3049 Offset = NewOffset + CPE.getSizeInBytes(getDataLayout());
3050
3051 OutStreamer->emitLabel(Sym);
3054 else
3056 }
3057 }
3058}
3059
3060// Print assembly representations of the jump tables used by the current
3061// function.
3063 const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
3064 if (!MJTI) return;
3065
3066 const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
3067 if (JT.empty()) return;
3068
3070 emitJumpTableImpl(*MJTI, llvm::to_vector(llvm::seq<unsigned>(JT.size())));
3071 return;
3072 }
3073
3074 SmallVector<unsigned> HotJumpTableIndices, ColdJumpTableIndices;
3075 // When static data partitioning is enabled, collect jump table entries that
3076 // go into the same section together to reduce the amount of section switch
3077 // statements.
3078 for (unsigned JTI = 0, JTSize = JT.size(); JTI < JTSize; ++JTI) {
3079 if (JT[JTI].Hotness == MachineFunctionDataHotness::Cold) {
3080 ColdJumpTableIndices.push_back(JTI);
3081 } else {
3082 HotJumpTableIndices.push_back(JTI);
3083 }
3084 }
3085
3086 emitJumpTableImpl(*MJTI, HotJumpTableIndices);
3087 emitJumpTableImpl(*MJTI, ColdJumpTableIndices);
3088}
3089
3090void AsmPrinter::emitJumpTableImpl(const MachineJumpTableInfo &MJTI,
3091 ArrayRef<unsigned> JumpTableIndices) {
3093 JumpTableIndices.empty())
3094 return;
3095
3097 const Function &F = MF->getFunction();
3098 const std::vector<MachineJumpTableEntry> &JT = MJTI.getJumpTables();
3099 MCSection *JumpTableSection = nullptr;
3100
3101 const bool UseLabelDifference =
3104 // Pick the directive to use to print the jump table entries, and switch to
3105 // the appropriate section.
3106 const bool JTInDiffSection =
3107 !TLOF.shouldPutJumpTableInFunctionSection(UseLabelDifference, F);
3108 if (JTInDiffSection) {
3110 JumpTableSection =
3111 TLOF.getSectionForJumpTable(F, TM, &JT[JumpTableIndices.front()]);
3112 } else {
3113 JumpTableSection = TLOF.getSectionForJumpTable(F, TM);
3114 }
3115 OutStreamer->switchSection(JumpTableSection);
3116 }
3117
3118 const DataLayout &DL = MF->getDataLayout();
3120
3121 // Jump tables in code sections are marked with a data_region directive
3122 // where that's supported.
3123 if (!JTInDiffSection)
3124 OutStreamer->emitDataRegion(MCDR_DataRegionJT32);
3125
3126 for (const unsigned JumpTableIndex : JumpTableIndices) {
3127 ArrayRef<MachineBasicBlock *> JTBBs = JT[JumpTableIndex].MBBs;
3128
3129 // If this jump table was deleted, ignore it.
3130 if (JTBBs.empty())
3131 continue;
3132
3133 // For the EK_LabelDifference32 entry, if using .set avoids a relocation,
3134 /// emit a .set directive for each unique entry.
3139 const MCExpr *Base =
3140 TLI->getPICJumpTableRelocBaseExpr(MF, JumpTableIndex, OutContext);
3141 for (const MachineBasicBlock *MBB : JTBBs) {
3142 if (!EmittedSets.insert(MBB).second)
3143 continue;
3144
3145 // .set LJTSet, LBB32-base
3146 const MCExpr *LHS =
3148 OutStreamer->emitAssignment(
3149 GetJTSetSymbol(JumpTableIndex, MBB->getNumber()),
3151 }
3152 }
3153
3154 // On some targets (e.g. Darwin) we want to emit two consecutive labels
3155 // before each jump table. The first label is never referenced, but tells
3156 // the assembler and linker the extents of the jump table object. The
3157 // second label is actually referenced by the code.
3158 if (JTInDiffSection && DL.hasLinkerPrivateGlobalPrefix())
3159 // FIXME: This doesn't have to have any specific name, just any randomly
3160 // named and numbered local label started with 'l' would work. Simplify
3161 // GetJTISymbol.
3162 OutStreamer->emitLabel(GetJTISymbol(JumpTableIndex, true));
3163
3164 MCSymbol *JTISymbol = GetJTISymbol(JumpTableIndex);
3165 OutStreamer->emitLabel(JTISymbol);
3166
3167 // Defer MCAssembler based constant folding due to a performance issue. The
3168 // label differences will be evaluated at write time.
3169 for (const MachineBasicBlock *MBB : JTBBs)
3170 emitJumpTableEntry(MJTI, MBB, JumpTableIndex);
3171 }
3172
3174 emitJumpTableSizesSection(MJTI, MF->getFunction());
3175
3176 if (!JTInDiffSection)
3177 OutStreamer->emitDataRegion(MCDR_DataRegionEnd);
3178}
3179
3180void AsmPrinter::emitJumpTableSizesSection(const MachineJumpTableInfo &MJTI,
3181 const Function &F) const {
3182 const std::vector<MachineJumpTableEntry> &JT = MJTI.getJumpTables();
3183
3184 if (JT.empty())
3185 return;
3186
3187 StringRef GroupName = F.hasComdat() ? F.getComdat()->getName() : "";
3188 MCSection *JumpTableSizesSection = nullptr;
3189 StringRef sectionName = ".llvm_jump_table_sizes";
3190
3191 bool isElf = TM.getTargetTriple().isOSBinFormatELF();
3192 bool isCoff = TM.getTargetTriple().isOSBinFormatCOFF();
3193
3194 if (!isCoff && !isElf)
3195 return;
3196
3197 if (isElf) {
3198 auto *LinkedToSym = static_cast<MCSymbolELF *>(CurrentFnSym);
3199 int Flags = F.hasComdat() ? static_cast<int>(ELF::SHF_GROUP) : 0;
3200
3201 JumpTableSizesSection = OutContext.getELFSection(
3202 sectionName, ELF::SHT_LLVM_JT_SIZES, Flags, 0, GroupName, F.hasComdat(),
3203 MCSection::NonUniqueID, LinkedToSym);
3204 } else if (isCoff) {
3205 if (F.hasComdat()) {
3206 JumpTableSizesSection = OutContext.getCOFFSection(
3207 sectionName,
3210 F.getComdat()->getName(), COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE);
3211 } else {
3212 JumpTableSizesSection = OutContext.getCOFFSection(
3216 }
3217 }
3218
3219 OutStreamer->switchSection(JumpTableSizesSection);
3220
3221 for (unsigned JTI = 0, E = JT.size(); JTI != E; ++JTI) {
3222 const std::vector<MachineBasicBlock *> &JTBBs = JT[JTI].MBBs;
3223 OutStreamer->emitSymbolValue(GetJTISymbol(JTI), TM.getProgramPointerSize());
3224 OutStreamer->emitIntValue(JTBBs.size(), TM.getProgramPointerSize());
3225 }
3226}
3227
3228/// EmitJumpTableEntry - Emit a jump table entry for the specified MBB to the
3229/// current stream.
3231 const MachineBasicBlock *MBB,
3232 unsigned UID) const {
3233 assert(MBB && MBB->getNumber() >= 0 && "Invalid basic block");
3234 const MCExpr *Value = nullptr;
3235 switch (MJTI.getEntryKind()) {
3237 llvm_unreachable("Cannot emit EK_Inline jump table entry");
3240 llvm_unreachable("MIPS specific");
3243 &MJTI, MBB, UID, OutContext);
3244 break;
3246 // EK_BlockAddress - Each entry is a plain address of block, e.g.:
3247 // .word LBB123
3249 break;
3250
3253 // Each entry is the address of the block minus the address of the jump
3254 // table. This is used for PIC jump tables where gprel32 is not supported.
3255 // e.g.:
3256 // .word LBB123 - LJTI1_2
3257 // If the .set directive avoids relocations, this is emitted as:
3258 // .set L4_5_set_123, LBB123 - LJTI1_2
3259 // .word L4_5_set_123
3263 OutContext);
3264 break;
3265 }
3270 break;
3271 }
3272 }
3273
3274 assert(Value && "Unknown entry kind!");
3275
3276 unsigned EntrySize = MJTI.getEntrySize(getDataLayout());
3277 OutStreamer->emitValue(Value, EntrySize);
3278}
3279
3280/// EmitSpecialLLVMGlobal - Check to see if the specified global is a
3281/// special global used by LLVM. If so, emit it and return true, otherwise
3282/// do nothing and return false.
3284 if (GV->getName() == "llvm.used") {
3285 if (MAI->hasNoDeadStrip()) // No need to emit this at all.
3286 emitLLVMUsedList(cast<ConstantArray>(GV->getInitializer()));
3287 return true;
3288 }
3289
3290 // Ignore debug and non-emitted data. This handles llvm.compiler.used.
3291 if (GV->getSection() == "llvm.metadata" ||
3293 return true;
3294
3295 if (GV->getName() == "llvm.arm64ec.symbolmap") {
3296 // For ARM64EC, print the table that maps between symbols and the
3297 // corresponding thunks to translate between x64 and AArch64 code.
3298 // This table is generated by AArch64Arm64ECCallLowering.
3299 OutStreamer->switchSection(
3301 auto *Arr = cast<ConstantArray>(GV->getInitializer());
3302 for (auto &U : Arr->operands()) {
3303 auto *C = cast<Constant>(U);
3304 auto *Src = cast<GlobalValue>(C->getOperand(0)->stripPointerCasts());
3305 auto *Dst = cast<GlobalValue>(C->getOperand(1)->stripPointerCasts());
3306 int Kind = cast<ConstantInt>(C->getOperand(2))->getZExtValue();
3307
3308 if (Src->hasDLLImportStorageClass()) {
3309 // For now, we assume dllimport functions aren't directly called.
3310 // (We might change this later to match MSVC.)
3311 OutStreamer->emitCOFFSymbolIndex(
3312 OutContext.getOrCreateSymbol("__imp_" + Src->getName()));
3313 OutStreamer->emitCOFFSymbolIndex(getSymbol(Dst));
3314 OutStreamer->emitInt32(Kind);
3315 } else {
3316 // FIXME: For non-dllimport functions, MSVC emits the same entry
3317 // twice, for reasons I don't understand. I have to assume the linker
3318 // ignores the redundant entry; there aren't any reasonable semantics
3319 // to attach to it.
3320 OutStreamer->emitCOFFSymbolIndex(getSymbol(Src));
3321 OutStreamer->emitCOFFSymbolIndex(getSymbol(Dst));
3322 OutStreamer->emitInt32(Kind);
3323 }
3324 }
3325 return true;
3326 }
3327
3328 if (!GV->hasAppendingLinkage()) return false;
3329
3330 assert(GV->hasInitializer() && "Not a special LLVM global!");
3331
3332 if (GV->getName() == "llvm.global_ctors") {
3334 /* isCtor */ true);
3335
3336 return true;
3337 }
3338
3339 if (GV->getName() == "llvm.global_dtors") {
3341 /* isCtor */ false);
3342
3343 return true;
3344 }
3345
3346 GV->getContext().emitError(
3347 "unknown special variable with appending linkage: " +
3348 GV->getNameOrAsOperand());
3349 return true;
3350}
3351
3352/// EmitLLVMUsedList - For targets that define a MAI::UsedDirective, mark each
3353/// global in the specified llvm.used list.
3354void AsmPrinter::emitLLVMUsedList(const ConstantArray *InitList) {
3355 // Should be an array of 'i8*'.
3356 for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {
3357 const GlobalValue *GV =
3358 dyn_cast<GlobalValue>(InitList->getOperand(i)->stripPointerCasts());
3359 if (GV)
3360 OutStreamer->emitSymbolAttribute(getSymbol(GV), MCSA_NoDeadStrip);
3361 }
3362}
3363
3365 const Constant *List,
3366 SmallVector<Structor, 8> &Structors) {
3367 // Should be an array of '{ i32, void ()*, i8* }' structs. The first value is
3368 // the init priority.
3369 if (!isa<ConstantArray>(List))
3370 return;
3371
3372 // Gather the structors in a form that's convenient for sorting by priority.
3373 for (Value *O : cast<ConstantArray>(List)->operands()) {
3374 auto *CS = cast<ConstantStruct>(O);
3375 if (CS->getOperand(1)->isNullValue())
3376 break; // Found a null terminator, skip the rest.
3377 ConstantInt *Priority = dyn_cast<ConstantInt>(CS->getOperand(0));
3378 if (!Priority)
3379 continue; // Malformed.
3380 Structors.push_back(Structor());
3381 Structor &S = Structors.back();
3382 S.Priority = Priority->getLimitedValue(65535);
3383 S.Func = CS->getOperand(1);
3384 if (!CS->getOperand(2)->isNullValue()) {
3385 if (TM.getTargetTriple().isOSAIX()) {
3386 CS->getContext().emitError(
3387 "associated data of XXStructor list is not yet supported on AIX");
3388 }
3389
3390 S.ComdatKey =
3391 dyn_cast<GlobalValue>(CS->getOperand(2)->stripPointerCasts());
3392 }
3393 }
3394
3395 // Emit the function pointers in the target-specific order
3396 llvm::stable_sort(Structors, [](const Structor &L, const Structor &R) {
3397 return L.Priority < R.Priority;
3398 });
3399}
3400
3401/// EmitXXStructorList - Emit the ctor or dtor list taking into account the init
3402/// priority.
3404 bool IsCtor) {
3405 SmallVector<Structor, 8> Structors;
3406 preprocessXXStructorList(DL, List, Structors);
3407 if (Structors.empty())
3408 return;
3409
3410 // Emit the structors in reverse order if we are using the .ctor/.dtor
3411 // initialization scheme.
3412 if (!TM.Options.UseInitArray)
3413 std::reverse(Structors.begin(), Structors.end());
3414
3415 const Align Align = DL.getPointerPrefAlignment();
3416 for (Structor &S : Structors) {
3418 const MCSymbol *KeySym = nullptr;
3419 if (GlobalValue *GV = S.ComdatKey) {
3420 if (GV->isDeclarationForLinker())
3421 // If the associated variable is not defined in this module
3422 // (it might be available_externally, or have been an
3423 // available_externally definition that was dropped by the
3424 // EliminateAvailableExternally pass), some other TU
3425 // will provide its dynamic initializer.
3426 continue;
3427
3428 KeySym = getSymbol(GV);
3429 }
3430
3431 MCSection *OutputSection =
3432 (IsCtor ? Obj.getStaticCtorSection(S.Priority, KeySym)
3433 : Obj.getStaticDtorSection(S.Priority, KeySym));
3434 OutStreamer->switchSection(OutputSection);
3435 if (OutStreamer->getCurrentSection() != OutStreamer->getPreviousSection())
3437 emitXXStructor(DL, S.Func);
3438 }
3439}
3440
3441void AsmPrinter::emitModuleIdents(Module &M) {
3442 if (!MAI->hasIdentDirective())
3443 return;
3444
3445 if (const NamedMDNode *NMD = M.getNamedMetadata("llvm.ident")) {
3446 for (const MDNode *N : NMD->operands()) {
3447 assert(N->getNumOperands() == 1 &&
3448 "llvm.ident metadata entry can have only one operand");
3449 const MDString *S = cast<MDString>(N->getOperand(0));
3450 OutStreamer->emitIdent(S->getString());
3451 }
3452 }
3453}
3454
3455void AsmPrinter::emitModuleCommandLines(Module &M) {
3457 if (!CommandLine)
3458 return;
3459
3460 const NamedMDNode *NMD = M.getNamedMetadata("llvm.commandline");
3461 if (!NMD || !NMD->getNumOperands())
3462 return;
3463
3464 OutStreamer->pushSection();
3465 OutStreamer->switchSection(CommandLine);
3466 OutStreamer->emitZeros(1);
3467 for (const MDNode *N : NMD->operands()) {
3468 assert(N->getNumOperands() == 1 &&
3469 "llvm.commandline metadata entry can have only one operand");
3470 const MDString *S = cast<MDString>(N->getOperand(0));
3471 OutStreamer->emitBytes(S->getString());
3472 OutStreamer->emitZeros(1);
3473 }
3474 OutStreamer->popSection();
3475}
3476
3477//===--------------------------------------------------------------------===//
3478// Emission and print routines
3479//
3480
3481/// Emit a byte directive and value.
3482///
3483void AsmPrinter::emitInt8(int Value) const { OutStreamer->emitInt8(Value); }
3484
3485/// Emit a short directive and value.
3486void AsmPrinter::emitInt16(int Value) const { OutStreamer->emitInt16(Value); }
3487
3488/// Emit a long directive and value.
3489void AsmPrinter::emitInt32(int Value) const { OutStreamer->emitInt32(Value); }
3490
3491/// EmitSLEB128 - emit the specified signed leb128 value.
3492void AsmPrinter::emitSLEB128(int64_t Value, const char *Desc) const {
3493 if (isVerbose() && Desc)
3494 OutStreamer->AddComment(Desc);
3495
3496 OutStreamer->emitSLEB128IntValue(Value);
3497}
3498
3500 unsigned PadTo) const {
3501 if (isVerbose() && Desc)
3502 OutStreamer->AddComment(Desc);
3503
3504 OutStreamer->emitULEB128IntValue(Value, PadTo);
3505}
3506
3507/// Emit a long long directive and value.
3509 OutStreamer->emitInt64(Value);
3510}
3511
3512/// Emit something like ".long Hi-Lo" where the size in bytes of the directive
3513/// is specified by Size and Hi/Lo specify the labels. This implicitly uses
3514/// .set if it avoids relocations.
3516 unsigned Size) const {
3517 OutStreamer->emitAbsoluteSymbolDiff(Hi, Lo, Size);
3518}
3519
3520/// Emit something like ".uleb128 Hi-Lo".
3522 const MCSymbol *Lo) const {
3523 OutStreamer->emitAbsoluteSymbolDiffAsULEB128(Hi, Lo);
3524}
3525
3526/// EmitLabelPlusOffset - Emit something like ".long Label+Offset"
3527/// where the size in bytes of the directive is specified by Size and Label
3528/// specifies the label. This implicitly uses .set if it is available.
3530 unsigned Size,
3531 bool IsSectionRelative) const {
3532 if (MAI->needsDwarfSectionOffsetDirective() && IsSectionRelative) {
3533 OutStreamer->emitCOFFSecRel32(Label, Offset);
3534 if (Size > 4)
3535 OutStreamer->emitZeros(Size - 4);
3536 return;
3537 }
3538
3539 // Emit Label+Offset (or just Label if Offset is zero)
3540 const MCExpr *Expr = MCSymbolRefExpr::create(Label, OutContext);
3541 if (Offset)
3544
3545 OutStreamer->emitValue(Expr, Size);
3546}
3547
3548//===----------------------------------------------------------------------===//
3549
3550// EmitAlignment - Emit an alignment directive to the specified power of
3551// two boundary. If a global value is specified, and if that global has
3552// an explicit alignment requested, it will override the alignment request
3553// if required for correctness.
3555 unsigned MaxBytesToEmit) const {
3556 if (GV)
3557 Alignment = getGVAlignment(GV, GV->getDataLayout(), Alignment);
3558
3559 if (Alignment == Align(1))
3560 return; // 1-byte aligned: no need to emit alignment.
3561
3562 if (getCurrentSection()->isText()) {
3563 const MCSubtargetInfo *STI = nullptr;
3564 if (this->MF)
3565 STI = &getSubtargetInfo();
3566 else
3567 STI = TM.getMCSubtargetInfo();
3568 OutStreamer->emitCodeAlignment(Alignment, STI, MaxBytesToEmit);
3569 } else
3570 OutStreamer->emitValueToAlignment(Alignment, 0, 1, MaxBytesToEmit);
3571}
3572
3573//===----------------------------------------------------------------------===//
3574// Constant emission.
3575//===----------------------------------------------------------------------===//
3576
3578 const Constant *BaseCV,
3579 uint64_t Offset) {
3580 MCContext &Ctx = OutContext;
3581
3582 if (CV->isNullValue() || isa<UndefValue>(CV))
3583 return MCConstantExpr::create(0, Ctx);
3584
3585 if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV))
3586 return MCConstantExpr::create(CI->getZExtValue(), Ctx);
3587
3588 if (const ConstantPtrAuth *CPA = dyn_cast<ConstantPtrAuth>(CV))
3589 return lowerConstantPtrAuth(*CPA);
3590
3591 if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV))
3592 return MCSymbolRefExpr::create(getSymbol(GV), Ctx);
3593
3594 if (const BlockAddress *BA = dyn_cast<BlockAddress>(CV))
3595 return lowerBlockAddressConstant(*BA);
3596
3597 if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(CV))
3599 getSymbol(Equiv->getGlobalValue()), nullptr, 0, std::nullopt, TM);
3600
3601 if (const NoCFIValue *NC = dyn_cast<NoCFIValue>(CV))
3602 return MCSymbolRefExpr::create(getSymbol(NC->getGlobalValue()), Ctx);
3603
3604 const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV);
3605 if (!CE) {
3606 llvm_unreachable("Unknown constant value to lower!");
3607 }
3608
3609 // The constant expression opcodes are limited to those that are necessary
3610 // to represent relocations on supported targets. Expressions involving only
3611 // constant addresses are constant folded instead.
3612 switch (CE->getOpcode()) {
3613 default:
3614 break; // Error
3615 case Instruction::AddrSpaceCast: {
3616 const Constant *Op = CE->getOperand(0);
3617 unsigned DstAS = CE->getType()->getPointerAddressSpace();
3618 unsigned SrcAS = Op->getType()->getPointerAddressSpace();
3619 if (TM.isNoopAddrSpaceCast(SrcAS, DstAS))
3620 return lowerConstant(Op);
3621
3622 break; // Error
3623 }
3624 case Instruction::GetElementPtr: {
3625 // Generate a symbolic expression for the byte address
3626 APInt OffsetAI(getDataLayout().getPointerTypeSizeInBits(CE->getType()), 0);
3627 cast<GEPOperator>(CE)->accumulateConstantOffset(getDataLayout(), OffsetAI);
3628
3629 const MCExpr *Base = lowerConstant(CE->getOperand(0));
3630 if (!OffsetAI)
3631 return Base;
3632
3633 int64_t Offset = OffsetAI.getSExtValue();
3635 Ctx);
3636 }
3637
3638 case Instruction::Trunc:
3639 // We emit the value and depend on the assembler to truncate the generated
3640 // expression properly. This is important for differences between
3641 // blockaddress labels. Since the two labels are in the same function, it
3642 // is reasonable to treat their delta as a 32-bit value.
3643 [[fallthrough]];
3644 case Instruction::BitCast:
3645 return lowerConstant(CE->getOperand(0), BaseCV, Offset);
3646
3647 case Instruction::IntToPtr: {
3648 const DataLayout &DL = getDataLayout();
3649
3650 // Handle casts to pointers by changing them into casts to the appropriate
3651 // integer type. This promotes constant folding and simplifies this code.
3652 Constant *Op = CE->getOperand(0);
3653 Op = ConstantFoldIntegerCast(Op, DL.getIntPtrType(CV->getType()),
3654 /*IsSigned*/ false, DL);
3655 if (Op)
3656 return lowerConstant(Op);
3657
3658 break; // Error
3659 }
3660
3661 case Instruction::PtrToAddr:
3662 case Instruction::PtrToInt: {
3663 const DataLayout &DL = getDataLayout();
3664
3665 // Support only foldable casts to/from pointers that can be eliminated by
3666 // changing the pointer to the appropriately sized integer type.
3667 Constant *Op = CE->getOperand(0);
3668 Type *Ty = CE->getType();
3669
3670 const MCExpr *OpExpr = lowerConstant(Op);
3671
3672 // We can emit the pointer value into this slot if the slot is an
3673 // integer slot equal to the size of the pointer.
3674 //
3675 // If the pointer is larger than the resultant integer, then
3676 // as with Trunc just depend on the assembler to truncate it.
3677 if (DL.getTypeAllocSize(Ty).getFixedValue() <=
3678 DL.getTypeAllocSize(Op->getType()).getFixedValue())
3679 return OpExpr;
3680
3681 break; // Error
3682 }
3683
3684 case Instruction::Sub: {
3685 GlobalValue *LHSGV, *RHSGV;
3686 APInt LHSOffset, RHSOffset;
3687 DSOLocalEquivalent *DSOEquiv;
3688 if (IsConstantOffsetFromGlobal(CE->getOperand(0), LHSGV, LHSOffset,
3689 getDataLayout(), &DSOEquiv) &&
3690 IsConstantOffsetFromGlobal(CE->getOperand(1), RHSGV, RHSOffset,
3691 getDataLayout())) {
3692 auto *LHSSym = getSymbol(LHSGV);
3693 auto *RHSSym = getSymbol(RHSGV);
3694 int64_t Addend = (LHSOffset - RHSOffset).getSExtValue();
3695 std::optional<int64_t> PCRelativeOffset;
3696 if (getObjFileLowering().hasPLTPCRelative() && RHSGV == BaseCV)
3697 PCRelativeOffset = Offset;
3698
3699 // Try the generic symbol difference first.
3701 LHSGV, RHSGV, Addend, PCRelativeOffset, TM);
3702
3703 // (ELF-specific) If the generic symbol difference does not apply, and
3704 // LHS is a dso_local_equivalent of a function, reference the PLT entry
3705 // instead. Note: A default visibility symbol is by default preemptible
3706 // during linking, and should not be referenced with PC-relative
3707 // relocations. Therefore, use a PLT relocation even if the function is
3708 // dso_local.
3709 if (DSOEquiv && TM.getTargetTriple().isOSBinFormatELF())
3711 LHSSym, RHSSym, Addend, PCRelativeOffset, TM);
3712
3713 // Otherwise, return LHS-RHS+Addend.
3714 if (!Res) {
3715 Res =
3717 MCSymbolRefExpr::create(RHSSym, Ctx), Ctx);
3718 if (Addend != 0)
3720 Res, MCConstantExpr::create(Addend, Ctx), Ctx);
3721 }
3722 return Res;
3723 }
3724
3725 const MCExpr *LHS = lowerConstant(CE->getOperand(0));
3726 const MCExpr *RHS = lowerConstant(CE->getOperand(1));
3727 return MCBinaryExpr::createSub(LHS, RHS, Ctx);
3728 break;
3729 }
3730
3731 case Instruction::Add: {
3732 const MCExpr *LHS = lowerConstant(CE->getOperand(0));
3733 const MCExpr *RHS = lowerConstant(CE->getOperand(1));
3734 return MCBinaryExpr::createAdd(LHS, RHS, Ctx);
3735 }
3736 }
3737
3738 // If the code isn't optimized, there may be outstanding folding
3739 // opportunities. Attempt to fold the expression using DataLayout as a
3740 // last resort before giving up.
3742 if (C != CE)
3743 return lowerConstant(C);
3744
3745 // Otherwise report the problem to the user.
3746 std::string S;
3748 OS << "unsupported expression in static initializer: ";
3749 CE->printAsOperand(OS, /*PrintType=*/false,
3750 !MF ? nullptr : MF->getFunction().getParent());
3751 CE->getContext().emitError(S);
3752 return MCConstantExpr::create(0, Ctx);
3753}
3754
3755static void emitGlobalConstantImpl(const DataLayout &DL, const Constant *C,
3756 AsmPrinter &AP,
3757 const Constant *BaseCV = nullptr,
3758 uint64_t Offset = 0,
3759 AsmPrinter::AliasMapTy *AliasList = nullptr);
3760
3761static void emitGlobalConstantFP(const ConstantFP *CFP, AsmPrinter &AP);
3762static void emitGlobalConstantFP(APFloat APF, Type *ET, AsmPrinter &AP);
3763
3764/// isRepeatedByteSequence - Determine whether the given value is
3765/// composed of a repeated sequence of identical bytes and return the
3766/// byte value. If it is not a repeated sequence, return -1.
3768 StringRef Data = V->getRawDataValues();
3769 assert(!Data.empty() && "Empty aggregates should be CAZ node");
3770 char C = Data[0];
3771 for (unsigned i = 1, e = Data.size(); i != e; ++i)
3772 if (Data[i] != C) return -1;
3773 return static_cast<uint8_t>(C); // Ensure 255 is not returned as -1.
3774}
3775
3776/// isRepeatedByteSequence - Determine whether the given value is
3777/// composed of a repeated sequence of identical bytes and return the
3778/// byte value. If it is not a repeated sequence, return -1.
3779static int isRepeatedByteSequence(const Value *V, const DataLayout &DL) {
3780 if (const ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
3781 uint64_t Size = DL.getTypeAllocSizeInBits(V->getType());
3782 assert(Size % 8 == 0);
3783
3784 // Extend the element to take zero padding into account.
3785 APInt Value = CI->getValue().zext(Size);
3786 if (!Value.isSplat(8))
3787 return -1;
3788
3789 return Value.zextOrTrunc(8).getZExtValue();
3790 }
3791 if (const ConstantArray *CA = dyn_cast<ConstantArray>(V)) {
3792 // Make sure all array elements are sequences of the same repeated
3793 // byte.
3794 assert(CA->getNumOperands() != 0 && "Should be a CAZ");
3795 Constant *Op0 = CA->getOperand(0);
3796 int Byte = isRepeatedByteSequence(Op0, DL);
3797 if (Byte == -1)
3798 return -1;
3799
3800 // All array elements must be equal.
3801 for (unsigned i = 1, e = CA->getNumOperands(); i != e; ++i)
3802 if (CA->getOperand(i) != Op0)
3803 return -1;
3804 return Byte;
3805 }
3806
3807 if (const ConstantDataSequential *CDS = dyn_cast<ConstantDataSequential>(V))
3808 return isRepeatedByteSequence(CDS);
3809
3810 return -1;
3811}
3812
3814 AsmPrinter::AliasMapTy *AliasList) {
3815 if (AliasList) {
3816 auto AliasIt = AliasList->find(Offset);
3817 if (AliasIt != AliasList->end()) {
3818 for (const GlobalAlias *GA : AliasIt->second)
3819 AP.OutStreamer->emitLabel(AP.getSymbol(GA));
3820 AliasList->erase(Offset);
3821 }
3822 }
3823}
3824
3826 const DataLayout &DL, const ConstantDataSequential *CDS, AsmPrinter &AP,
3827 AsmPrinter::AliasMapTy *AliasList) {
3828 // See if we can aggregate this into a .fill, if so, emit it as such.
3829 int Value = isRepeatedByteSequence(CDS, DL);
3830 if (Value != -1) {
3831 uint64_t Bytes = DL.getTypeAllocSize(CDS->getType());
3832 // Don't emit a 1-byte object as a .fill.
3833 if (Bytes > 1)
3834 return AP.OutStreamer->emitFill(Bytes, Value);
3835 }
3836
3837 // If this can be emitted with .ascii/.asciz, emit it as such.
3838 if (CDS->isString())
3839 return AP.OutStreamer->emitBytes(CDS->getAsString());
3840
3841 // Otherwise, emit the values in successive locations.
3842 uint64_t ElementByteSize = CDS->getElementByteSize();
3843 if (isa<IntegerType>(CDS->getElementType())) {
3844 for (uint64_t I = 0, E = CDS->getNumElements(); I != E; ++I) {
3845 emitGlobalAliasInline(AP, ElementByteSize * I, AliasList);
3846 if (AP.isVerbose())
3847 AP.OutStreamer->getCommentOS()
3848 << format("0x%" PRIx64 "\n", CDS->getElementAsInteger(I));
3849 AP.OutStreamer->emitIntValue(CDS->getElementAsInteger(I),
3850 ElementByteSize);
3851 }
3852 } else {
3853 Type *ET = CDS->getElementType();
3854 for (uint64_t I = 0, E = CDS->getNumElements(); I != E; ++I) {
3855 emitGlobalAliasInline(AP, ElementByteSize * I, AliasList);
3857 }
3858 }
3859
3860 unsigned Size = DL.getTypeAllocSize(CDS->getType());
3861 unsigned EmittedSize =
3862 DL.getTypeAllocSize(CDS->getElementType()) * CDS->getNumElements();
3863 assert(EmittedSize <= Size && "Size cannot be less than EmittedSize!");
3864 if (unsigned Padding = Size - EmittedSize)
3865 AP.OutStreamer->emitZeros(Padding);
3866}
3867
3869 const ConstantArray *CA, AsmPrinter &AP,
3870 const Constant *BaseCV, uint64_t Offset,
3871 AsmPrinter::AliasMapTy *AliasList) {
3872 // See if we can aggregate some values. Make sure it can be
3873 // represented as a series of bytes of the constant value.
3874 int Value = isRepeatedByteSequence(CA, DL);
3875
3876 if (Value != -1) {
3877 uint64_t Bytes = DL.getTypeAllocSize(CA->getType());
3878 AP.OutStreamer->emitFill(Bytes, Value);
3879 } else {
3880 for (unsigned I = 0, E = CA->getNumOperands(); I != E; ++I) {
3881 emitGlobalConstantImpl(DL, CA->getOperand(I), AP, BaseCV, Offset,
3882 AliasList);
3883 Offset += DL.getTypeAllocSize(CA->getOperand(I)->getType());
3884 }
3885 }
3886}
3887
3888static void emitGlobalConstantLargeInt(const ConstantInt *CI, AsmPrinter &AP);
3889
3890static void emitGlobalConstantVector(const DataLayout &DL, const Constant *CV,
3891 AsmPrinter &AP,
3892 AsmPrinter::AliasMapTy *AliasList) {
3893 auto *VTy = cast<FixedVectorType>(CV->getType());
3894 Type *ElementType = VTy->getElementType();
3895 uint64_t ElementSizeInBits = DL.getTypeSizeInBits(ElementType);
3896 uint64_t ElementAllocSizeInBits = DL.getTypeAllocSizeInBits(ElementType);
3897 uint64_t EmittedSize;
3898 if (ElementSizeInBits != ElementAllocSizeInBits) {
3899 // If the allocation size of an element is different from the size in bits,
3900 // printing each element separately will insert incorrect padding.
3901 //
3902 // The general algorithm here is complicated; instead of writing it out
3903 // here, just use the existing code in ConstantFolding.
3904 Type *IntT =
3905 IntegerType::get(CV->getContext(), DL.getTypeSizeInBits(CV->getType()));
3906 ConstantInt *CI = dyn_cast_or_null<ConstantInt>(ConstantFoldConstant(
3907 ConstantExpr::getBitCast(const_cast<Constant *>(CV), IntT), DL));
3908 if (!CI) {
3910 "Cannot lower vector global with unusual element type");
3911 }
3912 emitGlobalAliasInline(AP, 0, AliasList);
3914 EmittedSize = DL.getTypeStoreSize(CV->getType());
3915 } else {
3916 for (unsigned I = 0, E = VTy->getNumElements(); I != E; ++I) {
3917 emitGlobalAliasInline(AP, DL.getTypeAllocSize(CV->getType()) * I, AliasList);
3919 }
3920 EmittedSize = DL.getTypeAllocSize(ElementType) * VTy->getNumElements();
3921 }
3922
3923 unsigned Size = DL.getTypeAllocSize(CV->getType());
3924 if (unsigned Padding = Size - EmittedSize)
3925 AP.OutStreamer->emitZeros(Padding);
3926}
3927
3929 const ConstantStruct *CS, AsmPrinter &AP,
3930 const Constant *BaseCV, uint64_t Offset,
3931 AsmPrinter::AliasMapTy *AliasList) {
3932 // Print the fields in successive locations. Pad to align if needed!
3933 uint64_t Size = DL.getTypeAllocSize(CS->getType());
3934 const StructLayout *Layout = DL.getStructLayout(CS->getType());
3935 uint64_t SizeSoFar = 0;
3936 for (unsigned I = 0, E = CS->getNumOperands(); I != E; ++I) {
3937 const Constant *Field = CS->getOperand(I);
3938
3939 // Print the actual field value.
3940 emitGlobalConstantImpl(DL, Field, AP, BaseCV, Offset + SizeSoFar,
3941 AliasList);
3942
3943 // Check if padding is needed and insert one or more 0s.
3944 uint64_t FieldSize = DL.getTypeAllocSize(Field->getType());
3945 uint64_t PadSize = ((I == E - 1 ? Size : Layout->getElementOffset(I + 1)) -
3946 Layout->getElementOffset(I)) -
3947 FieldSize;
3948 SizeSoFar += FieldSize + PadSize;
3949
3950 // Insert padding - this may include padding to increase the size of the
3951 // current field up to the ABI size (if the struct is not packed) as well
3952 // as padding to ensure that the next field starts at the right offset.
3953 AP.OutStreamer->emitZeros(PadSize);
3954 }
3955 assert(SizeSoFar == Layout->getSizeInBytes() &&
3956 "Layout of constant struct may be incorrect!");
3957}
3958
3959static void emitGlobalConstantFP(APFloat APF, Type *ET, AsmPrinter &AP) {
3960 assert(ET && "Unknown float type");
3961 APInt API = APF.bitcastToAPInt();
3962
3963 // First print a comment with what we think the original floating-point value
3964 // should have been.
3965 if (AP.isVerbose()) {
3966 SmallString<8> StrVal;
3967 APF.toString(StrVal);
3968 ET->print(AP.OutStreamer->getCommentOS());
3969 AP.OutStreamer->getCommentOS() << ' ' << StrVal << '\n';
3970 }
3971
3972 // Now iterate through the APInt chunks, emitting them in endian-correct
3973 // order, possibly with a smaller chunk at beginning/end (e.g. for x87 80-bit
3974 // floats).
3975 unsigned NumBytes = API.getBitWidth() / 8;
3976 unsigned TrailingBytes = NumBytes % sizeof(uint64_t);
3977 const uint64_t *p = API.getRawData();
3978
3979 // PPC's long double has odd notions of endianness compared to how LLVM
3980 // handles it: p[0] goes first for *big* endian on PPC.
3981 if (AP.getDataLayout().isBigEndian() && !ET->isPPC_FP128Ty()) {
3982 int Chunk = API.getNumWords() - 1;
3983
3984 if (TrailingBytes)
3985 AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk--], TrailingBytes);
3986
3987 for (; Chunk >= 0; --Chunk)
3988 AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk], sizeof(uint64_t));
3989 } else {
3990 unsigned Chunk;
3991 for (Chunk = 0; Chunk < NumBytes / sizeof(uint64_t); ++Chunk)
3992 AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk], sizeof(uint64_t));
3993
3994 if (TrailingBytes)
3995 AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk], TrailingBytes);
3996 }
3997
3998 // Emit the tail padding for the long double.
3999 const DataLayout &DL = AP.getDataLayout();
4000 AP.OutStreamer->emitZeros(DL.getTypeAllocSize(ET) - DL.getTypeStoreSize(ET));
4001}
4002
4003static void emitGlobalConstantFP(const ConstantFP *CFP, AsmPrinter &AP) {
4004 emitGlobalConstantFP(CFP->getValueAPF(), CFP->getType(), AP);
4005}
4006
4008 const DataLayout &DL = AP.getDataLayout();
4009 unsigned BitWidth = CI->getBitWidth();
4010
4011 // Copy the value as we may massage the layout for constants whose bit width
4012 // is not a multiple of 64-bits.
4013 APInt Realigned(CI->getValue());
4014 uint64_t ExtraBits = 0;
4015 unsigned ExtraBitsSize = BitWidth & 63;
4016
4017 if (ExtraBitsSize) {
4018 // The bit width of the data is not a multiple of 64-bits.
4019 // The extra bits are expected to be at the end of the chunk of the memory.
4020 // Little endian:
4021 // * Nothing to be done, just record the extra bits to emit.
4022 // Big endian:
4023 // * Record the extra bits to emit.
4024 // * Realign the raw data to emit the chunks of 64-bits.
4025 if (DL.isBigEndian()) {
4026 // Basically the structure of the raw data is a chunk of 64-bits cells:
4027 // 0 1 BitWidth / 64
4028 // [chunk1][chunk2] ... [chunkN].
4029 // The most significant chunk is chunkN and it should be emitted first.
4030 // However, due to the alignment issue chunkN contains useless bits.
4031 // Realign the chunks so that they contain only useful information:
4032 // ExtraBits 0 1 (BitWidth / 64) - 1
4033 // chu[nk1 chu][nk2 chu] ... [nkN-1 chunkN]
4034 ExtraBitsSize = alignTo(ExtraBitsSize, 8);
4035 ExtraBits = Realigned.getRawData()[0] &
4036 (((uint64_t)-1) >> (64 - ExtraBitsSize));
4037 if (BitWidth >= 64)
4038 Realigned.lshrInPlace(ExtraBitsSize);
4039 } else
4040 ExtraBits = Realigned.getRawData()[BitWidth / 64];
4041 }
4042
4043 // We don't expect assemblers to support integer data directives
4044 // for more than 64 bits, so we emit the data in at most 64-bit
4045 // quantities at a time.
4046 const uint64_t *RawData = Realigned.getRawData();
4047 for (unsigned i = 0, e = BitWidth / 64; i != e; ++i) {
4048 uint64_t Val = DL.isBigEndian() ? RawData[e - i - 1] : RawData[i];
4049 AP.OutStreamer->emitIntValue(Val, 8);
4050 }
4051
4052 if (ExtraBitsSize) {
4053 // Emit the extra bits after the 64-bits chunks.
4054
4055 // Emit a directive that fills the expected size.
4057 Size -= (BitWidth / 64) * 8;
4058 assert(Size && Size * 8 >= ExtraBitsSize &&
4059 (ExtraBits & (((uint64_t)-1) >> (64 - ExtraBitsSize)))
4060 == ExtraBits && "Directive too small for extra bits.");
4061 AP.OutStreamer->emitIntValue(ExtraBits, Size);
4062 }
4063}
4064
4065/// Transform a not absolute MCExpr containing a reference to a GOT
4066/// equivalent global, by a target specific GOT pc relative access to the
4067/// final symbol.
4069 const Constant *BaseCst,
4070 uint64_t Offset) {
4071 // The global @foo below illustrates a global that uses a got equivalent.
4072 //
4073 // @bar = global i32 42
4074 // @gotequiv = private unnamed_addr constant i32* @bar
4075 // @foo = i32 trunc (i64 sub (i64 ptrtoint (i32** @gotequiv to i64),
4076 // i64 ptrtoint (i32* @foo to i64))
4077 // to i32)
4078 //
4079 // The cstexpr in @foo is converted into the MCExpr `ME`, where we actually
4080 // check whether @foo is suitable to use a GOTPCREL. `ME` is usually in the
4081 // form:
4082 //
4083 // foo = cstexpr, where
4084 // cstexpr := <gotequiv> - "." + <cst>
4085 // cstexpr := <gotequiv> - (<foo> - <offset from @foo base>) + <cst>
4086 //
4087 // After canonicalization by evaluateAsRelocatable `ME` turns into:
4088 //
4089 // cstexpr := <gotequiv> - <foo> + gotpcrelcst, where
4090 // gotpcrelcst := <offset from @foo base> + <cst>
4091 MCValue MV;
4092 if (!(*ME)->evaluateAsRelocatable(MV, nullptr) || MV.isAbsolute())
4093 return;
4094 const MCSymbol *GOTEquivSym = MV.getAddSym();
4095 if (!GOTEquivSym)
4096 return;
4097
4098 // Check that GOT equivalent symbol is cached.
4099 if (!AP.GlobalGOTEquivs.count(GOTEquivSym))
4100 return;
4101
4102 const GlobalValue *BaseGV = dyn_cast_or_null<GlobalValue>(BaseCst);
4103 if (!BaseGV)
4104 return;
4105
4106 // Check for a valid base symbol
4107 const MCSymbol *BaseSym = AP.getSymbol(BaseGV);
4108 const MCSymbol *SymB = MV.getSubSym();
4109
4110 if (!SymB || BaseSym != SymB)
4111 return;
4112
4113 // Make sure to match:
4114 //
4115 // gotpcrelcst := <offset from @foo base> + <cst>
4116 //
4117 int64_t GOTPCRelCst = Offset + MV.getConstant();
4118 if (!AP.getObjFileLowering().supportGOTPCRelWithOffset() && GOTPCRelCst != 0)
4119 return;
4120
4121 // Emit the GOT PC relative to replace the got equivalent global, i.e.:
4122 //
4123 // bar:
4124 // .long 42
4125 // gotequiv:
4126 // .quad bar
4127 // foo:
4128 // .long gotequiv - "." + <cst>
4129 //
4130 // is replaced by the target specific equivalent to:
4131 //
4132 // bar:
4133 // .long 42
4134 // foo:
4135 // .long bar@GOTPCREL+<gotpcrelcst>
4136 AsmPrinter::GOTEquivUsePair Result = AP.GlobalGOTEquivs[GOTEquivSym];
4137 const GlobalVariable *GV = Result.first;
4138 int NumUses = (int)Result.second;
4139 const GlobalValue *FinalGV = dyn_cast<GlobalValue>(GV->getOperand(0));
4140 const MCSymbol *FinalSym = AP.getSymbol(FinalGV);
4142 FinalGV, FinalSym, MV, Offset, AP.MMI, *AP.OutStreamer);
4143
4144 // Update GOT equivalent usage information
4145 --NumUses;
4146 if (NumUses >= 0)
4147 AP.GlobalGOTEquivs[GOTEquivSym] = std::make_pair(GV, NumUses);
4148}
4149
4150static void emitGlobalConstantImpl(const DataLayout &DL, const Constant *CV,
4151 AsmPrinter &AP, const Constant *BaseCV,
4153 AsmPrinter::AliasMapTy *AliasList) {
4154 assert((!AliasList || AP.TM.getTargetTriple().isOSBinFormatXCOFF()) &&
4155 "AliasList only expected for XCOFF");
4156 emitGlobalAliasInline(AP, Offset, AliasList);
4157 uint64_t Size = DL.getTypeAllocSize(CV->getType());
4158
4159 // Globals with sub-elements such as combinations of arrays and structs
4160 // are handled recursively by emitGlobalConstantImpl. Keep track of the
4161 // constant symbol base and the current position with BaseCV and Offset.
4162 if (!BaseCV && CV->hasOneUse())
4163 BaseCV = dyn_cast<Constant>(CV->user_back());
4164
4165 if (isa<ConstantAggregateZero>(CV)) {
4166 StructType *structType;
4167 if (AliasList && (structType = llvm::dyn_cast<StructType>(CV->getType()))) {
4168 unsigned numElements = {structType->getNumElements()};
4169 if (numElements != 0) {
4170 // Handle cases of aliases to direct struct elements
4171 const StructLayout *Layout = DL.getStructLayout(structType);
4172 uint64_t SizeSoFar = 0;
4173 for (unsigned int i = 0; i < numElements - 1; ++i) {
4174 uint64_t GapToNext = Layout->getElementOffset(i + 1) - SizeSoFar;
4175 AP.OutStreamer->emitZeros(GapToNext);
4176 SizeSoFar += GapToNext;
4177 emitGlobalAliasInline(AP, Offset + SizeSoFar, AliasList);
4178 }
4179 AP.OutStreamer->emitZeros(Size - SizeSoFar);
4180 return;
4181 }
4182 }
4183 return AP.OutStreamer->emitZeros(Size);
4184 }
4185
4186 if (isa<UndefValue>(CV))
4187 return AP.OutStreamer->emitZeros(Size);
4188
4189 if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
4190 if (isa<VectorType>(CV->getType()))
4191 return emitGlobalConstantVector(DL, CV, AP, AliasList);
4192
4193 const uint64_t StoreSize = DL.getTypeStoreSize(CV->getType());
4194 if (StoreSize <= 8) {
4195 if (AP.isVerbose())
4196 AP.OutStreamer->getCommentOS()
4197 << format("0x%" PRIx64 "\n", CI->getZExtValue());
4198 AP.OutStreamer->emitIntValue(CI->getZExtValue(), StoreSize);
4199 } else {
4201 }
4202
4203 // Emit tail padding if needed
4204 if (Size != StoreSize)
4205 AP.OutStreamer->emitZeros(Size - StoreSize);
4206
4207 return;
4208 }
4209
4210 if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV)) {
4211 if (isa<VectorType>(CV->getType()))
4212 return emitGlobalConstantVector(DL, CV, AP, AliasList);
4213 else
4214 return emitGlobalConstantFP(CFP, AP);
4215 }
4216
4217 if (isa<ConstantPointerNull>(CV)) {
4218 AP.OutStreamer->emitIntValue(0, Size);
4219 return;
4220 }
4221
4222 if (const ConstantDataSequential *CDS = dyn_cast<ConstantDataSequential>(CV))
4223 return emitGlobalConstantDataSequential(DL, CDS, AP, AliasList);
4224
4225 if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV))
4226 return emitGlobalConstantArray(DL, CVA, AP, BaseCV, Offset, AliasList);
4227
4228 if (const ConstantStruct *CVS = dyn_cast<ConstantStruct>(CV))
4229 return emitGlobalConstantStruct(DL, CVS, AP, BaseCV, Offset, AliasList);
4230
4231 if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) {
4232 // Look through bitcasts, which might not be able to be MCExpr'ized (e.g. of
4233 // vectors).
4234 if (CE->getOpcode() == Instruction::BitCast)
4235 return emitGlobalConstantImpl(DL, CE->getOperand(0), AP);
4236
4237 if (Size > 8) {
4238 // If the constant expression's size is greater than 64-bits, then we have
4239 // to emit the value in chunks. Try to constant fold the value and emit it
4240 // that way.
4241 Constant *New = ConstantFoldConstant(CE, DL);
4242 if (New != CE)
4243 return emitGlobalConstantImpl(DL, New, AP);
4244 }
4245 }
4246
4247 if (isa<ConstantVector>(CV))
4248 return emitGlobalConstantVector(DL, CV, AP, AliasList);
4249
4250 // Otherwise, it must be a ConstantExpr. Lower it to an MCExpr, then emit it
4251 // thread the streamer with EmitValue.
4252 const MCExpr *ME = AP.lowerConstant(CV, BaseCV, Offset);
4253
4254 // Since lowerConstant already folded and got rid of all IR pointer and
4255 // integer casts, detect GOT equivalent accesses by looking into the MCExpr
4256 // directly.
4258 handleIndirectSymViaGOTPCRel(AP, &ME, BaseCV, Offset);
4259
4260 AP.OutStreamer->emitValue(ME, Size);
4261}
4262
4263/// EmitGlobalConstant - Print a general LLVM constant to the .s file.
4265 AliasMapTy *AliasList) {
4266 uint64_t Size = DL.getTypeAllocSize(CV->getType());
4267 if (Size)
4268 emitGlobalConstantImpl(DL, CV, *this, nullptr, 0, AliasList);
4269 else if (MAI->hasSubsectionsViaSymbols()) {
4270 // If the global has zero size, emit a single byte so that two labels don't
4271 // look like they are at the same location.
4272 OutStreamer->emitIntValue(0, 1);
4273 }
4274 if (!AliasList)
4275 return;
4276 // TODO: These remaining aliases are not emitted in the correct location. Need
4277 // to handle the case where the alias offset doesn't refer to any sub-element.
4278 for (auto &AliasPair : *AliasList) {
4279 for (const GlobalAlias *GA : AliasPair.second)
4280 OutStreamer->emitLabel(getSymbol(GA));
4281 }
4282}
4283
4285 // Target doesn't support this yet!
4286 llvm_unreachable("Target does not support EmitMachineConstantPoolValue");
4287}
4288
4290 if (Offset > 0)
4291 OS << '+' << Offset;
4292 else if (Offset < 0)
4293 OS << Offset;
4294}
4295
4296void AsmPrinter::emitNops(unsigned N) {
4298 for (; N; --N)
4300}
4301
4302//===----------------------------------------------------------------------===//
4303// Symbol Lowering Routines.
4304//===----------------------------------------------------------------------===//
4305
4307 return OutContext.createTempSymbol(Name, true);
4308}
4309
4311 return const_cast<AsmPrinter *>(this)->getAddrLabelSymbol(
4312 BA->getBasicBlock());
4313}
4314
4316 return const_cast<AsmPrinter *>(this)->getAddrLabelSymbol(BB);
4317}
4318
4321}
4322
4323/// GetCPISymbol - Return the symbol for the specified constant pool entry.
4324MCSymbol *AsmPrinter::GetCPISymbol(unsigned CPID) const {
4325 if (getSubtargetInfo().getTargetTriple().isWindowsMSVCEnvironment() ||
4326 getSubtargetInfo().getTargetTriple().isUEFI()) {
4327 const MachineConstantPoolEntry &CPE =
4328 MF->getConstantPool()->getConstants()[CPID];
4329 if (!CPE.isMachineConstantPoolEntry()) {
4330 const DataLayout &DL = MF->getDataLayout();
4331 SectionKind Kind = CPE.getSectionKind(&DL);
4332 const Constant *C = CPE.Val.ConstVal;
4333 Align Alignment = CPE.Alignment;
4334 auto *S =
4335 getObjFileLowering().getSectionForConstant(DL, Kind, C, Alignment);
4336 if (S && TM.getTargetTriple().isOSBinFormatCOFF()) {
4337 if (MCSymbol *Sym =
4338 static_cast<const MCSectionCOFF *>(S)->getCOMDATSymbol()) {
4339 if (Sym->isUndefined())
4340 OutStreamer->emitSymbolAttribute(Sym, MCSA_Global);
4341 return Sym;
4342 }
4343 }
4344 }
4345 }
4346
4347 const DataLayout &DL = getDataLayout();
4348 return OutContext.getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
4349 "CPI" + Twine(getFunctionNumber()) + "_" +
4350 Twine(CPID));
4351}
4352
4353/// GetJTISymbol - Return the symbol for the specified jump table entry.
4354MCSymbol *AsmPrinter::GetJTISymbol(unsigned JTID, bool isLinkerPrivate) const {
4355 return MF->getJTISymbol(JTID, OutContext, isLinkerPrivate);
4356}
4357
4358/// GetJTSetSymbol - Return the symbol for the specified jump table .set
4359/// FIXME: privatize to AsmPrinter.
4360MCSymbol *AsmPrinter::GetJTSetSymbol(unsigned UID, unsigned MBBID) const {
4361 const DataLayout &DL = getDataLayout();
4362 return OutContext.getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
4363 Twine(getFunctionNumber()) + "_" +
4364 Twine(UID) + "_set_" + Twine(MBBID));
4365}
4366
4368 StringRef Suffix) const {
4370}
4371
4372/// Return the MCSymbol for the specified ExternalSymbol.
4374 SmallString<60> NameStr;
4376 return OutContext.getOrCreateSymbol(NameStr);
4377}
4378
4379/// PrintParentLoopComment - Print comments about parent loops of this one.
4381 unsigned FunctionNumber) {
4382 if (!Loop) return;
4383 PrintParentLoopComment(OS, Loop->getParentLoop(), FunctionNumber);
4385 << "Parent Loop BB" << FunctionNumber << "_"
4386 << Loop->getHeader()->getNumber()
4387 << " Depth=" << Loop->getLoopDepth() << '\n';
4388}
4389
4390/// PrintChildLoopComment - Print comments about child loops within
4391/// the loop for this basic block, with nesting.
4393 unsigned FunctionNumber) {
4394 // Add child loop information
4395 for (const MachineLoop *CL : *Loop) {
4396 OS.indent(CL->getLoopDepth()*2)
4397 << "Child Loop BB" << FunctionNumber << "_"
4398 << CL->getHeader()->getNumber() << " Depth " << CL->getLoopDepth()
4399 << '\n';
4400 PrintChildLoopComment(OS, CL, FunctionNumber);
4401 }
4402}
4403
4404/// emitBasicBlockLoopComments - Pretty-print comments for basic blocks.
4406 const MachineLoopInfo *LI,
4407 const AsmPrinter &AP) {
4408 // Add loop depth information
4409 const MachineLoop *Loop = LI->getLoopFor(&MBB);
4410 if (!Loop) return;
4411
4412 MachineBasicBlock *Header = Loop->getHeader();
4413 assert(Header && "No header for loop");
4414
4415 // If this block is not a loop header, just print out what is the loop header
4416 // and return.
4417 if (Header != &MBB) {
4418 AP.OutStreamer->AddComment(" in Loop: Header=BB" +
4419 Twine(AP.getFunctionNumber())+"_" +
4421 " Depth="+Twine(Loop->getLoopDepth()));
4422 return;
4423 }
4424
4425 // Otherwise, it is a loop header. Print out information about child and
4426 // parent loops.
4427 raw_ostream &OS = AP.OutStreamer->getCommentOS();
4428
4430
4431 OS << "=>";
4432 OS.indent(Loop->getLoopDepth()*2-2);
4433
4434 OS << "This ";
4435 if (Loop->isInnermost())
4436 OS << "Inner ";
4437 OS << "Loop Header: Depth=" + Twine(Loop->getLoopDepth()) << '\n';
4438
4440}
4441
4442/// emitBasicBlockStart - This method prints the label for the specified
4443/// MachineBasicBlock, an alignment (if present) and a comment describing
4444/// it if appropriate.
4446 // End the previous funclet and start a new one.
4447 if (MBB.isEHFuncletEntry()) {
4448 for (auto &Handler : Handlers) {
4449 Handler->endFunclet();
4450 Handler->beginFunclet(MBB);
4451 }
4452 for (auto &Handler : EHHandlers) {
4453 Handler->endFunclet();
4454 Handler->beginFunclet(MBB);
4455 }
4456 }
4457
4458 // Switch to a new section if this basic block must begin a section. The
4459 // entry block is always placed in the function section and is handled
4460 // separately.
4461 if (MBB.isBeginSection() && !MBB.isEntryBlock()) {
4462 OutStreamer->switchSection(
4463 getObjFileLowering().getSectionForMachineBasicBlock(MF->getFunction(),
4464 MBB, TM));
4465 CurrentSectionBeginSym = MBB.getSymbol();
4466 }
4467
4468 for (auto &Handler : Handlers)
4469 Handler->beginCodeAlignment(MBB);
4470
4471 // Emit an alignment directive for this block, if needed.
4472 const Align Alignment = MBB.getAlignment();
4473 if (Alignment != Align(1))
4474 emitAlignment(Alignment, nullptr, MBB.getMaxBytesForAlignment());
4475
4476 // If the block has its address taken, emit any labels that were used to
4477 // reference the block. It is possible that there is more than one label
4478 // here, because multiple LLVM BB's may have been RAUW'd to this block after
4479 // the references were generated.
4480 if (MBB.isIRBlockAddressTaken()) {
4481 if (isVerbose())
4482 OutStreamer->AddComment("Block address taken");
4483
4485 assert(BB && BB->hasAddressTaken() && "Missing BB");
4487 OutStreamer->emitLabel(Sym);
4488 } else if (isVerbose() && MBB.isMachineBlockAddressTaken()) {
4489 OutStreamer->AddComment("Block address taken");
4490 } else if (isVerbose() && MBB.isInlineAsmBrIndirectTarget()) {
4491 OutStreamer->AddComment("Inline asm indirect target");
4492 }
4493
4494 // Print some verbose block comments.
4495 if (isVerbose()) {
4496 if (const BasicBlock *BB = MBB.getBasicBlock()) {
4497 if (BB->hasName()) {
4498 BB->printAsOperand(OutStreamer->getCommentOS(),
4499 /*PrintType=*/false, BB->getModule());
4500 OutStreamer->getCommentOS() << '\n';
4501 }
4502 }
4503
4504 assert(MLI != nullptr && "MachineLoopInfo should has been computed");
4506 }
4507
4508 // Print the main label for the block.
4509 if (shouldEmitLabelForBasicBlock(MBB)) {
4511 OutStreamer->AddComment("Label of block must be emitted");
4512 OutStreamer->emitLabel(MBB.getSymbol());
4513 } else {
4514 if (isVerbose()) {
4515 // NOTE: Want this comment at start of line, don't emit with AddComment.
4516 OutStreamer->emitRawComment(" %bb." + Twine(MBB.getNumber()) + ":",
4517 false);
4518 }
4519 }
4520
4521 if (MBB.isEHContTarget() &&
4523 OutStreamer->emitLabel(MBB.getEHContSymbol());
4524 }
4525
4526 // With BB sections, each basic block must handle CFI information on its own
4527 // if it begins a section (Entry block call is handled separately, next to
4528 // beginFunction).
4529 if (MBB.isBeginSection() && !MBB.isEntryBlock()) {
4530 for (auto &Handler : Handlers)
4531 Handler->beginBasicBlockSection(MBB);
4532 for (auto &Handler : EHHandlers)
4533 Handler->beginBasicBlockSection(MBB);
4534 }
4535}
4536
4538 // Check if CFI information needs to be updated for this MBB with basic block
4539 // sections.
4540 if (MBB.isEndSection()) {
4541 for (auto &Handler : Handlers)
4542 Handler->endBasicBlockSection(MBB);
4543 for (auto &Handler : EHHandlers)
4544 Handler->endBasicBlockSection(MBB);
4545 }
4546}
4547
4548void AsmPrinter::emitVisibility(MCSymbol *Sym, unsigned Visibility,
4549 bool IsDefinition) const {
4551
4552 switch (Visibility) {
4553 default: break;
4555 if (IsDefinition)
4556 Attr = MAI->getHiddenVisibilityAttr();
4557 else
4559 break;
4562 break;
4563 }
4564
4565 if (Attr != MCSA_Invalid)
4566 OutStreamer->emitSymbolAttribute(Sym, Attr);
4567}
4568
4569bool AsmPrinter::shouldEmitLabelForBasicBlock(
4570 const MachineBasicBlock &MBB) const {
4571 // With `-fbasic-block-sections=`, a label is needed for every non-entry block
4572 // in the labels mode (option `=labels`) and every section beginning in the
4573 // sections mode (`=all` and `=list=`).
4575 !MBB.isEntryBlock())
4576 return true;
4577 // A label is needed for any block with at least one predecessor (when that
4578 // predecessor is not the fallthrough predecessor, or if it is an EH funclet
4579 // entry, or if a label is forced).
4580 return !MBB.pred_empty() &&
4583}
4584
4585/// isBlockOnlyReachableByFallthough - Return true if the basic block has
4586/// exactly one predecessor and the control transfer mechanism between
4587/// the predecessor and this block is a fall-through.
4590 // If this is a landing pad, it isn't a fall through. If it has no preds,
4591 // then nothing falls through to it.
4592 if (MBB->isEHPad() || MBB->pred_empty())
4593 return false;
4594
4595 // If there isn't exactly one predecessor, it can't be a fall through.
4596 if (MBB->pred_size() > 1)
4597 return false;
4598
4599 // The predecessor has to be immediately before this block.
4600 MachineBasicBlock *Pred = *MBB->pred_begin();
4601 if (!Pred->isLayoutSuccessor(MBB))
4602 return false;
4603
4604 // If the block is completely empty, then it definitely does fall through.
4605 if (Pred->empty())
4606 return true;
4607
4608 // Check the terminators in the previous blocks
4609 for (const auto &MI : Pred->terminators()) {
4610 // If it is not a simple branch, we are in a table somewhere.
4611 if (!MI.isBranch() || MI.isIndirectBranch())
4612 return false;
4613
4614 // If we are the operands of one of the branches, this is not a fall
4615 // through. Note that targets with delay slots will usually bundle
4616 // terminators with the delay slot instruction.
4617 for (ConstMIBundleOperands OP(MI); OP.isValid(); ++OP) {
4618 if (OP->isJTI())
4619 return false;
4620 if (OP->isMBB() && OP->getMBB() == MBB)
4621 return false;
4622 }
4623 }
4624
4625 return true;
4626}
4627
4628GCMetadataPrinter *AsmPrinter::getOrCreateGCPrinter(GCStrategy &S) {
4629 if (!S.usesMetadata())
4630 return nullptr;
4631
4632 auto [GCPI, Inserted] = GCMetadataPrinters.try_emplace(&S);
4633 if (!Inserted)
4634 return GCPI->second.get();
4635
4636 auto Name = S.getName();
4637
4638 for (const GCMetadataPrinterRegistry::entry &GCMetaPrinter :
4640 if (Name == GCMetaPrinter.getName()) {
4641 std::unique_ptr<GCMetadataPrinter> GMP = GCMetaPrinter.instantiate();
4642 GMP->S = &S;
4643 GCPI->second = std::move(GMP);
4644 return GCPI->second.get();
4645 }
4646
4647 report_fatal_error("no GCMetadataPrinter registered for GC: " + Twine(Name));
4648}
4649
4651 GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
4652 assert(MI && "AsmPrinter didn't require GCModuleInfo?");
4653 bool NeedsDefault = false;
4654 if (MI->begin() == MI->end())
4655 // No GC strategy, use the default format.
4656 NeedsDefault = true;
4657 else
4658 for (const auto &I : *MI) {
4659 if (GCMetadataPrinter *MP = getOrCreateGCPrinter(*I))
4660 if (MP->emitStackMaps(SM, *this))
4661 continue;
4662 // The strategy doesn't have printer or doesn't emit custom stack maps.
4663 // Use the default format.
4664 NeedsDefault = true;
4665 }
4666
4667 if (NeedsDefault)
4669}
4670
4672 std::unique_ptr<AsmPrinterHandler> Handler) {
4673 Handlers.insert(Handlers.begin(), std::move(Handler));
4675}
4676
4677/// Pin vtables to this file.
4679
4681
4682// In the binary's "xray_instr_map" section, an array of these function entries
4683// describes each instrumentation point. When XRay patches your code, the index
4684// into this table will be given to your handler as a patch point identifier.
4686 auto Kind8 = static_cast<uint8_t>(Kind);
4687 Out->emitBinaryData(StringRef(reinterpret_cast<const char *>(&Kind8), 1));
4688 Out->emitBinaryData(
4689 StringRef(reinterpret_cast<const char *>(&AlwaysInstrument), 1));
4690 Out->emitBinaryData(StringRef(reinterpret_cast<const char *>(&Version), 1));
4691 auto Padding = (4 * Bytes) - ((2 * Bytes) + 3);
4692 assert(Padding >= 0 && "Instrumentation map entry > 4 * Word Size");
4693 Out->emitZeros(Padding);
4694}
4695
4697 if (Sleds.empty())
4698 return;
4699
4700 auto PrevSection = OutStreamer->getCurrentSectionOnly();
4701 const Function &F = MF->getFunction();
4702 MCSection *InstMap = nullptr;
4703 MCSection *FnSledIndex = nullptr;
4704 const Triple &TT = TM.getTargetTriple();
4705 // Use PC-relative addresses on all targets.
4706 if (TT.isOSBinFormatELF()) {
4707 auto LinkedToSym = static_cast<const MCSymbolELF *>(CurrentFnSym);
4708 auto Flags = ELF::SHF_ALLOC | ELF::SHF_LINK_ORDER;
4709 StringRef GroupName;
4710 if (F.hasComdat()) {
4711 Flags |= ELF::SHF_GROUP;
4712 GroupName = F.getComdat()->getName();
4713 }
4714 InstMap = OutContext.getELFSection("xray_instr_map", ELF::SHT_PROGBITS,
4715 Flags, 0, GroupName, F.hasComdat(),
4716 MCSection::NonUniqueID, LinkedToSym);
4717
4719 FnSledIndex = OutContext.getELFSection(
4720 "xray_fn_idx", ELF::SHT_PROGBITS, Flags, 0, GroupName, F.hasComdat(),
4721 MCSection::NonUniqueID, LinkedToSym);
4723 InstMap = OutContext.getMachOSection("__DATA", "xray_instr_map",
4727 FnSledIndex = OutContext.getMachOSection("__DATA", "xray_fn_idx",
4730 } else {
4731 llvm_unreachable("Unsupported target");
4732 }
4733
4734 auto WordSizeBytes = MAI->getCodePointerSize();
4735
4736 // Now we switch to the instrumentation map section. Because this is done
4737 // per-function, we are able to create an index entry that will represent the
4738 // range of sleds associated with a function.
4739 auto &Ctx = OutContext;
4740 MCSymbol *SledsStart =
4741 OutContext.createLinkerPrivateSymbol("xray_sleds_start");
4742 OutStreamer->switchSection(InstMap);
4743 OutStreamer->emitLabel(SledsStart);
4744 for (const auto &Sled : Sleds) {
4745 MCSymbol *Dot = Ctx.createTempSymbol();
4746 OutStreamer->emitLabel(Dot);
4747 OutStreamer->emitValueImpl(
4749 MCSymbolRefExpr::create(Dot, Ctx), Ctx),
4750 WordSizeBytes);
4751 OutStreamer->emitValueImpl(
4755 MCConstantExpr::create(WordSizeBytes, Ctx),
4756 Ctx),
4757 Ctx),
4758 WordSizeBytes);
4759 Sled.emit(WordSizeBytes, OutStreamer.get());
4760 }
4761 MCSymbol *SledsEnd = OutContext.createTempSymbol("xray_sleds_end", true);
4762 OutStreamer->emitLabel(SledsEnd);
4763
4764 // We then emit a single entry in the index per function. We use the symbols
4765 // that bound the instrumentation map as the range for a specific function.
4766 // Each entry contains 2 words and needs to be word-aligned.
4767 if (FnSledIndex) {
4768 OutStreamer->switchSection(FnSledIndex);
4769 OutStreamer->emitValueToAlignment(Align(WordSizeBytes));
4770 // For Mach-O, use an "l" symbol as the atom of this subsection. The label
4771 // difference uses a SUBTRACTOR external relocation which references the
4772 // symbol.
4773 MCSymbol *Dot = Ctx.createLinkerPrivateSymbol("xray_fn_idx");
4774 OutStreamer->emitLabel(Dot);
4775 OutStreamer->emitValueImpl(
4777 MCSymbolRefExpr::create(Dot, Ctx), Ctx),
4778 WordSizeBytes);
4779 OutStreamer->emitValueImpl(MCConstantExpr::create(Sleds.size(), Ctx),
4780 WordSizeBytes);
4781 OutStreamer->switchSection(PrevSection);
4782 }
4783 Sleds.clear();
4784}
4785
4787 SledKind Kind, uint8_t Version) {
4788 const Function &F = MI.getMF()->getFunction();
4789 auto Attr = F.getFnAttribute("function-instrument");
4790 bool LogArgs = F.hasFnAttribute("xray-log-args");
4791 bool AlwaysInstrument =
4792 Attr.isStringAttribute() && Attr.getValueAsString() == "xray-always";
4793 if (Kind == SledKind::FUNCTION_ENTER && LogArgs)
4795 Sleds.emplace_back(XRayFunctionEntry{Sled, CurrentFnSym, Kind,
4796 AlwaysInstrument, &F, Version});
4797}
4798
4800 const Function &F = MF->getFunction();
4801 unsigned PatchableFunctionPrefix = 0, PatchableFunctionEntry = 0;
4802 (void)F.getFnAttribute("patchable-function-prefix")
4803 .getValueAsString()
4804 .getAsInteger(10, PatchableFunctionPrefix);
4805 (void)F.getFnAttribute("patchable-function-entry")
4806 .getValueAsString()
4807 .getAsInteger(10, PatchableFunctionEntry);
4808 if (!PatchableFunctionPrefix && !PatchableFunctionEntry)
4809 return;
4810 const unsigned PointerSize = getPointerSize();
4812 auto Flags = ELF::SHF_WRITE | ELF::SHF_ALLOC;
4813 const MCSymbolELF *LinkedToSym = nullptr;
4814 StringRef GroupName, SectionName;
4815
4816 if (F.hasFnAttribute("patchable-function-entry-section"))
4817 SectionName = F.getFnAttribute("patchable-function-entry-section")
4818 .getValueAsString();
4819 if (SectionName.empty())
4820 SectionName = "__patchable_function_entries";
4821
4822 // GNU as < 2.35 did not support section flag 'o'. GNU ld < 2.36 did not
4823 // support mixed SHF_LINK_ORDER and non-SHF_LINK_ORDER sections.
4824 if (MAI->useIntegratedAssembler() || MAI->binutilsIsAtLeast(2, 36)) {
4825 Flags |= ELF::SHF_LINK_ORDER;
4826 if (F.hasComdat()) {
4827 Flags |= ELF::SHF_GROUP;
4828 GroupName = F.getComdat()->getName();
4829 }
4830 LinkedToSym = static_cast<const MCSymbolELF *>(CurrentFnSym);
4831 }
4832 OutStreamer->switchSection(OutContext.getELFSection(
4833 SectionName, ELF::SHT_PROGBITS, Flags, 0, GroupName, F.hasComdat(),
4834 MCSection::NonUniqueID, LinkedToSym));
4835 emitAlignment(Align(PointerSize));
4836 OutStreamer->emitSymbolValue(CurrentPatchableFunctionEntrySym, PointerSize);
4837 }
4838}
4839
4841 return OutStreamer->getContext().getDwarfVersion();
4842}
4843
4845 OutStreamer->getContext().setDwarfVersion(Version);
4846}
4847
4849 return OutStreamer->getContext().getDwarfFormat() == dwarf::DWARF64;
4850}
4851
4854 OutStreamer->getContext().getDwarfFormat());
4855}
4856
4859 OutStreamer->getContext().getDwarfFormat(),
4861}
4862
4865 OutStreamer->getContext().getDwarfFormat());
4866}
4867
4868std::tuple<const MCSymbol *, uint64_t, const MCSymbol *,
4871 const MCSymbol *BranchLabel) const {
4872 const auto TLI = MF->getSubtarget().getTargetLowering();
4873 const auto BaseExpr =
4875 const auto Base = &cast<MCSymbolRefExpr>(BaseExpr)->getSymbol();
4876
4877 // By default, for the architectures that support CodeView,
4878 // EK_LabelDifference32 is implemented as an Int32 from the base address.
4879 return std::make_tuple(Base, 0, BranchLabel,
4881}
4882
4884 const Triple &TT = TM.getTargetTriple();
4885 assert(TT.isOSBinFormatCOFF());
4886
4887 bool IsTargetArm64EC = TT.isWindowsArm64EC();
4889 SmallVector<MCSymbol *> FuncOverrideDefaultSymbols;
4890 bool SwitchedToDirectiveSection = false;
4891 for (const Function &F : M.functions()) {
4892 if (F.hasFnAttribute("loader-replaceable")) {
4893 if (!SwitchedToDirectiveSection) {
4894 OutStreamer->switchSection(
4896 SwitchedToDirectiveSection = true;
4897 }
4898
4899 StringRef Name = F.getName();
4900
4901 // For hybrid-patchable targets, strip the prefix so that we can mark
4902 // the real function as replaceable.
4903 if (IsTargetArm64EC && Name.ends_with(HybridPatchableTargetSuffix)) {
4904 Name = Name.drop_back(HybridPatchableTargetSuffix.size());
4905 }
4906
4907 MCSymbol *FuncOverrideSymbol =
4908 MMI->getContext().getOrCreateSymbol(Name + "_$fo$");
4909 OutStreamer->beginCOFFSymbolDef(FuncOverrideSymbol);
4910 OutStreamer->emitCOFFSymbolStorageClass(COFF::IMAGE_SYM_CLASS_EXTERNAL);
4911 OutStreamer->emitCOFFSymbolType(COFF::IMAGE_SYM_DTYPE_NULL);
4912 OutStreamer->endCOFFSymbolDef();
4913
4914 MCSymbol *FuncOverrideDefaultSymbol =
4915 MMI->getContext().getOrCreateSymbol(Name + "_$fo_default$");
4916 OutStreamer->beginCOFFSymbolDef(FuncOverrideDefaultSymbol);
4917 OutStreamer->emitCOFFSymbolStorageClass(COFF::IMAGE_SYM_CLASS_EXTERNAL);
4918 OutStreamer->emitCOFFSymbolType(COFF::IMAGE_SYM_DTYPE_NULL);
4919 OutStreamer->endCOFFSymbolDef();
4920 FuncOverrideDefaultSymbols.push_back(FuncOverrideDefaultSymbol);
4921
4922 OutStreamer->emitBytes((Twine(" /ALTERNATENAME:") +
4923 FuncOverrideSymbol->getName() + "=" +
4924 FuncOverrideDefaultSymbol->getName())
4925 .toStringRef(Buf));
4926 Buf.clear();
4927 }
4928 }
4929
4930 if (SwitchedToDirectiveSection)
4931 OutStreamer->popSection();
4932
4933 if (FuncOverrideDefaultSymbols.empty())
4934 return;
4935
4936 // MSVC emits the symbols for the default variables pointing at the start of
4937 // the .data section, but doesn't actually allocate any space for them. LLVM
4938 // can't do this, so have all of the variables pointing at a single byte
4939 // instead.
4941 for (MCSymbol *Symbol : FuncOverrideDefaultSymbols) {
4942 OutStreamer->emitLabel(Symbol);
4943 }
4944 OutStreamer->emitZeros(1);
4945 OutStreamer->popSection();
4946}
4947
4949 const Triple &TT = TM.getTargetTriple();
4950 assert(TT.isOSBinFormatCOFF());
4951
4952 // Emit an absolute @feat.00 symbol.
4953 MCSymbol *S = MMI->getContext().getOrCreateSymbol(StringRef("@feat.00"));
4954 OutStreamer->beginCOFFSymbolDef(S);
4955 OutStreamer->emitCOFFSymbolStorageClass(COFF::IMAGE_SYM_CLASS_STATIC);
4956 OutStreamer->emitCOFFSymbolType(COFF::IMAGE_SYM_DTYPE_NULL);
4957 OutStreamer->endCOFFSymbolDef();
4958 int64_t Feat00Value = 0;
4959
4960 if (TT.getArch() == Triple::x86) {
4961 // According to the PE-COFF spec, the LSB of this value marks the object
4962 // for "registered SEH". This means that all SEH handler entry points
4963 // must be registered in .sxdata. Use of any unregistered handlers will
4964 // cause the process to terminate immediately. LLVM does not know how to
4965 // register any SEH handlers, so its object files should be safe.
4966 Feat00Value |= COFF::Feat00Flags::SafeSEH;
4967 }
4968
4969 if (M.getModuleFlag("cfguard")) {
4970 // Object is CFG-aware.
4971 Feat00Value |= COFF::Feat00Flags::GuardCF;
4972 }
4973
4974 if (M.getModuleFlag("ehcontguard")) {
4975 // Object also has EHCont.
4976 Feat00Value |= COFF::Feat00Flags::GuardEHCont;
4977 }
4978
4979 if (M.getModuleFlag("ms-kernel")) {
4980 // Object is compiled with /kernel.
4981 Feat00Value |= COFF::Feat00Flags::Kernel;
4982 }
4983
4984 OutStreamer->emitSymbolAttribute(S, MCSA_Global);
4985 OutStreamer->emitAssignment(
4986 S, MCConstantExpr::create(Feat00Value, MMI->getContext()));
4987}
@ HasCalls
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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 bool emitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP)
emitDebugValueComment - This method handles the target-independent form of DBG_VALUE,...
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 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 handleIndirectSymViaGOTPCRel(AsmPrinter &AP, const MCExpr **ME, const Constant *BaseCst, uint64_t Offset)
Transform a not absolute MCExpr containing a reference to a GOT equivalent global,...
static int isRepeatedByteSequence(const ConstantDataSequential *V)
isRepeatedByteSequence - Determine whether the given value is composed of a repeated sequence of iden...
static void emitGlobalAliasInline(AsmPrinter &AP, uint64_t Offset, AsmPrinter::AliasMapTy *AliasList)
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 cl::bits< 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 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
Definition: AsmPrinter.cpp:143
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 ConstantInt * extractNumericCGTypeId(const Function &F)
Extracts a generalized numeric type identifier of a Function's type from type metadata.
static llvm::object::BBAddrMap::Features getBBAddrMapFeature(const MachineFunction &MF, int NumMBBSectionRanges, bool HasCalls)
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)
Definition: AsmPrinter.cpp:654
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 GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
Definition: CommandLine.h:687
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Looks at all the uses of the given value Returns the Liveness deduced from the uses of this value Adds all uses that cause the result to be MaybeLive to MaybeLiveRetUses If the result is MaybeLiveUses might be modified but its content should be ignored(since it might not be complete). DeadArgumentEliminationPass
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
std::string Name
uint64_t Size
Symbol * Sym
Definition: ELF_riscv.cpp:479
@ CallSiteInfo
#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.
===- LazyMachineBlockFrequencyInfo.h - Lazy Block Frequency -*- C++ -*–===//
const FeatureInfo AllFeatures[]
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
#define G(x, y, z)
Definition: MD5.cpp:56
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
===- MachineOptimizationRemarkEmitter.h - Opt Diagnostics -*- C++ -*-—===//
static cl::opt< std::string > OutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename"), cl::init("-"))
This file provides utility analysis objects describing memory locations.
This file contains the declarations for metadata subclasses.
if(PassOpts->AAPipeline)
This file contains some templates that are useful if you are working with the STL at all.
raw_pwrite_stream & OS
#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:167
This file contains some functions that are useful when dealing with strings.
This file describes how to lower LLVM code to machine code.
Value * RHS
Value * LHS
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
Definition: APFloat.cpp:6057
LLVM_ABI double convertToDouble() const
Converts this APFloat to host double value.
Definition: APFloat.cpp:6115
void toString(SmallVectorImpl< char > &Str, unsigned FormatPrecision=0, unsigned FormatMaxPadding=3, bool TruncateZero=true) const
Definition: APFloat.h:1478
APInt bitcastToAPInt() const
Definition: APFloat.h:1353
Class for arbitrary precision integers.
Definition: APInt.h:78
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition: APInt.h:1488
unsigned getNumWords() const
Get the number of words.
Definition: APInt.h:1495
const uint64_t * getRawData() const
This function returns a pointer to the internal storage of the APInt.
Definition: APInt.h:569
int64_t getSExtValue() const
Get sign extended value.
Definition: APInt.h:1562
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition: APInt.h:858
AddrLabelMap(MCContext &context)
Definition: AsmPrinter.cpp:229
void UpdateForRAUWBlock(BasicBlock *Old, BasicBlock *New)
Definition: AsmPrinter.cpp:330
void takeDeletedSymbolsForFunction(Function *F, std::vector< MCSymbol * > &Result)
If we have any deleted symbols for F, return them.
Definition: AsmPrinter.cpp:269
void UpdateForDeletedBlock(BasicBlock *BB)
Definition: AsmPrinter.cpp:303
ArrayRef< MCSymbol * > getAddrLabelSymbolToEmit(BasicBlock *BB)
Definition: AsmPrinter.cpp:245
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
const T & front() const
front - Get the first element.
Definition: ArrayRef.h:150
bool empty() const
empty - Check if the array is empty.
Definition: ArrayRef.h:142
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:90
virtual void emitInstruction(const MachineInstr *)
Targets should implement this to emit instructions.
Definition: AsmPrinter.h:629
const TargetLoweringObjectFile & getObjFileLowering() const
Return information about object file lowering.
Definition: AsmPrinter.cpp:413
MCSymbol * getSymbolWithGlobalValueBase(const GlobalValue *GV, StringRef Suffix) const
Return the MCSymbol for a private symbol with global value name as its base, with the specified suffi...
MCSymbol * getSymbol(const GlobalValue *GV) const
Definition: AsmPrinter.cpp:706
void emitULEB128(uint64_t Value, const char *Desc=nullptr, unsigned PadTo=0) const
Emit the specified unsigned leb128 value.
SmallVector< XRayFunctionEntry, 4 > Sleds
Definition: AsmPrinter.h:425
MapVector< MBBSectionID, MBBSectionRange > MBBSectionRanges
Definition: AsmPrinter.h:157
bool isDwarf64() const
void emitNops(unsigned N)
Emit N NOP instructions.
MCSymbol * CurrentFnBegin
Definition: AsmPrinter.h:232
MachineLoopInfo * MLI
This is a pointer to the current MachineLoopInfo.
Definition: AsmPrinter.h:117
virtual void emitDebugValue(const MCExpr *Value, unsigned Size) const
Emit the directive and value for debug thread local expression.
Definition: AsmPrinter.cpp:925
void EmitToStreamer(MCStreamer &S, const MCInst &Inst)
Definition: AsmPrinter.cpp:433
virtual void emitConstantPool()
Print to the current output stream assembly representations of the constants in the constant pool MCP...
virtual void emitGlobalVariable(const GlobalVariable *GV)
Emit the specified global variable to the .s file.
Definition: AsmPrinter.cpp:728
virtual const MCExpr * lowerConstantPtrAuth(const ConstantPtrAuth &CPA)
Definition: AsmPrinter.h:650
unsigned int getUnitLengthFieldByteSize() const
Returns 4 for DWARF32 and 12 for DWARF64.
void emitLabelPlusOffset(const MCSymbol *Label, uint64_t Offset, unsigned Size, bool IsSectionRelative=false) const
Emit something like ".long Label+Offset" where the size in bytes of the directive is specified by Siz...
~AsmPrinter() override
Definition: AsmPrinter.cpp:399
TargetMachine & TM
Target machine description.
Definition: AsmPrinter.h:93
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:143
virtual void emitBasicBlockEnd(const MachineBasicBlock &MBB)
Targets can override this to emit stuff at the end of a basic block.
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.
void emitIndirectCalleeLabels(FunctionInfo &FuncInfo, const MachineFunction::CallSiteInfoMap &CallSitesInfoMap, const MachineInstr &MI)
Generate and emit labels for callees of the indirect callsites which will be used to populate the ....
MCSymbol * CurrentFnDescSym
The symbol for the current function descriptor on AIX.
Definition: AsmPrinter.h:131
MCSymbol * CurrentFnBeginLocal
For dso_local functions, the current $local alias for the function.
Definition: AsmPrinter.h:235
MapVector< const MCSymbol *, GOTEquivUsePair > GlobalGOTEquivs
Definition: AsmPrinter.h:162
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:316
void emitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo, unsigned Size) const
Emit something like ".long Hi-Lo" where the size in bytes of the directive is specified by Size and H...
void emitKCFITrapEntry(const MachineFunction &MF, const MCSymbol *Symbol)
virtual void emitMachOIFuncStubHelperBody(Module &M, const GlobalIFunc &GI, MCSymbol *LazyPointer)
Definition: AsmPrinter.h:681
MCSymbol * getMBBExceptionSym(const MachineBasicBlock &MBB)
MCSymbol * getAddrLabelSymbol(const BasicBlock *BB)
Return the symbol to be used for the specified basic block when its address is taken.
Definition: AsmPrinter.h:326
const MCAsmInfo * MAI
Target Asm Printer information.
Definition: AsmPrinter.h:96
SmallVector< std::unique_ptr< AsmPrinterHandler >, 2 > Handlers
Definition: AsmPrinter.h:245
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:108
virtual void emitJumpTableInfo()
Print assembly representations of the jump tables used by the current function to the current output ...
void computeGlobalGOTEquivs(Module &M)
Unnamed constant global variables solely contaning a pointer to another globals variable act like a g...
static Align getGVAlignment(const GlobalObject *GV, const DataLayout &DL, Align InAlign=Align(1))
Return the alignment for the specified GV.
Definition: AsmPrinter.cpp:361
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, FunctionInfo &FuncInfo)
Emits .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:114
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:605
MCSymbol * GetJTISymbol(unsigned JTID, bool isLinkerPrivate=false) const
Return the symbol for the specified jump table entry.
virtual void emitMachineConstantPoolValue(MachineConstantPoolValue *MCPV)
void emitStackMaps()
Emit the stack maps.
bool hasDebugInfo() const
Returns true if valid debug info is present.
Definition: AsmPrinter.h:504
virtual void emitFunctionBodyStart()
Targets can override this to emit stuff before the first basic block in the function.
Definition: AsmPrinter.h:613
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:161
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:609
bool doInitialization(Module &M) override
Set up the AsmPrinter when we are working on a new module.
Definition: AsmPrinter.cpp:464
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:675
virtual void emitImplicitDef(const MachineInstr *MI) const
Targets can override this to customize the output of IMPLICIT_DEF instructions in verbose mode.
virtual void emitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const
This emits linkage information about GVSym based on GV, if this is supported by the target.
Definition: AsmPrinter.cpp:661
void getAnalysisUsage(AnalysisUsage &AU) const override
Record analysis usage.
Definition: AsmPrinter.cpp:455
unsigned getFunctionNumber() const
Return a unique ID for the current function.
Definition: AsmPrinter.cpp:409
MachineOptimizationRemarkEmitter * ORE
Optimization remark emitter.
Definition: AsmPrinter.h:120
virtual bool shouldEmitWeakSwiftAsyncExtendedFramePointerFlags() const
Definition: AsmPrinter.h:997
AsmPrinter(TargetMachine &TM, std::unique_ptr< MCStreamer > Streamer, char &ID=AsmPrinter::ID)
Definition: AsmPrinter.cpp:389
void printOffset(int64_t Offset, raw_ostream &OS) const
This is just convenient handler for printing offsets.
void emitGlobalConstant(const DataLayout &DL, const Constant *CV, AliasMapTy *AliasList=nullptr)
EmitGlobalConstant - Print a general LLVM constant to the .s file.
void emitFrameAlloc(const MachineInstr &MI)
void emitStackSizeSection(const MachineFunction &MF)
MCSymbol * getSymbolPreferLocal(const GlobalValue &GV) const
Similar to getSymbol() but preferred for references.
Definition: AsmPrinter.cpp:710
MCSymbol * CurrentFnSym
The symbol for the current function.
Definition: AsmPrinter.h:127
MachineModuleInfo * MMI
This is a pointer to the current MachineModuleInfo.
Definition: AsmPrinter.h:111
void emitSLEB128(int64_t Value, const char *Desc=nullptr) const
Emit the specified signed leb128 value.
void emitAlignment(Align Alignment, const GlobalObject *GV=nullptr, unsigned MaxBytesToEmit=0) const
Emit an alignment directive to the specified power of two boundary.
MCContext & OutContext
This is the context for the output file that we are streaming.
Definition: AsmPrinter.h:100
const StaticDataProfileInfo * SDPI
Provides the profile information for constants.
Definition: AsmPrinter.h:146
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:671
void emitStackUsage(const MachineFunction &MF)
virtual void emitKCFITypeId(const MachineFunction &MF)
bool isPositionIndependent() const
Definition: AsmPrinter.cpp:404
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:123
virtual void emitBasicBlockStart(const MachineBasicBlock &MBB)
Targets can override this to emit stuff at the start of a basic block.
void takeDeletedSymbolsForFunction(const Function *F, std::vector< MCSymbol * > &Result)
If the specified function has had any references to address-taken blocks generated,...
Definition: AsmPrinter.cpp:294
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:105
const ProfileSummaryInfo * PSI
The profile summary information.
Definition: AsmPrinter.h:149
virtual void emitFunctionDescriptor()
Definition: AsmPrinter.h:638
const MCSection * getCurrentSection() const
Return the current section we are emitting to.
Definition: AsmPrinter.cpp:451
unsigned int getDwarfOffsetByteSize() const
Returns 4 for DWARF32 and 8 for DWARF64.
size_t NumUserHandlers
Definition: AsmPrinter.h:246
MCSymbol * CurrentFnSymForSize
The symbol used to represent the start of the current function for the purpose of calculating its siz...
Definition: AsmPrinter.h:136
bool isVerbose() const
Return true if assembly output should contain comments.
Definition: AsmPrinter.h:307
MCSymbol * getFunctionEnd() const
Definition: AsmPrinter.h:317
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:646
void preprocessXXStructorList(const DataLayout &DL, const Constant *List, SmallVector< Structor, 8 > &Structors)
This method gathers an array of Structors and then sorts them out by Priority.
void emitInt16(int Value) const
Emit a short directive and value.
void setDwarfVersion(uint16_t Version)
void getNameWithPrefix(SmallVectorImpl< char > &Name, const GlobalValue *GV) const
Definition: AsmPrinter.cpp:701
StringRef getConstantSectionSuffix(const Constant *C) const
Returns a section suffix (hot or unlikely) for the constant if profiles are available.
SmallVector< std::unique_ptr< AsmPrinterHandler >, 1 > EHHandlers
A handle to the EH info emitter (if present).
Definition: AsmPrinter.h:240
void emitPseudoProbe(const MachineInstr &MI)
unsigned getPointerSize() const
Return the pointer size from the TargetMachine.
Definition: AsmPrinter.cpp:424
void emitRemarksSection(remarks::RemarkStreamer &RS)
StackMaps SM
Definition: AsmPrinter.h:248
MCSymbol * GetBlockAddressSymbol(const BlockAddress *BA) const
Return the MCSymbol used to satisfy BlockAddress uses of the specified basic block.
ArrayRef< MCSymbol * > getAddrLabelSymbolToEmit(const BasicBlock *BB)
Return the symbol to be used for the specified basic block when its address is taken.
Definition: AsmPrinter.cpp:286
virtual void emitFunctionBodyEnd()
Targets can override this to emit stuff after the last basic block in the function.
Definition: AsmPrinter.h:617
const DataLayout & getDataLayout() const
Return information about data layout.
Definition: AsmPrinter.cpp:417
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.
void emitInitialRawDwarfLocDirective(const MachineFunction &MF)
Emits inital debug location directive.
Definition: AsmPrinter.cpp:437
MCSymbol * GetExternalSymbolSymbol(const Twine &Sym) const
Return the MCSymbol for the specified ExternalSymbol.
void emitInt64(uint64_t Value) const
Emit a long long directive and value.
uint16_t getDwarfVersion() const
dwarf::FormParams getDwarfFormParams() const
Returns information about the byte size of DW_FORM values.
const MCSubtargetInfo & getSubtargetInfo() const
Return information about subtarget.
Definition: AsmPrinter.cpp:428
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:376
@ None
Do not emit either .eh_frame or .debug_frame.
@ Debug
Emit .debug_frame.
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.
LLVM Basic Block Representation.
Definition: BasicBlock.h:62
unsigned getNumber() const
Definition: BasicBlock.h:95
bool hasAddressTaken() const
Returns true if there are any uses of this basic block other than direct branches,...
Definition: BasicBlock.h:690
const Function * getParent() const
Return the enclosing method, or null if none.
Definition: BasicBlock.h:213
The address of a basic block.
Definition: Constants.h:899
BasicBlock * getBasicBlock() const
Definition: Constants.h:934
uint64_t getFrequency() const
Returns the frequency as a fixpoint number scaled by the entry frequency.
uint32_t getNumerator() const
Value handle with callbacks on RAUW and destruction.
Definition: ValueHandle.h:384
virtual void allUsesReplacedWith(Value *)
Callback for Value RAUW.
Definition: ValueHandle.h:424
virtual void deleted()
Callback for Value destruction.
Definition: ValueHandle.h:415
ConstMIBundleOperands - Iterate over all operands in a const bundle of machine instructions.
ConstantArray - Constant Array Declarations.
Definition: Constants.h:433
ArrayType * getType() const
Specialize the getType() method to always return an ArrayType, which reduces the amount of casting ne...
Definition: Constants.h:452
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:715
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
Definition: Constants.h:593
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.
Definition: Constants.cpp:3160
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 ...
Definition: Constants.cpp:3112
StringRef getAsString() const
If this array is isString(), then this method returns the array as a StringRef.
Definition: Constants.h:668
LLVM_ABI uint64_t getElementByteSize() const
Return the size (in bytes) of each element in the array/vector.
Definition: Constants.cpp:2866
LLVM_ABI bool isString(unsigned CharSize=8) const
This method returns true if this is an array of CharSize integers.
Definition: Constants.cpp:3205
LLVM_ABI uint64_t getNumElements() const
Return the number of elements in the array or vector.
Definition: Constants.cpp:2860
LLVM_ABI Type * getElementType() const
Return the element type of the array/vector.
Definition: Constants.cpp:2834
A constant value that is initialized with an expression using other constant values.
Definition: Constants.h:1120
static LLVM_ABI Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
Definition: Constants.cpp:2328
ConstantFP - Floating Point Values [float, double].
Definition: Constants.h:277
const APFloat & getValueAPF() const
Definition: Constants.h:320
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:264
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition: Constants.h:157
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:163
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition: Constants.h:154
A signed pointer, in the ptrauth sense.
Definition: Constants.h:1032
StructType * getType() const
Specialization - reduce amount of casting.
Definition: Constants.h:504
static Constant * getAnon(ArrayRef< Constant * > V, bool Packed=false)
Return an anonymous struct that has the specified elements.
Definition: Constants.h:486
This is an important base class in LLVM.
Definition: Constant.h:43
const Constant * stripPointerCasts() const
Definition: Constant.h:219
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
Definition: Constants.cpp:435
LLVM_ABI bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition: Constants.cpp:90
DWARF expression.
iterator_range< expr_op_iterator > expr_ops() const
unsigned getNumElements() const
static LLVM_ABI std::optional< const DIExpression * > convertToNonVariadicExpression(const DIExpression *Expr)
If Expr is a valid single-location expression, i.e.
Debug location.
Subprogram description. Uses SubclassData1.
Wrapper for a function that represents a value that functionally represents the original function.
Definition: Constants.h:952
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
bool isBigEndian() const
Definition: DataLayout.h:199
TypeSize getTypeStoreSize(Type *Ty) const
Returns the maximum number of bytes that may be overwritten by storing the specified type.
Definition: DataLayout.h:468
A debug info location.
Definition: DebugLoc.h:124
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:177
bool erase(const KeyT &Val)
Definition: DenseMap.h:319
bool empty() const
Definition: DenseMap.h:119
iterator end()
Definition: DenseMap.h:87
Collects and handles dwarf debug information.
Definition: DwarfDebug.h:351
const MachineInstr * emitInitialLocDirective(const MachineFunction &MF, unsigned CUID)
Emits inital debug location directive.
Emits exception handling directives.
Definition: EHStreamer.h:30
DISubprogram * getSubprogram() const
Get the attached subprogram.
Definition: Metadata.cpp:1915
bool hasPersonalityFn() const
Check whether this function has a personality function.
Definition: Function.h:903
Constant * getPersonalityFn() const
Get the personality function associated with this function.
Definition: Function.cpp:1036
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Definition: Function.cpp:359
std::optional< ProfileCount > getEntryCount(bool AllowSynthetic=false) const
Get the entry count for this function.
Definition: Function.cpp:1121
bool needsUnwindTableEntry() const
True if this function needs an unwind table.
Definition: Function.h:681
GCMetadataPrinter - Emits GC metadata as assembly code.
An analysis pass which caches information about the entire Module.
Definition: GCMetadata.h:237
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:623
const Constant * getAliasee() const
Definition: GlobalAlias.h:87
LLVM_ABI const Function * getResolverFunction() const
Definition: Globals.cpp:652
const Constant * getResolver() const
Definition: GlobalIFunc.h:73
StringRef getSection() const
Get the custom section of this global if it has one.
Definition: GlobalObject.h:114
bool hasMetadata() const
Return true if this value has any metadata attached to it.
Definition: Value.h:602
bool hasSection() const
Check if this global has a custom object file section.
Definition: GlobalObject.h:106
bool hasLinkOnceLinkage() const
Definition: GlobalValue.h:517
bool hasExternalLinkage() const
Definition: GlobalValue.h:513
bool isDSOLocal() const
Definition: GlobalValue.h:307
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
Definition: GlobalValue.h:265
VisibilityTypes getVisibility() const
Definition: GlobalValue.h:250
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:316
LinkageTypes getLinkage() const
Definition: GlobalValue.h:548
bool hasLocalLinkage() const
Definition: GlobalValue.h:530
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
Definition: GlobalValue.h:569
bool hasPrivateLinkage() const
Definition: GlobalValue.h:529
bool isTagged() const
Definition: GlobalValue.h:367
bool isDeclarationForLinker() const
Definition: GlobalValue.h:625
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:663
PointerType * getType() const
Global values are always pointers.
Definition: GlobalValue.h:296
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:132
LLVM_ABI bool canBenefitFromLocalAlias() const
Definition: Globals.cpp:114
bool hasComdat() const
Definition: GlobalValue.h:243
bool hasWeakLinkage() const
Definition: GlobalValue.h:524
bool hasCommonLinkage() const
Definition: GlobalValue.h:534
bool hasGlobalUnnamedAddr() const
Definition: GlobalValue.h:217
bool hasAppendingLinkage() const
Definition: GlobalValue.h:527
static bool isDiscardableIfUnused(LinkageTypes Linkage)
Whether the definition of this global may be discarded if it is not used in its compilation unit.
Definition: GlobalValue.h:451
LLVM_ABI bool canBeOmittedFromSymbolTable() const
True if GV can be left out of the object symbol table.
Definition: Globals.cpp:444
bool hasAvailableExternallyLinkage() const
Definition: GlobalValue.h:514
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
Definition: GlobalValue.h:298
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool hasInitializer() const
Definitions have initializers, declarations don't.
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
bool isTailCall(const MachineInstr &MI) const override
Itinerary data supplied by a subtarget to be used by a target.
Class to represent integer types.
Definition: DerivedTypes.h:42
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition: Type.cpp:319
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.
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:64
bool hasDotTypeDotSizeDirective() const
Definition: MCAsmInfo.h:606
bool useIntegratedAssembler() const
Return true if assembly (inline or otherwise) should be parsed.
Definition: MCAsmInfo.h:687
MCSymbolAttr getProtectedVisibilityAttr() const
Definition: MCAsmInfo.h:627
unsigned getAssemblerDialect() const
Definition: MCAsmInfo.h:560
bool useAssignmentForEHBegin() const
Definition: MCAsmInfo.h:543
bool usesCFIWithoutEH() const
Definition: MCAsmInfo.h:640
bool avoidWeakIfComdat() const
Definition: MCAsmInfo.h:617
bool isAIX() const
Definition: MCAsmInfo.h:519
MCSymbolAttr getHiddenDeclarationVisibilityAttr() const
Definition: MCAsmInfo.h:623
bool hasWeakDefCanBeHiddenDirective() const
Definition: MCAsmInfo.h:613
LCOMM::LCOMMType getLCOMMDirectiveAlignmentType() const
Definition: MCAsmInfo.h:601
bool needsDwarfSectionOffsetDirective() const
Definition: MCAsmInfo.h:513
bool doesSupportDebugInformation() const
Definition: MCAsmInfo.h:631
bool doesSetDirectiveSuppressReloc() const
Definition: MCAsmInfo.h:593
WinEH::EncodingType getWinEHEncodingType() const
Definition: MCAsmInfo.h:634
bool doesDwarfUseRelocationsAcrossSections() const
Definition: MCAsmInfo.h:658
bool hasSubsectionsViaSymbols() const
Definition: MCAsmInfo.h:457
bool isMachO() const
Definition: MCAsmInfo.h:521
bool usesWindowsCFI() const
Definition: MCAsmInfo.h:652
bool binutilsIsAtLeast(int Major, int Minor) const
Definition: MCAsmInfo.h:694
MCSymbolAttr getHiddenVisibilityAttr() const
Definition: MCAsmInfo.h:619
bool hasSingleParameterDotFile() const
Definition: MCAsmInfo.h:607
const char * getWeakRefDirective() const
Definition: MCAsmInfo.h:611
bool hasNoDeadStrip() const
Definition: MCAsmInfo.h:609
virtual MCSection * getNonexecutableStackSection(MCContext &Ctx) const
Targets can implement this method to specify a section to switch to if the translation unit doesn't h...
Definition: MCAsmInfo.h:470
ExceptionHandling getExceptionHandlingType() const
Definition: MCAsmInfo.h:633
bool needsLocalForSize() const
Definition: MCAsmInfo.h:544
bool hasFunctionAlignment() const
Definition: MCAsmInfo.h:605
bool hasIdentDirective() const
Definition: MCAsmInfo.h:608
unsigned getCodePointerSize() const
Get the code pointer size in bytes.
Definition: MCAsmInfo.h:443
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition: MCExpr.h:343
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Definition: MCExpr.h:428
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
const MCObjectFileInfo * getObjectFileInfo() const
Definition: MCContext.h:416
LLVM_ABI MCSectionMachO * getMachOSection(StringRef Segment, StringRef Section, unsigned TypeAndAttributes, unsigned Reserved2, SectionKind K, const char *BeginSymName=nullptr)
Return the MCSection for the specified mach-o section.
Definition: MCContext.cpp:533
LLVM_ABI MCSectionCOFF * getCOFFSection(StringRef Section, unsigned Characteristics, StringRef COMDATSymName, int Selection, unsigned UniqueID=MCSection::NonUniqueID)
Definition: MCContext.cpp:752
LLVM_ABI MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
Definition: MCContext.cpp:386
LLVM_ABI MCSymbol * createLinkerPrivateTempSymbol()
Create a new linker temporary symbol with the specified prefix (Name) or "tmp".
Definition: MCContext.cpp:376
MCSectionELF * getELFSection(const Twine &Section, unsigned Type, unsigned Flags)
Definition: MCContext.h:549
LLVM_ABI void reportWarning(SMLoc L, const Twine &Msg)
Definition: MCContext.cpp:1122
LLVM_ABI void reportError(SMLoc L, const Twine &Msg)
Definition: MCContext.cpp:1115
LLVM_ABI MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
Definition: MCContext.cpp:203
LLVM_ABI MCSymbol * createLinkerPrivateSymbol(const Twine &Name)
Definition: MCContext.cpp:380
LLVM_ABI MCSymbol * createNamedTempSymbol()
Create a temporary symbol with a unique name whose name cannot be omitted in the symbol table.
Definition: MCContext.cpp:388
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:34
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 * getRemarksSection() const
MCSection * getDrectveSection() 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 * getTextSection() const
MCSection * getDataSection() const
This represents a section on Windows.
Definition: MCSectionCOFF.h:27
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition: MCSection.h:496
bool isBssSection() const
Check whether this section is "virtual", that is has no actual object file contents.
Definition: MCSection.h:612
static constexpr unsigned NonUniqueID
Definition: MCSection.h:501
Streaming machine code generation interface.
Definition: MCStreamer.h:220
virtual void emitBinaryData(StringRef Data)
Functionally identical to EmitBytes.
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
virtual StringRef getMnemonic(const MCInst &MI) const
Returns the mnemonic for MI, if the streamer has access to a instruction printer and returns an empty...
Definition: MCStreamer.h:471
void emitZeros(uint64_t NumBytes)
Emit NumBytes worth of zeros.
Definition: MCStreamer.cpp:204
Generic base class for all target subtargets.
const Triple & getTargetTriple() const
const MCSchedModel & getSchedModel() const
Get the machine model for this subtarget's CPU.
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition: MCExpr.h:214
StringRef getSymbolTableName() const
Definition: MCSymbolXCOFF.h:68
bool hasRename() const
Definition: MCSymbolXCOFF.h:61
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:42
bool isDefined() const
isDefined - Check if this symbol is defined (i.e., it has an address).
Definition: MCSymbol.h:233
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:1077
const MDOperand & getOperand(unsigned I) const
Definition: Metadata.h:1445
ArrayRef< MDOperand > operands() const
Definition: Metadata.h:1443
Tracking metadata reference owned by Metadata.
Definition: Metadata.h:899
A single uniqued string.
Definition: Metadata.h:720
LLVM_ABI StringRef getString() const
Definition: Metadata.cpp:617
bool isInlineAsmBrIndirectTarget() const
Returns true if this is the indirect dest of an INLINEASM_BR.
unsigned pred_size() const
bool isEHPad() const
Returns true if the block is a landing pad.
LLVM_ABI MCSymbol * getSymbol() const
Return the MCSymbol for this basic block.
bool hasLabelMustBeEmitted() const
Test whether this block must have its label emitted.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
std::optional< UniqueBBID > getBBID() const
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI MCSymbol * getEHContSymbol() const
Return the Windows EH Continuation Symbol for this basic block.
unsigned getMaxBytesForAlignment() const
Return the maximum amount of padding allowed for aligning the basic block.
bool isIRBlockAddressTaken() const
Test whether this block is the target of an IR BlockAddress.
LLVM_ABI MCSymbol * getEndSymbol() const
Returns the MCSymbol marking the end of this basic block.
bool isEHFuncletEntry() const
Returns true if this is the entry block of an EH funclet.
bool sameSection(const MachineBasicBlock *MBB) const
Returns true if this and MBB belong to the same section.
unsigned succ_size() const
bool isReturnBlock() const
Convenience function that returns true if the block ends in a return instruction.
MBBSectionID getSectionID() const
Returns the section ID of this basic block.
LLVM_ABI bool isEntryBlock() const
Returns true if this is the entry block of the function.
BasicBlock * getAddressTakenIRBlock() const
Retrieves the BasicBlock which corresponds to this MachineBasicBlock.
LLVM_ABI bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB will be emitted immediately after this block, such that if this bloc...
instr_iterator instr_end()
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
bool isBeginSection() const
Returns true if this block begins any section.
iterator_range< iterator > terminators()
bool isEHContTarget() const
Returns true if this is a target of Windows EH Continuation Guard.
iterator_range< succ_iterator > successors()
reverse_iterator rbegin()
bool isMachineBlockAddressTaken() const
Test whether this block is used as something other than the target of a terminator,...
bool isEndSection() const
Returns true if this block ends any section.
Align getAlignment() const
Return alignment of the basic block.
LLVM_ABI StringRef getName() const
Return the name of the corresponding LLVM basic block, or an empty string.
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
LLVM_ABI BlockFrequency getBlockFreq(const MachineBasicBlock *MBB) const
getblockFreq - Return block frequency.
BranchProbability getEdgeProbability(const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const
This class is a data container for one entry in a MachineConstantPool.
union llvm::MachineConstantPoolEntry::@205 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.
unsigned getSizeInBytes(const DataLayout &DL) const
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
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool needsSplitStackProlog() const
Return true if this function requires a split stack prolog, even if it uses no stack space.
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects.
uint64_t getUnsafeStackSize() const
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
unsigned getFunctionNumber() const
getFunctionNumber - Return a unique ID for the current function.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
const std::vector< MCCFIInstruction > & getFrameInstructions() const
Returns a reference to a list of cfi instructions in the function's prologue.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
void setSection(MCSection *S)
Indicates the Section this function belongs to.
MCSymbol * getJTISymbol(unsigned JTI, MCContext &Ctx, bool isLinkerPrivate=false) const
getJTISymbol - Return the MCSymbol for the specified non-empty jump table.
const CallSiteInfoMap & getCallSitesInfo() const
reverse_iterator rbegin()
bool hasBBSections() const
Returns true if this function has basic block sections enabled.
MCContext & getContext() const
unsigned size() const
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
Align getAlignment() const
getAlignment - Return the alignment of the function.
Function & getFunction()
Return the LLVM function that this machine code represents.
const std::vector< LandingPadInfo > & getLandingPads() const
Return a reference to the landing pad info for the current function.
MCSection * getSection() const
Returns the Section this function belongs to.
const MachineBasicBlock & back() const
bool shouldSplitStack() const
Should we be emitting segmented stack stuff for the function.
MachineConstantPool * getConstantPool()
getConstantPool - Return the constant pool object for the current function.
const MachineBasicBlock & front() const
const MachineJumpTableInfo * getJumpTableInfo() const
getJumpTableInfo - Return the jump table info object for the current function.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Representation of each machine instruction.
Definition: MachineInstr.h:72
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.
JTEntryKind getEntryKind() const
const std::vector< MachineJumpTableEntry > & getJumpTables() const
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
const MCContext & getContext() const
const Module * getModule() const
Ty & getObjFileInfo()
Keep track of various per-module pieces of information for backends that would like to do so.
MachineOperand class - Representation of each machine instruction operand.
@ MO_Immediate
Immediate operand.
@ MO_CImmediate
Immediate >64bit operand.
@ MO_FrameIndex
Abstract Stack Frame Index.
@ MO_Register
Register operand.
@ MO_TargetIndex
Target-dependent index+offset operand.
@ MO_FPImmediate
Floating-point immediate operand.
Diagnostic information for optimization analysis remarks.
LLVM_ABI void emit(DiagnosticInfoOptimizationBase &OptDiag)
Emit an optimization remark.
bool allowExtraAnalysis(StringRef PassName) const
Whether we allow for extra compile-time budget to perform more analysis to be more informative.
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
This class implements a map that also provides access to all stored values in a deterministic order.
Definition: MapVector.h:36
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:67
StringRef getName() const
Get a short "name" for the module.
Definition: Module.h:269
const DataLayout & getDataLayout() const
Get the data layout for the module's target platform.
Definition: Module.h:278
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
Definition: Module.cpp:352
A tuple of MDNodes.
Definition: Metadata.h:1753
LLVM_ABI unsigned getNumOperands() const
Definition: Metadata.cpp:1461
iterator_range< op_iterator > operands()
Definition: Metadata.h:1849
Wrapper for a value that won't be replaced with a CFI jump table pointer in LowerTypeTestsModule.
Definition: Constants.h:991
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
Definition: DerivedTypes.h:720
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
static iterator_range< iterator > entries()
Definition: Registry.h:113
SimpleRegistryEntry< T > entry
Definition: Registry.h:47
Represents a location in source code.
Definition: SMLoc.h:23
SectionKind - This is a simple POD value that classifies the properties of a section.
Definition: SectionKind.h:22
bool isCommon() const
Definition: SectionKind.h:173
bool isBSS() const
Definition: SectionKind.h:169
static SectionKind getReadOnlyWithRel()
Definition: SectionKind.h:214
bool isBSSLocal() const
Definition: SectionKind.h:170
bool isThreadBSS() const
Definition: SectionKind.h:161
bool isThreadLocal() const
Definition: SectionKind.h:157
bool isThreadData() const
Definition: SectionKind.h:162
static SectionKind getReadOnly()
Definition: SectionKind.h:192
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:401
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:541
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition: SmallString.h:26
bool empty() const
Definition: SmallVector.h:82
size_t size() const
Definition: SmallVector.h:79
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:938
void push_back(const T &Elt)
Definition: SmallVector.h:414
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
LLVM_ABI void serializeToStackMapSection()
If there is any stack map data, create a stack map section and serialize the map info into it.
Definition: StackMaps.cpp:713
int64_t getFixed() const
Returns the fixed component of the stack.
Definition: TypeSize.h:50
LLVM_ABI StringRef getConstantSectionPrefix(const Constant *C, const ProfileSummaryInfo *PSI) const
Return a section prefix for the constant C based on its profile count.
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition: StringRef.h:581
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
Definition: StringRef.h:434
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
Definition: StringRef.h:301
Used to lazily calculate structure layout information for a target machine, based on the DataLayout s...
Definition: DataLayout.h:626
TypeSize getSizeInBytes() const
Definition: DataLayout.h:635
TypeSize getElementOffset(unsigned Idx) const
Definition: DataLayout.h:657
Class to represent struct types.
Definition: DerivedTypes.h:218
unsigned getNumElements() const
Random access to the elements.
Definition: DerivedTypes.h:368
Information about stack frame layout on the target.
virtual StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, Register &FrameReg) const
getFrameIndexReference - This method should return the base register and offset used to reference a f...
TargetInstrInfo - Interface to description of machine instruction set.
virtual MCInst getNop() const
Return the noop instruction to use for a noop.
Align getMinFunctionAlignment() const
Return the minimum function alignment.
virtual 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 MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const
virtual bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const
virtual const MCExpr * getIndirectSymViaGOTPCRel(const GlobalValue *GV, const MCSymbol *Sym, const MCValue &MV, int64_t Offset, MachineModuleInfo *MMI, MCStreamer &Streamer) const
Get the target specific PC relative GOT entry relocation.
virtual void emitModuleMetadata(MCStreamer &Streamer, Module &M) const
Emit the module-level metadata that the platform cares about.
bool hasPLTPCRelative() const
Target supports a PC-relative relocation that references the PLT of a function.
virtual MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment) const
Given a constant with the SectionKind, return a section that it should be placed in.
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...
virtual MCSection * getStaticCtorSection(unsigned Priority, const MCSymbol *KeySym) const
bool supportGOTPCRelWithOffset() const
Target GOT "PC"-relative relocation supports encoding an additional binary expression with an offset?
bool supportIndirectSymViaGOTPCRel() const
Target supports replacing a data "PC"-relative access to a symbol through another symbol,...
virtual MCSymbol * getFunctionEntryPointSymbol(const GlobalValue *Func, const TargetMachine &TM) const
If supported, return the function entry point symbol.
MCSection * SectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const
This method computes the appropriate section to emit the specified global variable or function defini...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual const MCExpr * getPICJumpTableRelocBaseExpr(const MachineFunction *MF, unsigned JTI, MCContext &Ctx) const
This returns the relocation base for the given PIC jumptable, the same as getPICJumpTableRelocBase,...
virtual const MCExpr * LowerCustomJumpTableEntry(const MachineJumpTableInfo *, const MachineBasicBlock *, unsigned, MCContext &) const
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:83
bool isPositionIndependent() const
virtual bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const
Returns true if a cast between SrcAS and DestAS is a noop.
const Triple & getTargetTriple() const
const MCSubtargetInfo * getMCSubtargetInfo() const
bool useEmulatedTLS() const
Returns true if this target uses emulated TLS.
unsigned getPointerSize(unsigned AS) const
Get the pointer size for this target.
virtual TargetLoweringObjectFile * getObjFileLowering() const
Reloc::Model getRelocationModel() const
Returns the code generation relocation model.
virtual const TargetSubtargetInfo * getSubtargetImpl(const Function &) const
Virtual method implemented by subclasses that returns a reference to that target's TargetSubtargetInf...
TargetOptions Options
MCSymbol * getSymbol(const GlobalValue *GV) const
unsigned getProgramPointerSize() const
CodeModel::Model getCodeModel() const
Returns the code model.
void getNameWithPrefix(SmallVectorImpl< char > &Name, const GlobalValue *GV, Mangler &Mang, bool MayAlwaysUsePrivate=false) const
const MCAsmInfo * getMCAsmInfo() const
Return target specific asm information.
unsigned EmitStackSizeSection
Emit section containing metadata on function stack sizes.
unsigned EmitAddrsig
Emit address-significance table.
unsigned UseInitArray
UseInitArray - Use .init_array instead of .ctors for static constructors.
MCTargetOptions MCOptions
Machine level options.
unsigned ForceDwarfFrameSection
Emit DWARF debug frame section.
unsigned EnableStaticDataPartitioning
Enables the StaticDataSplitter pass.
std::string StackUsageOutput
Name of the stack usage file (i.e., .su file) if user passes -fstack-usage.
unsigned XRayFunctionIndex
Emit XRay Function Index section.
unsigned EmitCallGraphSection
Emit section containing call graph metadata.
TargetSubtargetInfo - Generic base class for all target subtargets.
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...
Definition: TinyPtrVector.h:29
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:47
bool isOSBinFormatMachO() const
Tests whether the environment is MachO.
Definition: Triple.h:779
bool isOSBinFormatCOFF() const
Tests whether the OS uses the COFF binary format.
Definition: Triple.h:771
bool isUEFI() const
Tests whether the OS is UEFI.
Definition: Triple.h:671
bool isOSWindows() const
Tests whether the OS is Windows.
Definition: Triple.h:676
bool isOSBinFormatXCOFF() const
Tests whether the OS uses the XCOFF binary format.
Definition: Triple.h:789
bool isOSAIX() const
Tests whether the OS is AIX.
Definition: Triple.h:757
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
Definition: Triple.h:766
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:45
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
Definition: Type.h:153
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
Definition: Type.h:145
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
Definition: Type.h:165
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
Definition: Type.h:311
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
Definition: Type.h:142
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
Definition: Type.h:156
bool isFunctionTy() const
True if this is an instance of FunctionType.
Definition: Type.h:258
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false, bool NoDetails=false) const
Print the current type.
Value * getOperand(unsigned i) const
Definition: User.h:232
unsigned getNumOperands() const
Definition: User.h:254
Value * operator=(Value *RHS)
Definition: ValueHandle.h:70
LLVM Value Representation.
Definition: Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:256
LLVM_ABI std::string getNameOrAsOperand() const
Definition: Value.cpp:457
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition: Value.h:439
iterator_range< user_iterator > users()
Definition: Value.h:426
User * user_back()
Definition: Value.h:412
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.
Definition: AsmWriter.cpp:5305
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition: Value.cpp:701
bool use_empty() const
Definition: Value.h:346
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
Definition: Value.cpp:1098
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition: Value.cpp:322
reverse_self_iterator getReverseIterator()
Definition: ilist_node.h:137
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.
Definition: raw_ostream.h:662
A raw_ostream that writes to an SmallVector or SmallString.
Definition: raw_ostream.h:692
std::optional< StringRef > getFilename() const
Return the filename that the remark diagnostics are emitted to.
bool needsSection() const
Check if the remarks also need to have associated metadata in a section.
remarks::RemarkSerializer & getSerializer()
Return the serializer used for this stream.
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.
@ 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
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
@ SHT_LLVM_JT_SIZES
Definition: ELF.h:1181
@ SHT_PROGBITS
Definition: ELF.h:1140
@ SHT_LLVM_SYMPART
Definition: ELF.h:1173
@ SHF_ALLOC
Definition: ELF.h:1240
@ SHF_LINK_ORDER
Definition: ELF.h:1255
@ SHF_GROUP
Definition: ELF.h:1262
@ SHF_WRITE
Definition: ELF.h:1237
@ S_ATTR_LIVE_SUPPORT
S_ATTR_LIVE_SUPPORT - Blocks are live if they reference live blocks.
Definition: MachO.h:202
@ Itanium
Windows CE ARM, PowerPC, SH3, SH4.
@ X86
Windows x64, Windows Itanium (IA-64)
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
Definition: CommandLine.h:712
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:444
@ CommaSeparated
Definition: CommandLine.h:164
uint8_t getUnitLengthFieldByteSize(DwarfFormat Format)
Get the byte size of the unit length field depending on the DWARF format.
Definition: Dwarf.h:1119
@ DWARF64
Definition: Dwarf.h:92
uint8_t getDwarfOffsetByteSize(DwarfFormat Format)
The size of a reference determined by the DWARF 32/64-bit format.
Definition: Dwarf.h:1080
DiagnosticInfoOptimizationBase::Argument NV
uint64_t MD5Hash(const FunctionId &Obj)
Definition: FunctionId.h:167
LLVM_ABI void make_absolute(const Twine &current_directory, SmallVectorImpl< char > &path)
Make path an absolute path.
Definition: Path.cpp:906
@ OF_Text
The file should be opened in text mode on platforms like z/OS that make this distinction.
Definition: FileSystem.h:762
LLVM_ABI StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
Definition: Path.cpp:577
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:477
void stable_sort(R &&Range)
Definition: STLExtras.h:2077
int popcount(T Value) noexcept
Count the number of set bits in a value.
Definition: bit.h:307
ExceptionHandling
Definition: CodeGen.h:53
@ SjLj
setjmp/longjmp based exceptions
@ ZOS
z/OS MVS Exception Handling.
@ None
No exception support.
@ AIX
AIX Exception Handling.
@ DwarfCFI
DWARF-like instruction based exceptions.
@ WinEH
Windows Exception Handling.
@ Wasm
WebAssembly Exception Handling.
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:2155
@ MCDR_DataRegionEnd
.end_data_region
Definition: MCDirectives.h:58
@ MCDR_DataRegionJT32
.data_region jt32
Definition: MCDirectives.h:57
bool isNoOpWithoutInvoke(EHPersonality Pers)
Return true if this personality may be safely removed if there are no invoke instructions remaining i...
LLVM_ABI Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
auto reverse(ContainerTy &&C)
Definition: STLExtras.h:428
void sort(IteratorTy Start, IteratorTy End)
Definition: STLExtras.h:1669
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition: Error.cpp:167
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...
Definition: SmallVector.h:1300
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
Definition: Format.h:126
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.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition: Alignment.h:155
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:223
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:1886
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.
MCSymbolAttr
Definition: MCDirectives.h:18
@ MCSA_Local
.local (ELF)
Definition: MCDirectives.h:38
@ MCSA_WeakDefAutoPrivate
.weak_def_can_be_hidden (MachO)
Definition: MCDirectives.h:48
@ MCSA_Memtag
.memtag (ELF)
Definition: MCDirectives.h:50
@ MCSA_WeakReference
.weak_reference (MachO)
Definition: MCDirectives.h:47
@ MCSA_AltEntry
.alt_entry (MachO)
Definition: MCDirectives.h:41
@ MCSA_ELF_TypeIndFunction
.type _foo, STT_GNU_IFUNC
Definition: MCDirectives.h:24
@ MCSA_Weak
.weak
Definition: MCDirectives.h:45
@ MCSA_WeakDefinition
.weak_definition (MachO)
Definition: MCDirectives.h:46
@ MCSA_Global
.type _foo, @gnu_unique_object
Definition: MCDirectives.h:30
@ MCSA_Cold
.cold (MachO)
Definition: MCDirectives.h:22
@ MCSA_ELF_TypeObject
.type _foo, STT_OBJECT # aka @object
Definition: MCDirectives.h:25
@ MCSA_ELF_TypeFunction
.type _foo, STT_FUNC # aka @function
Definition: MCDirectives.h:23
@ MCSA_Invalid
Not a valid directive.
Definition: MCDirectives.h:19
@ MCSA_NoDeadStrip
.no_dead_strip (MachO)
Definition: MCDirectives.h:39
constexpr const char * PseudoProbeDescMetadataName
Definition: PseudoProbe.h:26
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition: Error.cpp:180
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:856
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:858
#define N
#define NC
Definition: regutils.h:42
static constexpr roundingMode rmNearestTiesToEven
Definition: APFloat.h:304
static LLVM_ABI const fltSemantics & IEEEdouble() LLVM_READNONE
Definition: APFloat.cpp:267
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
Map a basic block section ID to the begin and end symbols of that section which determine the section...
Definition: AsmPrinter.h:153
llvm.global_ctors and llvm.global_dtors are arrays of Structor structs.
Definition: AsmPrinter.h:536
LLVM_ABI void emit(int, MCStreamer *) const
Description of the encoding of one expression Op.
Machine model for scheduling, bundling, and heuristics.
Definition: MCSchedule.h:258
static LLVM_ABI int computeInstrLatency(const MCSubtargetInfo &STI, const MCSchedClassDesc &SCDesc)
Returns the latency value for the scheduling class.
Definition: MCSchedule.cpp:43
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition: Alignment.h:117
A helper struct providing information about the byte size of DW_FORM values that vary in size dependi...
Definition: Dwarf.h:1093
This is the base class for a remark serializer.
virtual std::unique_ptr< MetaSerializer > metaSerializer(raw_ostream &OS, std::optional< StringRef > ExternalFilename=std::nullopt)=0
Return the corresponding metadata serializer.