Thanks to visit codestin.com
Credit goes to llvm.org

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