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