LLVM 22.0.0git
TargetLoweringObjectFile.cpp
Go to the documentation of this file.
1//===-- llvm/Target/TargetLoweringObjectFile.cpp - Object File Info -------===//
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 classes used to handle lowerings specific to common
10// object file formats.
11//
12//===----------------------------------------------------------------------===//
13
16#include "llvm/IR/Constants.h"
17#include "llvm/IR/DataLayout.h"
19#include "llvm/IR/Function.h"
21#include "llvm/IR/Mangler.h"
22#include "llvm/IR/Module.h"
23#include "llvm/MC/MCAsmInfo.h"
24#include "llvm/MC/MCContext.h"
25#include "llvm/MC/MCExpr.h"
26#include "llvm/MC/MCStreamer.h"
27#include "llvm/MC/SectionKind.h"
31using namespace llvm;
32
33//===----------------------------------------------------------------------===//
34// Generic Code
35//===----------------------------------------------------------------------===//
36
37/// Initialize - this method must be called before any actual lowering is
38/// done. This specifies the current context for codegen, and gives the
39/// lowering implementations a chance to set up their default sections.
41 const TargetMachine &TM) {
42 // `Initialize` can be called more than once.
43 delete Mang;
44 Mang = new Mangler();
45 initMCObjectFileInfo(ctx, TM.isPositionIndependent(),
46 TM.getCodeModel() == CodeModel::Large);
47
48 // Reset various EH DWARF encodings.
51
52 this->TM = &TM;
53}
54
58
60 // If target does not have LEB128 directives, we would need the
61 // call site encoding to be udata4 so that the alternative path
62 // for not having LEB128 directives could work.
63 if (!getContext().getAsmInfo()->hasLEB128Directives())
65 return CallSiteEncoding;
66}
67
68static bool isNullOrUndef(const Constant *C) {
69 // Check that the constant isn't all zeros or undefs.
70 if (C->isNullValue() || isa<UndefValue>(C))
71 return true;
73 return false;
74 for (const auto *Operand : C->operand_values()) {
75 if (!isNullOrUndef(cast<Constant>(Operand)))
76 return false;
77 }
78 return true;
79}
80
81static bool isSuitableForBSS(const GlobalVariable *GV) {
82 const Constant *C = GV->getInitializer();
83
84 // Must have zero initializer.
85 if (!isNullOrUndef(C))
86 return false;
87
88 // Leave constant zeros in readonly constant sections, so they can be shared.
89 if (GV->isConstant())
90 return false;
91
92 // If the global has an explicit section specified, don't put it in BSS.
93 if (GV->hasSection())
94 return false;
95
96 // Otherwise, put it in BSS!
97 return true;
98}
99
100/// IsNullTerminatedString - Return true if the specified constant (which is
101/// known to have a type that is an array of 1/2/4 byte elements) ends with a
102/// nul value and contains no other nuls in it. Note that this is more general
103/// than ConstantDataSequential::isString because we allow 2 & 4 byte strings.
104static bool IsNullTerminatedString(const Constant *C) {
105 // First check: is we have constant array terminated with zero
107 uint64_t NumElts = CDS->getNumElements();
108 assert(NumElts != 0 && "Can't have an empty CDS");
109
110 if (CDS->getElementAsInteger(NumElts-1) != 0)
111 return false; // Not null terminated.
112
113 // Verify that the null doesn't occur anywhere else in the string.
114 for (uint64_t i = 0; i != NumElts - 1; ++i)
115 if (CDS->getElementAsInteger(i) == 0)
116 return false;
117 return true;
118 }
119
120 // Another possibility: [1 x i8] zeroinitializer
122 return cast<ArrayType>(C->getType())->getNumElements() == 1;
123
124 return false;
125}
126
128 const GlobalValue *GV, StringRef Suffix, const TargetMachine &TM) const {
129 assert(!Suffix.empty());
130
131 SmallString<60> NameStr;
132 NameStr += GV->getDataLayout().getPrivateGlobalPrefix();
133 TM.getNameWithPrefix(NameStr, GV, *Mang);
134 NameStr.append(Suffix.begin(), Suffix.end());
135 return getContext().getOrCreateSymbol(NameStr);
136}
137
139 const GlobalValue *GV, const TargetMachine &TM,
140 MachineModuleInfo *MMI) const {
141 return TM.getSymbol(GV);
142}
143
145 MCStreamer &Streamer, const DataLayout &, const MCSymbol *Sym,
146 const MachineModuleInfo *MMI) const {}
147
149 Module &M) const {
152 M.getModuleFlagsMetadata(ModuleFlags);
153
154 MDNode *CGProfile = nullptr;
155
156 for (const auto &MFE : ModuleFlags) {
157 StringRef Key = MFE.Key->getString();
158 if (Key == "CG Profile") {
159 CGProfile = cast<MDNode>(MFE.Val);
160 break;
161 }
162 }
163
164 if (!CGProfile)
165 return;
166
167 auto GetSym = [this](const MDOperand &MDO) -> MCSymbol * {
168 if (!MDO)
169 return nullptr;
170 auto *V = cast<ValueAsMetadata>(MDO);
171 const Function *F = cast<Function>(V->getValue()->stripPointerCasts());
172 if (F->hasDLLImportStorageClass())
173 return nullptr;
174 return TM->getSymbol(F);
175 };
176
177 for (const auto &Edge : CGProfile->operands()) {
178 MDNode *E = cast<MDNode>(Edge);
179 const MCSymbol *From = GetSym(E->getOperand(0));
180 const MCSymbol *To = GetSym(E->getOperand(1));
181 // Skip null functions. This can happen if functions are dead stripped after
182 // the CGProfile pass has been run.
183 if (!From || !To)
184 continue;
185 uint64_t Count = cast<ConstantAsMetadata>(E->getOperand(2))
186 ->getValue()
187 ->getUniqueInteger()
188 .getZExtValue();
191 }
192}
193
195 MCStreamer &Streamer, Module &M,
196 std::function<void(MCStreamer &Streamer)> COMDATSymEmitter) const {
197 NamedMDNode *FuncInfo = M.getNamedMetadata(PseudoProbeDescMetadataName);
198 if (!FuncInfo)
199 return;
200
201 // Emit a descriptor for every function including functions that have an
202 // available external linkage. We may not want this for imported functions
203 // that has code in another thinLTO module but we don't have a good way to
204 // tell them apart from inline functions defined in header files. Therefore
205 // we put each descriptor in a separate comdat section and rely on the
206 // linker to deduplicate.
207 auto &C = getContext();
208 for (const auto *Operand : FuncInfo->operands()) {
209 const auto *MD = cast<MDNode>(Operand);
210 auto *GUID = mdconst::extract<ConstantInt>(MD->getOperand(0));
211 auto *Hash = mdconst::extract<ConstantInt>(MD->getOperand(1));
212 auto *Name = cast<MDString>(MD->getOperand(2));
213 auto *S = C.getObjectFileInfo()->getPseudoProbeDescSection(
214 TM->getFunctionSections() ? Name->getString() : StringRef());
215
216 Streamer.switchSection(S);
217
218 // emit COFF COMDAT symbol.
219 if (COMDATSymEmitter)
220 COMDATSymEmitter(Streamer);
221
222 Streamer.emitInt64(GUID->getZExtValue());
223 Streamer.emitInt64(Hash->getZExtValue());
224 Streamer.emitULEB128IntValue(Name->getString().size());
225 Streamer.emitBytes(Name->getString());
226 }
227}
228
229/// getKindForGlobal - This is a top-level target-independent classifier for
230/// a global object. Given a global variable and information from the TM, this
231/// function classifies the global in a target independent manner. This function
232/// may be overridden by the target implementation.
234 const TargetMachine &TM){
236 "Can only be used for global definitions");
237
238 // Functions are classified as text sections.
239 if (isa<Function>(GO))
240 return SectionKind::getText();
241
242 // Basic blocks are classified as text sections.
243 if (isa<BasicBlock>(GO))
244 return SectionKind::getText();
245
246 // Global variables require more detailed analysis.
247 const auto *GVar = cast<GlobalVariable>(GO);
248
249 // Handle thread-local data first.
250 if (GVar->isThreadLocal()) {
251 if (isSuitableForBSS(GVar) && !TM.Options.NoZerosInBSS) {
252 // Zero-initialized TLS variables with local linkage always get classified
253 // as ThreadBSSLocal.
254 if (GVar->hasLocalLinkage()) {
256 }
258 }
260 }
261
262 // Variables with common linkage always get classified as common.
263 if (GVar->hasCommonLinkage())
264 return SectionKind::getCommon();
265
266 // Most non-mergeable zero data can be put in the BSS section unless otherwise
267 // specified.
268 if (isSuitableForBSS(GVar) && !TM.Options.NoZerosInBSS) {
269 if (GVar->hasLocalLinkage())
271 else if (GVar->hasExternalLinkage())
273 return SectionKind::getBSS();
274 }
275
276 // Global variables with '!exclude' should get the exclude section kind if
277 // they have an explicit section and no other metadata.
278 if (GVar->hasSection())
279 if (MDNode *MD = GVar->getMetadata(LLVMContext::MD_exclude))
280 if (!MD->getNumOperands())
282
283 // If the global is marked constant, we can put it into a mergable section,
284 // a mergable string section, or general .data if it contains relocations.
285 if (GVar->isConstant()) {
286 // If the initializer for the global contains something that requires a
287 // relocation, then we may have to drop this into a writable data section
288 // even though it is marked const.
289 const Constant *C = GVar->getInitializer();
290 if (!C->needsRelocation()) {
291 // If the global is required to have a unique address, it can't be put
292 // into a mergable section: just drop it into the general read-only
293 // section instead.
294 if (!GVar->hasGlobalUnnamedAddr())
296
297 // If initializer is a null-terminated string, put it in a "cstring"
298 // section of the right width.
299 if (ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) {
300 if (IntegerType *ITy =
301 dyn_cast<IntegerType>(ATy->getElementType())) {
302 if ((ITy->getBitWidth() == 8 || ITy->getBitWidth() == 16 ||
303 ITy->getBitWidth() == 32) &&
305 if (ITy->getBitWidth() == 8)
307 if (ITy->getBitWidth() == 16)
309
310 assert(ITy->getBitWidth() == 32 && "Unknown width");
312 }
313 }
314 }
315
316 // Otherwise, just drop it into a mergable constant section. If we have
317 // a section for this size, use it, otherwise use the arbitrary sized
318 // mergable section.
319 switch (
320 GVar->getDataLayout().getTypeAllocSize(C->getType())) {
321 case 4: return SectionKind::getMergeableConst4();
322 case 8: return SectionKind::getMergeableConst8();
323 case 16: return SectionKind::getMergeableConst16();
324 case 32: return SectionKind::getMergeableConst32();
325 default:
327 }
328
329 } else {
330 // In static, ROPI and RWPI relocation models, the linker will resolve
331 // all addresses, so the relocation entries will actually be constants by
332 // the time the app starts up. However, we can't put this into a
333 // mergable section, because the linker doesn't take relocations into
334 // consideration when it tries to merge entries in the section.
335 Reloc::Model ReloModel = TM.getRelocationModel();
336 if (ReloModel == Reloc::Static || ReloModel == Reloc::ROPI ||
337 ReloModel == Reloc::RWPI || ReloModel == Reloc::ROPI_RWPI ||
338 !C->needsDynamicRelocation())
340
341 // Otherwise, the dynamic linker needs to fix it up, put it in the
342 // writable data.rel section.
344 }
345 }
346
347 // Okay, this isn't a constant.
348 return SectionKind::getData();
349}
350
351/// This method computes the appropriate section to emit the specified global
352/// variable or function definition. This should not be passed external (or
353/// available externally) globals.
355 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
356 // Select section name.
357 if (GO->hasSection())
358 return getExplicitSectionGlobal(GO, Kind, TM);
359
360 if (auto *GVar = dyn_cast<GlobalVariable>(GO)) {
361 auto Attrs = GVar->getAttributes();
362 if ((Attrs.hasAttribute("bss-section") && Kind.isBSS()) ||
363 (Attrs.hasAttribute("data-section") && Kind.isData()) ||
364 (Attrs.hasAttribute("relro-section") && Kind.isReadOnlyWithRel()) ||
365 (Attrs.hasAttribute("rodata-section") && Kind.isReadOnly())) {
366 return getExplicitSectionGlobal(GO, Kind, TM);
367 }
368 }
369
370 // Use default section depending on the 'type' of global
371 return SelectSectionForGlobal(GO, Kind, TM);
372}
373
374/// This method computes the appropriate section to emit the specified global
375/// variable or function definition. This should not be passed external (or
376/// available externally) globals.
377MCSection *
382
384 const Function &F, const TargetMachine &TM) const {
385 return getSectionForJumpTable(F, TM, /*JTE=*/nullptr);
386}
387
389 const Function &F, const TargetMachine &TM,
390 const MachineJumpTableEntry *JTE) const {
391 Align Alignment(1);
392 return getSectionForConstant(F.getDataLayout(),
393 SectionKind::getReadOnly(), /*C=*/nullptr,
394 Alignment);
395}
396
398 bool UsesLabelDifference, const Function &F) const {
399 // In PIC mode, we need to emit the jump table to the same section as the
400 // function body itself, otherwise the label differences won't make sense.
401 // FIXME: Need a better predicate for this: what about custom entries?
402 if (UsesLabelDifference)
403 return true;
404
405 // We should also do if the section name is NULL or function is declared
406 // in discardable section
407 // FIXME: this isn't the right predicate, should be based on the MCSection
408 // for the function.
409 return F.isWeakForLinker();
410}
411
412/// Given a mergable constant with the specified size and relocation
413/// information, return a section that it should be placed in.
415 const DataLayout &DL, SectionKind Kind, const Constant *C,
416 Align &Alignment) const {
417 if (Kind.isReadOnly() && ReadOnlySection != nullptr)
418 return ReadOnlySection;
419
420 return DataSection;
421}
422
424 const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment,
425 StringRef SectionPrefix) const {
426 // Fallback to `getSectionForConstant` without `SectionPrefix` parameter if it
427 // is empty.
428 if (SectionPrefix.empty())
429 return getSectionForConstant(DL, Kind, C, Alignment);
431 "TargetLoweringObjectFile::getSectionForConstant that "
432 "accepts SectionPrefix is not implemented for the object file format");
433}
434
440
442 const Function &F, const TargetMachine &TM) const {
443 return nullptr;
444}
445
446/// getTTypeGlobalReference - Return an MCExpr to use for a
447/// reference to the specified global variable from exception
448/// handling information.
450 const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM,
451 MachineModuleInfo *MMI, MCStreamer &Streamer) const {
452 const MCSymbolRefExpr *Ref =
453 MCSymbolRefExpr::create(TM.getSymbol(GV), getContext());
454
455 return getTTypeReference(Ref, Encoding, Streamer);
456}
457
459getTTypeReference(const MCSymbolRefExpr *Sym, unsigned Encoding,
460 MCStreamer &Streamer) const {
461 switch (Encoding & 0x70) {
462 default:
463 report_fatal_error("We do not support this DWARF encoding yet!");
465 // Do nothing special
466 return Sym;
468 // Emit a label to the streamer for the current position. This gives us
469 // .-foo addressing.
471 Streamer.emitLabel(PCSym);
472 const MCExpr *PC = MCSymbolRefExpr::create(PCSym, getContext());
473 return MCBinaryExpr::createSub(Sym, PC, getContext());
474 }
475 }
476}
477
479 // FIXME: It's not clear what, if any, default this should have - perhaps a
480 // null return could mean 'no location' & we should just do that here.
481 return MCSymbolRefExpr::create(Sym, getContext());
482}
483
485 SmallVectorImpl<char> &OutName, const GlobalValue *GV,
486 const TargetMachine &TM) const {
487 Mang->getNameWithPrefix(OutName, GV, /*CannotUsePrivateLabel=*/false);
488}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file contains constants used for implementing Dwarf debug support.
Module.h This file contains the declarations for the Module class.
#define F(x, y, z)
Definition MD5.cpp:55
static bool isNullOrUndef(const Constant *C)
static bool IsNullTerminatedString(const Constant *C)
IsNullTerminatedString - Return true if the specified constant (which is known to have a type that is...
static bool isSuitableForBSS(const GlobalVariable *GV)
Class to represent array types.
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
Definition Constants.h:593
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
StringRef getPrivateGlobalPrefix() const
Definition DataLayout.h:286
bool hasSection() const
Check if this global has a custom object file section.
bool isDeclarationForLinker() const
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this global belongs to.
Definition Globals.cpp:132
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
Class to represent integer types.
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Definition MCExpr.h:428
Context object for machine code objects.
Definition MCContext.h:83
LLVM_ABI MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
LLVM_ABI MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
void initMCObjectFileInfo(MCContext &MCCtx, bool PIC, bool LargeCodeModel=false)
MCSection * ReadOnlySection
Section that is readonly and can contain arbitrary initialized data.
MCContext & getContext() const
MCSection * DataSection
Section directive for standard data.
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition MCSection.h:496
Streaming machine code generation interface.
Definition MCStreamer.h:220
virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
virtual void emitCGProfileEntry(const MCSymbolRefExpr *From, const MCSymbolRefExpr *To, uint64_t Count)
unsigned emitULEB128IntValue(uint64_t Value, unsigned PadTo=0)
Special case of EmitULEB128Value that avoids the client having to pass in a MCExpr for constant integ...
void emitInt64(uint64_t Value)
Definition MCStreamer.h:751
virtual void switchSection(MCSection *Section, uint32_t Subsec=0)
Set the current section where code is being emitted to Section.
virtual void emitBytes(StringRef Data)
Emit the bytes in Data into the output.
Represent a reference to a symbol from inside an expression.
Definition MCExpr.h:190
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.h:214
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
Metadata node.
Definition Metadata.h:1077
ArrayRef< MDOperand > operands() const
Definition Metadata.h:1443
Tracking metadata reference owned by Metadata.
Definition Metadata.h:899
This class contains meta information specific to a module.
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:1753
iterator_range< op_iterator > operands()
Definition Metadata.h:1849
SectionKind - This is a simple POD value that classifies the properties of a section.
Definition SectionKind.h:22
static SectionKind getThreadData()
static SectionKind getBSSExtern()
static SectionKind getMergeable2ByteCString()
static SectionKind getExclude()
static SectionKind getBSSLocal()
static SectionKind getMergeableConst4()
static SectionKind getCommon()
static SectionKind getText()
static SectionKind getThreadBSSLocal()
static SectionKind getReadOnlyWithRel()
static SectionKind getData()
static SectionKind getMergeableConst8()
static SectionKind getBSS()
static SectionKind getThreadBSS()
static SectionKind getMergeableConst16()
static SectionKind getMergeable4ByteCString()
static SectionKind getMergeable1ByteCString()
static SectionKind getReadOnly()
static SectionKind getMergeableConst32()
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
void append(StringRef RHS)
Append from a StringRef.
Definition SmallString.h:68
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:151
iterator begin() const
Definition StringRef.h:120
iterator end() const
Definition StringRef.h:122
void emitCGProfileMetadata(MCStreamer &Streamer, Module &M) const
Emit Call Graph Profile metadata.
virtual void getNameWithPrefix(SmallVectorImpl< char > &OutName, const GlobalValue *GV, const TargetMachine &TM) const
unsigned PersonalityEncoding
PersonalityEncoding, LSDAEncoding, TTypeEncoding - Some encoding values for EH.
static SectionKind getKindForGlobal(const GlobalObject *GO, const TargetMachine &TM)
Classify the specified global variable into a set of target independent categories embodied in Sectio...
virtual MCSection * getSectionForJumpTable(const Function &F, const TargetMachine &TM) const
virtual bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const
virtual MCSymbol * getCFIPersonalitySymbol(const GlobalValue *GV, const TargetMachine &TM, MachineModuleInfo *MMI) const
virtual void Initialize(MCContext &ctx, const TargetMachine &TM)
This method must be called before any actual lowering is done.
virtual MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const =0
virtual MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment) const
Given a constant with the SectionKind, return a section that it should be placed in.
MCSymbol * getSymbolWithGlobalValueBase(const GlobalValue *GV, StringRef Suffix, const TargetMachine &TM) const
Return the MCSymbol for a private symbol with global value name as its base, with the specified suffi...
virtual MCSection * getSectionForMachineBasicBlock(const Function &F, const MachineBasicBlock &MBB, const TargetMachine &TM) const
virtual const MCExpr * getDebugThreadLocalSymbol(const MCSymbol *Sym) const
Create a symbol reference to describe the given TLS variable when emitting the address in debug info.
virtual const MCExpr * getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM, MachineModuleInfo *MMI, MCStreamer &Streamer) const
Return an MCExpr to use for a reference to the specified global variable from exception handling info...
virtual MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const =0
Targets should implement this method to assign a section to globals with an explicit section specfied...
void emitPseudoProbeDescMetadata(MCStreamer &Streamer, Module &M, std::function< void(MCStreamer &Streamer)> COMDATSymEmitter=nullptr) const
Emit pseudo_probe_desc metadata.
const MCExpr * getTTypeReference(const MCSymbolRefExpr *Sym, unsigned Encoding, MCStreamer &Streamer) const
virtual void emitPersonalityValue(MCStreamer &Streamer, const DataLayout &TM, const MCSymbol *Sym, const MachineModuleInfo *MMI) const
virtual MCSection * getUniqueSectionForFunction(const Function &F, const TargetMachine &TM) const
MCSection * SectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const
This method computes the appropriate section to emit the specified global variable or function defini...
Primary interface to the complete machine description for the target machine.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ DW_EH_PE_pcrel
Definition Dwarf.h:865
@ DW_EH_PE_absptr
Definition Dwarf.h:854
@ DW_EH_PE_udata4
Definition Dwarf.h:858
@ DW_EH_PE_uleb128
Definition Dwarf.h:856
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:666
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:649
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
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
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
@ Ref
The access may reference the value stored in memory.
Definition ModRef.h:32
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:565
constexpr const char * PseudoProbeDescMetadataName
Definition PseudoProbe.h:26
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
MachineJumpTableEntry - One jump table in the jump table info.