LLVM 22.0.0git
LowerTypeTests.cpp
Go to the documentation of this file.
1//===- LowerTypeTests.cpp - type metadata lowering pass -------------------===//
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 pass lowers type metadata and calls to the llvm.type.test intrinsic.
10// It also ensures that globals are properly laid out for the
11// llvm.icall.branch.funnel intrinsic.
12// See http://llvm.org/docs/TypeMetadata.html for more information.
13//
14//===----------------------------------------------------------------------===//
15
17#include "llvm/ADT/APInt.h"
18#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/DenseMap.h"
22#include "llvm/ADT/STLExtras.h"
23#include "llvm/ADT/SetVector.h"
25#include "llvm/ADT/Statistic.h"
26#include "llvm/ADT/StringRef.h"
33#include "llvm/IR/Attributes.h"
34#include "llvm/IR/BasicBlock.h"
35#include "llvm/IR/Constant.h"
36#include "llvm/IR/Constants.h"
37#include "llvm/IR/DataLayout.h"
39#include "llvm/IR/Function.h"
40#include "llvm/IR/GlobalAlias.h"
42#include "llvm/IR/GlobalValue.h"
44#include "llvm/IR/IRBuilder.h"
45#include "llvm/IR/InlineAsm.h"
46#include "llvm/IR/Instruction.h"
49#include "llvm/IR/Intrinsics.h"
50#include "llvm/IR/LLVMContext.h"
51#include "llvm/IR/Metadata.h"
52#include "llvm/IR/Module.h"
55#include "llvm/IR/Operator.h"
56#include "llvm/IR/PassManager.h"
58#include "llvm/IR/Type.h"
59#include "llvm/IR/Use.h"
60#include "llvm/IR/User.h"
61#include "llvm/IR/Value.h"
65#include "llvm/Support/Debug.h"
66#include "llvm/Support/Error.h"
75#include "llvm/Transforms/IPO.h"
78#include <algorithm>
79#include <cassert>
80#include <cstdint>
81#include <memory>
82#include <set>
83#include <string>
84#include <system_error>
85#include <utility>
86#include <vector>
87
88using namespace llvm;
89using namespace lowertypetests;
90
91#define DEBUG_TYPE "lowertypetests"
92
93STATISTIC(ByteArraySizeBits, "Byte array size in bits");
94STATISTIC(ByteArraySizeBytes, "Byte array size in bytes");
95STATISTIC(NumByteArraysCreated, "Number of byte arrays created");
96STATISTIC(NumTypeTestCallsLowered, "Number of type test calls lowered");
97STATISTIC(NumTypeIdDisjointSets, "Number of disjoint sets of type identifiers");
98
100 "lowertypetests-avoid-reuse",
101 cl::desc("Try to avoid reuse of byte array addresses using aliases"),
102 cl::Hidden, cl::init(true));
103
105 "lowertypetests-summary-action",
106 cl::desc("What to do with the summary when running this pass"),
107 cl::values(clEnumValN(PassSummaryAction::None, "none", "Do nothing"),
109 "Import typeid resolutions from summary and globals"),
111 "Export typeid resolutions to summary and globals")),
112 cl::Hidden);
113
115 "lowertypetests-read-summary",
116 cl::desc("Read summary from given YAML file before running pass"),
117 cl::Hidden);
118
120 "lowertypetests-write-summary",
121 cl::desc("Write summary to given YAML file after running pass"),
122 cl::Hidden);
123
125 ClDropTypeTests("lowertypetests-drop-type-tests",
126 cl::desc("Simply drop type test sequences"),
127 cl::values(clEnumValN(DropTestKind::None, "none",
128 "Do not drop any type tests"),
129 clEnumValN(DropTestKind::Assume, "assume",
130 "Drop type test assume sequences"),
131 clEnumValN(DropTestKind::All, "all",
132 "Drop all type test sequences")),
133 cl::Hidden, cl::init(DropTestKind::None));
134
136 if (Offset < ByteOffset)
137 return false;
138
139 if ((Offset - ByteOffset) % (uint64_t(1) << AlignLog2) != 0)
140 return false;
141
142 uint64_t BitOffset = (Offset - ByteOffset) >> AlignLog2;
143 if (BitOffset >= BitSize)
144 return false;
145
146 return Bits.count(BitSize - 1 - BitOffset);
147}
148
150 OS << "offset " << ByteOffset << " size " << BitSize << " align "
151 << (1 << AlignLog2);
152
153 if (isAllOnes()) {
154 OS << " all-ones\n";
155 return;
156 }
157
158 OS << " { ";
159 for (uint64_t B : Bits)
160 OS << B << ' ';
161 OS << "}\n";
162}
163
165 if (Min > Max)
166 Min = 0;
167
168 // Normalize each offset against the minimum observed offset, and compute
169 // the bitwise OR of each of the offsets. The number of trailing zeros
170 // in the mask gives us the log2 of the alignment of all offsets, which
171 // allows us to compress the bitset by only storing one bit per aligned
172 // address.
173 uint64_t Mask = 0;
174 for (uint64_t &Offset : Offsets) {
175 Offset -= Min;
176 Mask |= Offset;
177 }
178
179 BitSetInfo BSI;
180 BSI.ByteOffset = Min;
181
182 BSI.AlignLog2 = 0;
183 if (Mask != 0)
184 BSI.AlignLog2 = llvm::countr_zero(Mask);
185
186 // Build the compressed bitset while normalizing the offsets against the
187 // computed alignment.
188 BSI.BitSize = ((Max - Min) >> BSI.AlignLog2) + 1;
189 for (uint64_t Offset : Offsets) {
190 Offset >>= BSI.AlignLog2;
191 // We invert the order of bits when adding them to the bitset. This is
192 // because the offset that we test against is computed by subtracting the
193 // address that we are testing from the global's address, which means that
194 // the offset increases as the tested address decreases.
195 BSI.Bits.insert(BSI.BitSize - 1 - Offset);
196 }
197
198 return BSI;
199}
200
201void GlobalLayoutBuilder::addFragment(const std::set<uint64_t> &F) {
202 // Create a new fragment to hold the layout for F.
203 Fragments.emplace_back();
204 std::vector<uint64_t> &Fragment = Fragments.back();
205 uint64_t FragmentIndex = Fragments.size() - 1;
206
207 for (auto ObjIndex : F) {
208 uint64_t OldFragmentIndex = FragmentMap[ObjIndex];
209 if (OldFragmentIndex == 0) {
210 // We haven't seen this object index before, so just add it to the current
211 // fragment.
212 Fragment.push_back(ObjIndex);
213 } else {
214 // This index belongs to an existing fragment. Copy the elements of the
215 // old fragment into this one and clear the old fragment. We don't update
216 // the fragment map just yet, this ensures that any further references to
217 // indices from the old fragment in this fragment do not insert any more
218 // indices.
219 std::vector<uint64_t> &OldFragment = Fragments[OldFragmentIndex];
220 llvm::append_range(Fragment, OldFragment);
221 OldFragment.clear();
222 }
223 }
224
225 // Update the fragment map to point our object indices to this fragment.
226 for (uint64_t ObjIndex : Fragment)
227 FragmentMap[ObjIndex] = FragmentIndex;
228}
229
230void ByteArrayBuilder::allocate(const std::set<uint64_t> &Bits,
231 uint64_t BitSize, uint64_t &AllocByteOffset,
232 uint8_t &AllocMask) {
233 // Find the smallest current allocation.
234 unsigned Bit = 0;
235 for (unsigned I = 1; I != BitsPerByte; ++I)
236 if (BitAllocs[I] < BitAllocs[Bit])
237 Bit = I;
238
239 AllocByteOffset = BitAllocs[Bit];
240
241 // Add our size to it.
242 unsigned ReqSize = AllocByteOffset + BitSize;
243 BitAllocs[Bit] = ReqSize;
244 if (Bytes.size() < ReqSize)
245 Bytes.resize(ReqSize);
246
247 // Set our bits.
248 AllocMask = 1 << Bit;
249 for (uint64_t B : Bits)
250 Bytes[AllocByteOffset + B] |= AllocMask;
251}
252
254 if (F->isDeclarationForLinker())
255 return false;
257 F->getParent()->getModuleFlag("CFI Canonical Jump Tables"));
258 if (!CI || !CI->isZero())
259 return true;
260 return F->hasFnAttribute("cfi-canonical-jump-table");
261}
262
263namespace {
264
265struct ByteArrayInfo {
266 std::set<uint64_t> Bits;
267 uint64_t BitSize;
268 GlobalVariable *ByteArray;
269 GlobalVariable *MaskGlobal;
270 uint8_t *MaskPtr = nullptr;
271};
272
273/// A POD-like structure that we use to store a global reference together with
274/// its metadata types. In this pass we frequently need to query the set of
275/// metadata types referenced by a global, which at the IR level is an expensive
276/// operation involving a map lookup; this data structure helps to reduce the
277/// number of times we need to do this lookup.
278class GlobalTypeMember final : TrailingObjects<GlobalTypeMember, MDNode *> {
279 friend TrailingObjects;
280
281 GlobalObject *GO;
282 size_t NTypes;
283
284 // For functions: true if the jump table is canonical. This essentially means
285 // whether the canonical address (i.e. the symbol table entry) of the function
286 // is provided by the local jump table. This is normally the same as whether
287 // the function is defined locally, but if canonical jump tables are disabled
288 // by the user then the jump table never provides a canonical definition.
289 bool IsJumpTableCanonical;
290
291 // For functions: true if this function is either defined or used in a thinlto
292 // module and its jumptable entry needs to be exported to thinlto backends.
293 bool IsExported;
294
295public:
296 static GlobalTypeMember *create(BumpPtrAllocator &Alloc, GlobalObject *GO,
297 bool IsJumpTableCanonical, bool IsExported,
298 ArrayRef<MDNode *> Types) {
299 auto *GTM = static_cast<GlobalTypeMember *>(Alloc.Allocate(
300 totalSizeToAlloc<MDNode *>(Types.size()), alignof(GlobalTypeMember)));
301 GTM->GO = GO;
302 GTM->NTypes = Types.size();
303 GTM->IsJumpTableCanonical = IsJumpTableCanonical;
304 GTM->IsExported = IsExported;
305 llvm::copy(Types, GTM->getTrailingObjects());
306 return GTM;
307 }
308
309 GlobalObject *getGlobal() const {
310 return GO;
311 }
312
313 bool isJumpTableCanonical() const {
314 return IsJumpTableCanonical;
315 }
316
317 bool isExported() const {
318 return IsExported;
319 }
320
321 ArrayRef<MDNode *> types() const { return getTrailingObjects(NTypes); }
322};
323
324struct ICallBranchFunnel final
325 : TrailingObjects<ICallBranchFunnel, GlobalTypeMember *> {
326 static ICallBranchFunnel *create(BumpPtrAllocator &Alloc, CallInst *CI,
328 unsigned UniqueId) {
329 auto *Call = static_cast<ICallBranchFunnel *>(
330 Alloc.Allocate(totalSizeToAlloc<GlobalTypeMember *>(Targets.size()),
331 alignof(ICallBranchFunnel)));
332 Call->CI = CI;
333 Call->UniqueId = UniqueId;
334 Call->NTargets = Targets.size();
335 llvm::copy(Targets, Call->getTrailingObjects());
336 return Call;
337 }
338
339 CallInst *CI;
340 ArrayRef<GlobalTypeMember *> targets() const {
341 return getTrailingObjects(NTargets);
342 }
343
344 unsigned UniqueId;
345
346private:
347 size_t NTargets;
348};
349
350struct ScopedSaveAliaseesAndUsed {
351 Module &M;
353 std::vector<std::pair<GlobalAlias *, Function *>> FunctionAliases;
354 std::vector<std::pair<GlobalIFunc *, Function *>> ResolverIFuncs;
355
356 // This function only removes functions from llvm.used and llvm.compiler.used.
357 // We cannot remove global variables because they need to follow RAUW, as
358 // they may be deleted by buildBitSetsFromGlobalVariables.
359 void collectAndEraseUsedFunctions(Module &M,
360 SmallVectorImpl<GlobalValue *> &Vec,
361 bool CompilerUsed) {
362 auto *GV = collectUsedGlobalVariables(M, Vec, CompilerUsed);
363 if (!GV)
364 return;
365 // There's no API to only remove certain array elements from
366 // llvm.used/llvm.compiler.used, so we remove all of them and add back only
367 // the non-functions.
368 GV->eraseFromParent();
369 auto NonFuncBegin =
370 std::stable_partition(Vec.begin(), Vec.end(), [](GlobalValue *GV) {
371 return isa<Function>(GV);
372 });
373 if (CompilerUsed)
374 appendToCompilerUsed(M, {NonFuncBegin, Vec.end()});
375 else
376 appendToUsed(M, {NonFuncBegin, Vec.end()});
377 Vec.resize(NonFuncBegin - Vec.begin());
378 }
379
380 ScopedSaveAliaseesAndUsed(Module &M) : M(M) {
381 // The users of this class want to replace all function references except
382 // for aliases and llvm.used/llvm.compiler.used with references to a jump
383 // table. We avoid replacing aliases in order to avoid introducing a double
384 // indirection (or an alias pointing to a declaration in ThinLTO mode), and
385 // we avoid replacing llvm.used/llvm.compiler.used because these global
386 // variables describe properties of the global, not the jump table (besides,
387 // offseted references to the jump table in llvm.used are invalid).
388 // Unfortunately, LLVM doesn't have a "RAUW except for these (possibly
389 // indirect) users", so what we do is save the list of globals referenced by
390 // llvm.used/llvm.compiler.used and aliases, erase the used lists, let RAUW
391 // replace the aliasees and then set them back to their original values at
392 // the end.
393 collectAndEraseUsedFunctions(M, Used, false);
394 collectAndEraseUsedFunctions(M, CompilerUsed, true);
395
396 for (auto &GA : M.aliases()) {
397 // FIXME: This should look past all aliases not just interposable ones,
398 // see discussion on D65118.
399 if (auto *F = dyn_cast<Function>(GA.getAliasee()->stripPointerCasts()))
400 FunctionAliases.push_back({&GA, F});
401 }
402
403 for (auto &GI : M.ifuncs())
404 if (auto *F = dyn_cast<Function>(GI.getResolver()->stripPointerCasts()))
405 ResolverIFuncs.push_back({&GI, F});
406 }
407
408 ~ScopedSaveAliaseesAndUsed() {
409 appendToUsed(M, Used);
410 appendToCompilerUsed(M, CompilerUsed);
411
412 for (auto P : FunctionAliases)
413 P.first->setAliasee(P.second);
414
415 for (auto P : ResolverIFuncs) {
416 // This does not preserve pointer casts that may have been stripped by the
417 // constructor, but the resolver's type is different from that of the
418 // ifunc anyway.
419 P.first->setResolver(P.second);
420 }
421 }
422};
423
424class LowerTypeTestsModule {
425 Module &M;
426
427 ModuleSummaryIndex *ExportSummary;
428 const ModuleSummaryIndex *ImportSummary;
429 // Set when the client has invoked this to simply drop all type test assume
430 // sequences.
431 DropTestKind DropTypeTests;
432
433 Triple::ArchType Arch;
435 Triple::ObjectFormatType ObjectFormat;
436
437 // Determines which kind of Thumb jump table we generate. If arch is
438 // either 'arm' or 'thumb' we need to find this out, because
439 // selectJumpTableArmEncoding may decide to use Thumb in either case.
440 bool CanUseArmJumpTable = false, CanUseThumbBWJumpTable = false;
441
442 // Cache variable used by hasBranchTargetEnforcement().
443 int HasBranchTargetEnforcement = -1;
444
445 IntegerType *Int1Ty = Type::getInt1Ty(M.getContext());
446 IntegerType *Int8Ty = Type::getInt8Ty(M.getContext());
447 PointerType *PtrTy = PointerType::getUnqual(M.getContext());
448 ArrayType *Int8Arr0Ty = ArrayType::get(Type::getInt8Ty(M.getContext()), 0);
449 IntegerType *Int32Ty = Type::getInt32Ty(M.getContext());
450 IntegerType *Int64Ty = Type::getInt64Ty(M.getContext());
451 IntegerType *IntPtrTy = M.getDataLayout().getIntPtrType(M.getContext(), 0);
452
453 // Indirect function call index assignment counter for WebAssembly
454 uint64_t IndirectIndex = 1;
455
456 // Mapping from type identifiers to the call sites that test them, as well as
457 // whether the type identifier needs to be exported to ThinLTO backends as
458 // part of the regular LTO phase of the ThinLTO pipeline (see exportTypeId).
459 struct TypeIdUserInfo {
460 std::vector<CallInst *> CallSites;
461 bool IsExported = false;
462 };
463 DenseMap<Metadata *, TypeIdUserInfo> TypeIdUsers;
464
465 /// This structure describes how to lower type tests for a particular type
466 /// identifier. It is either built directly from the global analysis (during
467 /// regular LTO or the regular LTO phase of ThinLTO), or indirectly using type
468 /// identifier summaries and external symbol references (in ThinLTO backends).
469 struct TypeIdLowering {
471
472 /// All except Unsat: the address of the last element within the combined
473 /// global.
474 Constant *OffsetedGlobal;
475
476 /// ByteArray, Inline, AllOnes: log2 of the required global alignment
477 /// relative to the start address.
478 Constant *AlignLog2;
479
480 /// ByteArray, Inline, AllOnes: one less than the size of the memory region
481 /// covering members of this type identifier as a multiple of 2^AlignLog2.
482 Constant *SizeM1;
483
484 /// ByteArray: the byte array to test the address against.
485 Constant *TheByteArray;
486
487 /// ByteArray: the bit mask to apply to bytes loaded from the byte array.
488 Constant *BitMask;
489
490 /// Inline: the bit mask to test the address against.
491 Constant *InlineBits;
492 };
493
494 std::vector<ByteArrayInfo> ByteArrayInfos;
495
496 Function *WeakInitializerFn = nullptr;
497
498 GlobalVariable *GlobalAnnotation;
499 DenseSet<Value *> FunctionAnnotations;
500
501 bool shouldExportConstantsAsAbsoluteSymbols();
502 uint8_t *exportTypeId(StringRef TypeId, const TypeIdLowering &TIL);
503 TypeIdLowering importTypeId(StringRef TypeId);
504 void importTypeTest(CallInst *CI);
505 void importFunction(Function *F, bool isJumpTableCanonical);
506
507 ByteArrayInfo *createByteArray(const BitSetInfo &BSI);
508 void allocateByteArrays();
509 Value *createBitSetTest(IRBuilder<> &B, const TypeIdLowering &TIL,
510 Value *BitOffset);
511 void lowerTypeTestCalls(
512 ArrayRef<Metadata *> TypeIds, Constant *CombinedGlobalAddr,
513 const DenseMap<GlobalTypeMember *, uint64_t> &GlobalLayout);
514 Value *lowerTypeTestCall(Metadata *TypeId, CallInst *CI,
515 const TypeIdLowering &TIL);
516
517 void buildBitSetsFromGlobalVariables(ArrayRef<Metadata *> TypeIds,
520 selectJumpTableArmEncoding(ArrayRef<GlobalTypeMember *> Functions);
521 bool hasBranchTargetEnforcement();
522 unsigned getJumpTableEntrySize(Triple::ArchType JumpTableArch);
523 InlineAsm *createJumpTableEntryAsm(Triple::ArchType JumpTableArch);
524 void verifyTypeMDNode(GlobalObject *GO, MDNode *Type);
525 void buildBitSetsFromFunctions(ArrayRef<Metadata *> TypeIds,
527 void buildBitSetsFromFunctionsNative(ArrayRef<Metadata *> TypeIds,
529 void buildBitSetsFromFunctionsWASM(ArrayRef<Metadata *> TypeIds,
531 void
532 buildBitSetsFromDisjointSet(ArrayRef<Metadata *> TypeIds,
534 ArrayRef<ICallBranchFunnel *> ICallBranchFunnels);
535
536 void replaceWeakDeclarationWithJumpTablePtr(Function *F, Constant *JT,
537 bool IsJumpTableCanonical);
538 void moveInitializerToModuleConstructor(GlobalVariable *GV);
539 void findGlobalVariableUsersOf(Constant *C,
540 SmallSetVector<GlobalVariable *, 8> &Out);
541
542 void createJumpTable(Function *F, ArrayRef<GlobalTypeMember *> Functions,
543 Triple::ArchType JumpTableArch);
544
545 /// replaceCfiUses - Go through the uses list for this definition
546 /// and make each use point to "V" instead of "this" when the use is outside
547 /// the block. 'This's use list is expected to have at least one element.
548 /// Unlike replaceAllUsesWith this function skips blockaddr and direct call
549 /// uses.
550 void replaceCfiUses(Function *Old, Value *New, bool IsJumpTableCanonical);
551
552 /// replaceDirectCalls - Go through the uses list for this definition and
553 /// replace each use, which is a direct function call.
554 void replaceDirectCalls(Value *Old, Value *New);
555
556 bool isFunctionAnnotation(Value *V) const {
557 return FunctionAnnotations.contains(V);
558 }
559
560 void maybeReplaceComdat(Function *F, StringRef OriginalName);
561
562public:
563 LowerTypeTestsModule(Module &M, ModuleAnalysisManager &AM,
564 ModuleSummaryIndex *ExportSummary,
565 const ModuleSummaryIndex *ImportSummary,
566 DropTestKind DropTypeTests);
567
568 bool lower();
569
570 // Lower the module using the action and summary passed as command line
571 // arguments. For testing purposes only.
572 static bool runForTesting(Module &M, ModuleAnalysisManager &AM);
573};
574} // end anonymous namespace
575
576/// Build a bit set for TypeId using the object layouts in
577/// GlobalLayout.
578static BitSetInfo
580 const DenseMap<GlobalTypeMember *, uint64_t> &GlobalLayout) {
581 BitSetBuilder BSB;
582
583 // Compute the byte offset of each address associated with this type
584 // identifier.
585 for (const auto &GlobalAndOffset : GlobalLayout) {
586 for (MDNode *Type : GlobalAndOffset.first->types()) {
587 if (Type->getOperand(1) != TypeId)
588 continue;
591 cast<ConstantAsMetadata>(Type->getOperand(0))->getValue())
592 ->getZExtValue();
593 BSB.addOffset(GlobalAndOffset.second + Offset);
594 }
595 }
596
597 return BSB.build();
598}
599
600/// Build a test that bit BitOffset mod sizeof(Bits)*8 is set in
601/// Bits. This pattern matches to the bt instruction on x86.
603 Value *BitOffset) {
604 auto BitsType = cast<IntegerType>(Bits->getType());
605 unsigned BitWidth = BitsType->getBitWidth();
606
607 BitOffset = B.CreateZExtOrTrunc(BitOffset, BitsType);
608 Value *BitIndex =
609 B.CreateAnd(BitOffset, ConstantInt::get(BitsType, BitWidth - 1));
610 Value *BitMask = B.CreateShl(ConstantInt::get(BitsType, 1), BitIndex);
611 Value *MaskedBits = B.CreateAnd(Bits, BitMask);
612 return B.CreateICmpNE(MaskedBits, ConstantInt::get(BitsType, 0));
613}
614
615ByteArrayInfo *LowerTypeTestsModule::createByteArray(const BitSetInfo &BSI) {
616 // Create globals to stand in for byte arrays and masks. These never actually
617 // get initialized, we RAUW and erase them later in allocateByteArrays() once
618 // we know the offset and mask to use.
619 auto ByteArrayGlobal = new GlobalVariable(
620 M, Int8Ty, /*isConstant=*/true, GlobalValue::PrivateLinkage, nullptr);
621 auto MaskGlobal = new GlobalVariable(M, Int8Ty, /*isConstant=*/true,
623
624 ByteArrayInfos.emplace_back();
625 ByteArrayInfo *BAI = &ByteArrayInfos.back();
626
627 BAI->Bits = BSI.Bits;
628 BAI->BitSize = BSI.BitSize;
629 BAI->ByteArray = ByteArrayGlobal;
630 BAI->MaskGlobal = MaskGlobal;
631 return BAI;
632}
633
634void LowerTypeTestsModule::allocateByteArrays() {
635 llvm::stable_sort(ByteArrayInfos,
636 [](const ByteArrayInfo &BAI1, const ByteArrayInfo &BAI2) {
637 return BAI1.BitSize > BAI2.BitSize;
638 });
639
640 std::vector<uint64_t> ByteArrayOffsets(ByteArrayInfos.size());
641
643 for (unsigned I = 0; I != ByteArrayInfos.size(); ++I) {
644 ByteArrayInfo *BAI = &ByteArrayInfos[I];
645
646 uint8_t Mask;
647 BAB.allocate(BAI->Bits, BAI->BitSize, ByteArrayOffsets[I], Mask);
648
649 BAI->MaskGlobal->replaceAllUsesWith(
650 ConstantExpr::getIntToPtr(ConstantInt::get(Int8Ty, Mask), PtrTy));
651 BAI->MaskGlobal->eraseFromParent();
652 if (BAI->MaskPtr)
653 *BAI->MaskPtr = Mask;
654 }
655
656 Constant *ByteArrayConst = ConstantDataArray::get(M.getContext(), BAB.Bytes);
657 auto ByteArray =
658 new GlobalVariable(M, ByteArrayConst->getType(), /*isConstant=*/true,
659 GlobalValue::PrivateLinkage, ByteArrayConst);
660
661 for (unsigned I = 0; I != ByteArrayInfos.size(); ++I) {
662 ByteArrayInfo *BAI = &ByteArrayInfos[I];
663
664 Constant *Idxs[] = {ConstantInt::get(IntPtrTy, 0),
665 ConstantInt::get(IntPtrTy, ByteArrayOffsets[I])};
667 ByteArrayConst->getType(), ByteArray, Idxs);
668
669 // Create an alias instead of RAUW'ing the gep directly. On x86 this ensures
670 // that the pc-relative displacement is folded into the lea instead of the
671 // test instruction getting another displacement.
672 GlobalAlias *Alias = GlobalAlias::create(
673 Int8Ty, 0, GlobalValue::PrivateLinkage, "bits", GEP, &M);
674 BAI->ByteArray->replaceAllUsesWith(Alias);
675 BAI->ByteArray->eraseFromParent();
676 }
677
678 ByteArraySizeBits = BAB.BitAllocs[0] + BAB.BitAllocs[1] + BAB.BitAllocs[2] +
679 BAB.BitAllocs[3] + BAB.BitAllocs[4] + BAB.BitAllocs[5] +
680 BAB.BitAllocs[6] + BAB.BitAllocs[7];
681 ByteArraySizeBytes = BAB.Bytes.size();
682}
683
684/// Build a test that bit BitOffset is set in the type identifier that was
685/// lowered to TIL, which must be either an Inline or a ByteArray.
686Value *LowerTypeTestsModule::createBitSetTest(IRBuilder<> &B,
687 const TypeIdLowering &TIL,
688 Value *BitOffset) {
689 if (TIL.TheKind == TypeTestResolution::Inline) {
690 // If the bit set is sufficiently small, we can avoid a load by bit testing
691 // a constant.
692 return createMaskedBitTest(B, TIL.InlineBits, BitOffset);
693 } else {
694 Constant *ByteArray = TIL.TheByteArray;
695 if (AvoidReuse && !ImportSummary) {
696 // Each use of the byte array uses a different alias. This makes the
697 // backend less likely to reuse previously computed byte array addresses,
698 // improving the security of the CFI mechanism based on this pass.
699 // This won't work when importing because TheByteArray is external.
701 "bits_use", ByteArray, &M);
702 }
703
704 Value *ByteAddr = B.CreateGEP(Int8Ty, ByteArray, BitOffset);
705 Value *Byte = B.CreateLoad(Int8Ty, ByteAddr);
706
707 Value *ByteAndMask =
708 B.CreateAnd(Byte, ConstantExpr::getPtrToInt(TIL.BitMask, Int8Ty));
709 return B.CreateICmpNE(ByteAndMask, ConstantInt::get(Int8Ty, 0));
710 }
711}
712
713static bool isKnownTypeIdMember(Metadata *TypeId, const DataLayout &DL,
714 Value *V, uint64_t COffset) {
715 if (auto GV = dyn_cast<GlobalObject>(V)) {
717 GV->getMetadata(LLVMContext::MD_type, Types);
718 for (MDNode *Type : Types) {
719 if (Type->getOperand(1) != TypeId)
720 continue;
723 cast<ConstantAsMetadata>(Type->getOperand(0))->getValue())
724 ->getZExtValue();
725 if (COffset == Offset)
726 return true;
727 }
728 return false;
729 }
730
731 if (auto GEP = dyn_cast<GEPOperator>(V)) {
732 APInt APOffset(DL.getIndexSizeInBits(0), 0);
733 bool Result = GEP->accumulateConstantOffset(DL, APOffset);
734 if (!Result)
735 return false;
736 COffset += APOffset.getZExtValue();
737 return isKnownTypeIdMember(TypeId, DL, GEP->getPointerOperand(), COffset);
738 }
739
740 if (auto Op = dyn_cast<Operator>(V)) {
741 if (Op->getOpcode() == Instruction::BitCast)
742 return isKnownTypeIdMember(TypeId, DL, Op->getOperand(0), COffset);
743
744 if (Op->getOpcode() == Instruction::Select)
745 return isKnownTypeIdMember(TypeId, DL, Op->getOperand(1), COffset) &&
746 isKnownTypeIdMember(TypeId, DL, Op->getOperand(2), COffset);
747 }
748
749 return false;
750}
751
752/// Lower a llvm.type.test call to its implementation. Returns the value to
753/// replace the call with.
754Value *LowerTypeTestsModule::lowerTypeTestCall(Metadata *TypeId, CallInst *CI,
755 const TypeIdLowering &TIL) {
756 // Delay lowering if the resolution is currently unknown.
757 if (TIL.TheKind == TypeTestResolution::Unknown)
758 return nullptr;
759 if (TIL.TheKind == TypeTestResolution::Unsat)
760 return ConstantInt::getFalse(M.getContext());
761
762 Value *Ptr = CI->getArgOperand(0);
763 const DataLayout &DL = M.getDataLayout();
764 if (isKnownTypeIdMember(TypeId, DL, Ptr, 0))
765 return ConstantInt::getTrue(M.getContext());
766
767 BasicBlock *InitialBB = CI->getParent();
768
769 IRBuilder<> B(CI);
770
771 Value *PtrAsInt = B.CreatePtrToInt(Ptr, IntPtrTy);
772
773 Constant *OffsetedGlobalAsInt =
774 ConstantExpr::getPtrToInt(TIL.OffsetedGlobal, IntPtrTy);
775 if (TIL.TheKind == TypeTestResolution::Single)
776 return B.CreateICmpEQ(PtrAsInt, OffsetedGlobalAsInt);
777
778 // Here we compute `last element - address`. The reason why we do this instead
779 // of computing `address - first element` is that it leads to a slightly
780 // shorter instruction sequence on x86. Because it doesn't matter how we do
781 // the subtraction on other architectures, we do so unconditionally.
782 Value *PtrOffset = B.CreateSub(OffsetedGlobalAsInt, PtrAsInt);
783
784 // We need to check that the offset both falls within our range and is
785 // suitably aligned. We can check both properties at the same time by
786 // performing a right rotate by log2(alignment) followed by an integer
787 // comparison against the bitset size. The rotate will move the lower
788 // order bits that need to be zero into the higher order bits of the
789 // result, causing the comparison to fail if they are nonzero. The rotate
790 // also conveniently gives us a bit offset to use during the load from
791 // the bitset.
792 Value *BitOffset = B.CreateIntrinsic(IntPtrTy, Intrinsic::fshr,
793 {PtrOffset, PtrOffset, TIL.AlignLog2});
794
795 Value *OffsetInRange = B.CreateICmpULE(BitOffset, TIL.SizeM1);
796
797 // If the bit set is all ones, testing against it is unnecessary.
798 if (TIL.TheKind == TypeTestResolution::AllOnes)
799 return OffsetInRange;
800
801 // See if the intrinsic is used in the following common pattern:
802 // br(llvm.type.test(...), thenbb, elsebb)
803 // where nothing happens between the type test and the br.
804 // If so, create slightly simpler IR.
805 if (CI->hasOneUse())
806 if (auto *Br = dyn_cast<BranchInst>(*CI->user_begin()))
807 if (CI->getNextNode() == Br) {
808 BasicBlock *Then = InitialBB->splitBasicBlock(CI->getIterator());
809 BasicBlock *Else = Br->getSuccessor(1);
810 BranchInst *NewBr = BranchInst::Create(Then, Else, OffsetInRange);
811 NewBr->setMetadata(LLVMContext::MD_prof,
812 Br->getMetadata(LLVMContext::MD_prof));
813 ReplaceInstWithInst(InitialBB->getTerminator(), NewBr);
814
815 // Update phis in Else resulting from InitialBB being split
816 for (auto &Phi : Else->phis())
817 Phi.addIncoming(Phi.getIncomingValueForBlock(Then), InitialBB);
818
819 IRBuilder<> ThenB(CI);
820 return createBitSetTest(ThenB, TIL, BitOffset);
821 }
822
823 IRBuilder<> ThenB(SplitBlockAndInsertIfThen(OffsetInRange, CI, false));
824
825 // Now that we know that the offset is in range and aligned, load the
826 // appropriate bit from the bitset.
827 Value *Bit = createBitSetTest(ThenB, TIL, BitOffset);
828
829 // The value we want is 0 if we came directly from the initial block
830 // (having failed the range or alignment checks), or the loaded bit if
831 // we came from the block in which we loaded it.
832 B.SetInsertPoint(CI);
833 PHINode *P = B.CreatePHI(Int1Ty, 2);
834 P->addIncoming(ConstantInt::get(Int1Ty, 0), InitialBB);
835 P->addIncoming(Bit, ThenB.GetInsertBlock());
836 return P;
837}
838
839/// Given a disjoint set of type identifiers and globals, lay out the globals,
840/// build the bit sets and lower the llvm.type.test calls.
841void LowerTypeTestsModule::buildBitSetsFromGlobalVariables(
843 // Build a new global with the combined contents of the referenced globals.
844 // This global is a struct whose even-indexed elements contain the original
845 // contents of the referenced globals and whose odd-indexed elements contain
846 // any padding required to align the next element to the next power of 2 plus
847 // any additional padding required to meet its alignment requirements.
848 std::vector<Constant *> GlobalInits;
849 const DataLayout &DL = M.getDataLayout();
850 DenseMap<GlobalTypeMember *, uint64_t> GlobalLayout;
851 Align MaxAlign;
852 uint64_t CurOffset = 0;
853 uint64_t DesiredPadding = 0;
854 for (GlobalTypeMember *G : Globals) {
855 auto *GV = cast<GlobalVariable>(G->getGlobal());
856 Align Alignment =
857 DL.getValueOrABITypeAlignment(GV->getAlign(), GV->getValueType());
858 MaxAlign = std::max(MaxAlign, Alignment);
859 uint64_t GVOffset = alignTo(CurOffset + DesiredPadding, Alignment);
860 GlobalLayout[G] = GVOffset;
861 if (GVOffset != 0) {
862 uint64_t Padding = GVOffset - CurOffset;
863 GlobalInits.push_back(
865 }
866
867 GlobalInits.push_back(GV->getInitializer());
868 uint64_t InitSize = DL.getTypeAllocSize(GV->getValueType());
869 CurOffset = GVOffset + InitSize;
870
871 // Compute the amount of padding that we'd like for the next element.
872 DesiredPadding = NextPowerOf2(InitSize - 1) - InitSize;
873
874 // Experiments of different caps with Chromium on both x64 and ARM64
875 // have shown that the 32-byte cap generates the smallest binary on
876 // both platforms while different caps yield similar performance.
877 // (see https://lists.llvm.org/pipermail/llvm-dev/2018-July/124694.html)
878 if (DesiredPadding > 32)
879 DesiredPadding = alignTo(InitSize, 32) - InitSize;
880 }
881
882 Constant *NewInit = ConstantStruct::getAnon(M.getContext(), GlobalInits);
883 auto *CombinedGlobal =
884 new GlobalVariable(M, NewInit->getType(), /*isConstant=*/true,
886 CombinedGlobal->setAlignment(MaxAlign);
887
888 StructType *NewTy = cast<StructType>(NewInit->getType());
889 lowerTypeTestCalls(TypeIds, CombinedGlobal, GlobalLayout);
890
891 // Build aliases pointing to offsets into the combined global for each
892 // global from which we built the combined global, and replace references
893 // to the original globals with references to the aliases.
894 for (unsigned I = 0; I != Globals.size(); ++I) {
895 GlobalVariable *GV = cast<GlobalVariable>(Globals[I]->getGlobal());
896
897 // Multiply by 2 to account for padding elements.
898 Constant *CombinedGlobalIdxs[] = {ConstantInt::get(Int32Ty, 0),
899 ConstantInt::get(Int32Ty, I * 2)};
900 Constant *CombinedGlobalElemPtr = ConstantExpr::getInBoundsGetElementPtr(
901 NewInit->getType(), CombinedGlobal, CombinedGlobalIdxs);
902 assert(GV->getType()->getAddressSpace() == 0);
903 GlobalAlias *GAlias =
904 GlobalAlias::create(NewTy->getElementType(I * 2), 0, GV->getLinkage(),
905 "", CombinedGlobalElemPtr, &M);
906 GAlias->setVisibility(GV->getVisibility());
907 GAlias->takeName(GV);
908 GV->replaceAllUsesWith(GAlias);
909 GV->eraseFromParent();
910 }
911}
912
913bool LowerTypeTestsModule::shouldExportConstantsAsAbsoluteSymbols() {
914 return (Arch == Triple::x86 || Arch == Triple::x86_64) &&
915 ObjectFormat == Triple::ELF;
916}
917
918/// Export the given type identifier so that ThinLTO backends may import it.
919/// Type identifiers are exported by adding coarse-grained information about how
920/// to test the type identifier to the summary, and creating symbols in the
921/// object file (aliases and absolute symbols) containing fine-grained
922/// information about the type identifier.
923///
924/// Returns a pointer to the location in which to store the bitmask, if
925/// applicable.
926uint8_t *LowerTypeTestsModule::exportTypeId(StringRef TypeId,
927 const TypeIdLowering &TIL) {
928 TypeTestResolution &TTRes =
929 ExportSummary->getOrInsertTypeIdSummary(TypeId).TTRes;
930 TTRes.TheKind = TIL.TheKind;
931
932 auto ExportGlobal = [&](StringRef Name, Constant *C) {
933 GlobalAlias *GA =
935 "__typeid_" + TypeId + "_" + Name, C, &M);
937 };
938
939 auto ExportConstant = [&](StringRef Name, uint64_t &Storage, Constant *C) {
940 if (shouldExportConstantsAsAbsoluteSymbols())
941 ExportGlobal(Name, ConstantExpr::getIntToPtr(C, PtrTy));
942 else
943 Storage = cast<ConstantInt>(C)->getZExtValue();
944 };
945
946 if (TIL.TheKind != TypeTestResolution::Unsat)
947 ExportGlobal("global_addr", TIL.OffsetedGlobal);
948
949 if (TIL.TheKind == TypeTestResolution::ByteArray ||
950 TIL.TheKind == TypeTestResolution::Inline ||
951 TIL.TheKind == TypeTestResolution::AllOnes) {
952 ExportConstant("align", TTRes.AlignLog2, TIL.AlignLog2);
953 ExportConstant("size_m1", TTRes.SizeM1, TIL.SizeM1);
954
955 uint64_t BitSize = cast<ConstantInt>(TIL.SizeM1)->getZExtValue() + 1;
956 if (TIL.TheKind == TypeTestResolution::Inline)
957 TTRes.SizeM1BitWidth = (BitSize <= 32) ? 5 : 6;
958 else
959 TTRes.SizeM1BitWidth = (BitSize <= 128) ? 7 : 32;
960 }
961
962 if (TIL.TheKind == TypeTestResolution::ByteArray) {
963 ExportGlobal("byte_array", TIL.TheByteArray);
964 if (shouldExportConstantsAsAbsoluteSymbols())
965 ExportGlobal("bit_mask", TIL.BitMask);
966 else
967 return &TTRes.BitMask;
968 }
969
970 if (TIL.TheKind == TypeTestResolution::Inline)
971 ExportConstant("inline_bits", TTRes.InlineBits, TIL.InlineBits);
972
973 return nullptr;
974}
975
976LowerTypeTestsModule::TypeIdLowering
977LowerTypeTestsModule::importTypeId(StringRef TypeId) {
978 const TypeIdSummary *TidSummary = ImportSummary->getTypeIdSummary(TypeId);
979 if (!TidSummary)
980 return {}; // Unsat: no globals match this type id.
981 const TypeTestResolution &TTRes = TidSummary->TTRes;
982
983 TypeIdLowering TIL;
984 TIL.TheKind = TTRes.TheKind;
985
986 auto ImportGlobal = [&](StringRef Name) {
987 // Give the global a type of length 0 so that it is not assumed not to alias
988 // with any other global.
989 GlobalVariable *GV = M.getOrInsertGlobal(
990 ("__typeid_" + TypeId + "_" + Name).str(), Int8Arr0Ty);
992 return GV;
993 };
994
995 auto ImportConstant = [&](StringRef Name, uint64_t Const, unsigned AbsWidth,
996 Type *Ty) {
997 if (!shouldExportConstantsAsAbsoluteSymbols()) {
998 Constant *C =
999 ConstantInt::get(isa<IntegerType>(Ty) ? Ty : Int64Ty, Const);
1000 if (!isa<IntegerType>(Ty))
1002 return C;
1003 }
1004
1005 Constant *C = ImportGlobal(Name);
1006 auto *GV = cast<GlobalVariable>(C->stripPointerCasts());
1007 if (isa<IntegerType>(Ty))
1009 if (GV->getMetadata(LLVMContext::MD_absolute_symbol))
1010 return C;
1011
1012 auto SetAbsRange = [&](uint64_t Min, uint64_t Max) {
1013 auto *MinC = ConstantAsMetadata::get(ConstantInt::get(IntPtrTy, Min));
1014 auto *MaxC = ConstantAsMetadata::get(ConstantInt::get(IntPtrTy, Max));
1015 GV->setMetadata(LLVMContext::MD_absolute_symbol,
1016 MDNode::get(M.getContext(), {MinC, MaxC}));
1017 };
1018 if (AbsWidth == IntPtrTy->getBitWidth())
1019 SetAbsRange(~0ull, ~0ull); // Full set.
1020 else
1021 SetAbsRange(0, 1ull << AbsWidth);
1022 return C;
1023 };
1024
1025 if (TIL.TheKind != TypeTestResolution::Unsat) {
1026 auto *GV = ImportGlobal("global_addr");
1027 // This is either a vtable (in .data.rel.ro) or a jump table (in .text).
1028 // Either way it's expected to be in the low 2 GiB, so set the small code
1029 // model.
1030 //
1031 // For .data.rel.ro, we currently place all such sections in the low 2 GiB
1032 // [1], and for .text the sections are expected to be in the low 2 GiB under
1033 // the small and medium code models [2] and this pass only supports those
1034 // code models (e.g. jump tables use jmp instead of movabs/jmp).
1035 //
1036 // [1]https://github.com/llvm/llvm-project/pull/137742
1037 // [2]https://maskray.me/blog/2023-05-14-relocation-overflow-and-code-models
1039 TIL.OffsetedGlobal = GV;
1040 }
1041
1042 if (TIL.TheKind == TypeTestResolution::ByteArray ||
1043 TIL.TheKind == TypeTestResolution::Inline ||
1044 TIL.TheKind == TypeTestResolution::AllOnes) {
1045 TIL.AlignLog2 = ImportConstant("align", TTRes.AlignLog2, 8, IntPtrTy);
1046 TIL.SizeM1 =
1047 ImportConstant("size_m1", TTRes.SizeM1, TTRes.SizeM1BitWidth, IntPtrTy);
1048 }
1049
1050 if (TIL.TheKind == TypeTestResolution::ByteArray) {
1051 TIL.TheByteArray = ImportGlobal("byte_array");
1052 TIL.BitMask = ImportConstant("bit_mask", TTRes.BitMask, 8, PtrTy);
1053 }
1054
1055 if (TIL.TheKind == TypeTestResolution::Inline)
1056 TIL.InlineBits = ImportConstant(
1057 "inline_bits", TTRes.InlineBits, 1 << TTRes.SizeM1BitWidth,
1058 TTRes.SizeM1BitWidth <= 5 ? Int32Ty : Int64Ty);
1059
1060 return TIL;
1061}
1062
1063void LowerTypeTestsModule::importTypeTest(CallInst *CI) {
1064 auto TypeIdMDVal = dyn_cast<MetadataAsValue>(CI->getArgOperand(1));
1065 if (!TypeIdMDVal)
1066 report_fatal_error("Second argument of llvm.type.test must be metadata");
1067
1068 auto TypeIdStr = dyn_cast<MDString>(TypeIdMDVal->getMetadata());
1069 // If this is a local unpromoted type, which doesn't have a metadata string,
1070 // treat as Unknown and delay lowering, so that we can still utilize it for
1071 // later optimizations.
1072 if (!TypeIdStr)
1073 return;
1074
1075 TypeIdLowering TIL = importTypeId(TypeIdStr->getString());
1076 Value *Lowered = lowerTypeTestCall(TypeIdStr, CI, TIL);
1077 if (Lowered) {
1078 CI->replaceAllUsesWith(Lowered);
1079 CI->eraseFromParent();
1080 }
1081}
1082
1083void LowerTypeTestsModule::maybeReplaceComdat(Function *F,
1084 StringRef OriginalName) {
1085 // For COFF we should also rename the comdat if this function also
1086 // happens to be the key function. Even if the comdat name changes, this
1087 // should still be fine since comdat and symbol resolution happens
1088 // before LTO, so all symbols which would prevail have been selected.
1089 if (F->hasComdat() && ObjectFormat == Triple::COFF &&
1090 F->getComdat()->getName() == OriginalName) {
1091 Comdat *OldComdat = F->getComdat();
1092 Comdat *NewComdat = M.getOrInsertComdat(F->getName());
1093 for (GlobalObject &GO : M.global_objects()) {
1094 if (GO.getComdat() == OldComdat)
1095 GO.setComdat(NewComdat);
1096 }
1097 }
1098}
1099
1100// ThinLTO backend: the function F has a jump table entry; update this module
1101// accordingly. isJumpTableCanonical describes the type of the jump table entry.
1102void LowerTypeTestsModule::importFunction(Function *F,
1103 bool isJumpTableCanonical) {
1104 assert(F->getType()->getAddressSpace() == 0);
1105
1106 GlobalValue::VisibilityTypes Visibility = F->getVisibility();
1107 std::string Name = std::string(F->getName());
1108
1109 if (F->isDeclarationForLinker() && isJumpTableCanonical) {
1110 // Non-dso_local functions may be overriden at run time,
1111 // don't short curcuit them
1112 if (F->isDSOLocal()) {
1113 Function *RealF = Function::Create(F->getFunctionType(),
1115 F->getAddressSpace(),
1116 Name + ".cfi", &M);
1118 replaceDirectCalls(F, RealF);
1119 }
1120 return;
1121 }
1122
1123 Function *FDecl;
1124 if (!isJumpTableCanonical) {
1125 // Either a declaration of an external function or a reference to a locally
1126 // defined jump table.
1127 FDecl = Function::Create(F->getFunctionType(), GlobalValue::ExternalLinkage,
1128 F->getAddressSpace(), Name + ".cfi_jt", &M);
1130 } else {
1131 F->setName(Name + ".cfi");
1132 maybeReplaceComdat(F, Name);
1133 FDecl = Function::Create(F->getFunctionType(), GlobalValue::ExternalLinkage,
1134 F->getAddressSpace(), Name, &M);
1135 FDecl->setVisibility(Visibility);
1136 Visibility = GlobalValue::HiddenVisibility;
1137
1138 // Update aliases pointing to this function to also include the ".cfi" suffix,
1139 // We expect the jump table entry to either point to the real function or an
1140 // alias. Redirect all other users to the jump table entry.
1141 for (auto &U : F->uses()) {
1142 if (auto *A = dyn_cast<GlobalAlias>(U.getUser())) {
1143 std::string AliasName = A->getName().str() + ".cfi";
1144 Function *AliasDecl = Function::Create(
1145 F->getFunctionType(), GlobalValue::ExternalLinkage,
1146 F->getAddressSpace(), "", &M);
1147 AliasDecl->takeName(A);
1148 A->replaceAllUsesWith(AliasDecl);
1149 A->setName(AliasName);
1150 }
1151 }
1152 }
1153
1154 if (F->hasExternalWeakLinkage())
1155 replaceWeakDeclarationWithJumpTablePtr(F, FDecl, isJumpTableCanonical);
1156 else
1157 replaceCfiUses(F, FDecl, isJumpTableCanonical);
1158
1159 // Set visibility late because it's used in replaceCfiUses() to determine
1160 // whether uses need to be replaced.
1161 F->setVisibility(Visibility);
1162}
1163
1164void LowerTypeTestsModule::lowerTypeTestCalls(
1165 ArrayRef<Metadata *> TypeIds, Constant *CombinedGlobalAddr,
1166 const DenseMap<GlobalTypeMember *, uint64_t> &GlobalLayout) {
1167 // For each type identifier in this disjoint set...
1168 for (Metadata *TypeId : TypeIds) {
1169 // Build the bitset.
1170 BitSetInfo BSI = buildBitSet(TypeId, GlobalLayout);
1171 LLVM_DEBUG({
1172 if (auto MDS = dyn_cast<MDString>(TypeId))
1173 dbgs() << MDS->getString() << ": ";
1174 else
1175 dbgs() << "<unnamed>: ";
1176 BSI.print(dbgs());
1177 });
1178
1179 ByteArrayInfo *BAI = nullptr;
1180 TypeIdLowering TIL;
1181
1182 uint64_t GlobalOffset =
1183 BSI.ByteOffset + ((BSI.BitSize - 1) << BSI.AlignLog2);
1184 TIL.OffsetedGlobal = ConstantExpr::getGetElementPtr(
1185 Int8Ty, CombinedGlobalAddr, ConstantInt::get(IntPtrTy, GlobalOffset)),
1186 TIL.AlignLog2 = ConstantInt::get(IntPtrTy, BSI.AlignLog2);
1187 TIL.SizeM1 = ConstantInt::get(IntPtrTy, BSI.BitSize - 1);
1188 if (BSI.isAllOnes()) {
1189 TIL.TheKind = (BSI.BitSize == 1) ? TypeTestResolution::Single
1190 : TypeTestResolution::AllOnes;
1191 } else if (BSI.BitSize <= IntPtrTy->getBitWidth()) {
1192 TIL.TheKind = TypeTestResolution::Inline;
1193 uint64_t InlineBits = 0;
1194 for (auto Bit : BSI.Bits)
1195 InlineBits |= uint64_t(1) << Bit;
1196 if (InlineBits == 0)
1197 TIL.TheKind = TypeTestResolution::Unsat;
1198 else
1199 TIL.InlineBits = ConstantInt::get(
1200 (BSI.BitSize <= 32) ? Int32Ty : Int64Ty, InlineBits);
1201 } else {
1202 TIL.TheKind = TypeTestResolution::ByteArray;
1203 ++NumByteArraysCreated;
1204 BAI = createByteArray(BSI);
1205 TIL.TheByteArray = BAI->ByteArray;
1206 TIL.BitMask = BAI->MaskGlobal;
1207 }
1208
1209 TypeIdUserInfo &TIUI = TypeIdUsers[TypeId];
1210
1211 if (TIUI.IsExported) {
1212 uint8_t *MaskPtr = exportTypeId(cast<MDString>(TypeId)->getString(), TIL);
1213 if (BAI)
1214 BAI->MaskPtr = MaskPtr;
1215 }
1216
1217 // Lower each call to llvm.type.test for this type identifier.
1218 for (CallInst *CI : TIUI.CallSites) {
1219 ++NumTypeTestCallsLowered;
1220 Value *Lowered = lowerTypeTestCall(TypeId, CI, TIL);
1221 if (Lowered) {
1222 CI->replaceAllUsesWith(Lowered);
1223 CI->eraseFromParent();
1224 }
1225 }
1226 }
1227}
1228
1229void LowerTypeTestsModule::verifyTypeMDNode(GlobalObject *GO, MDNode *Type) {
1230 if (Type->getNumOperands() != 2)
1231 report_fatal_error("All operands of type metadata must have 2 elements");
1232
1233 if (GO->isThreadLocal())
1234 report_fatal_error("Bit set element may not be thread-local");
1235 if (isa<GlobalVariable>(GO) && GO->hasSection())
1237 "A member of a type identifier may not have an explicit section");
1238
1239 // FIXME: We previously checked that global var member of a type identifier
1240 // must be a definition, but the IR linker may leave type metadata on
1241 // declarations. We should restore this check after fixing PR31759.
1242
1243 auto OffsetConstMD = dyn_cast<ConstantAsMetadata>(Type->getOperand(0));
1244 if (!OffsetConstMD)
1245 report_fatal_error("Type offset must be a constant");
1246 auto OffsetInt = dyn_cast<ConstantInt>(OffsetConstMD->getValue());
1247 if (!OffsetInt)
1248 report_fatal_error("Type offset must be an integer constant");
1249}
1250
1251static const unsigned kX86JumpTableEntrySize = 8;
1252static const unsigned kX86IBTJumpTableEntrySize = 16;
1253static const unsigned kARMJumpTableEntrySize = 4;
1254static const unsigned kARMBTIJumpTableEntrySize = 8;
1255static const unsigned kARMv6MJumpTableEntrySize = 16;
1256static const unsigned kRISCVJumpTableEntrySize = 8;
1257static const unsigned kLOONGARCH64JumpTableEntrySize = 8;
1258
1259bool LowerTypeTestsModule::hasBranchTargetEnforcement() {
1260 if (HasBranchTargetEnforcement == -1) {
1261 // First time this query has been called. Find out the answer by checking
1262 // the module flags.
1263 if (const auto *BTE = mdconst::extract_or_null<ConstantInt>(
1264 M.getModuleFlag("branch-target-enforcement")))
1265 HasBranchTargetEnforcement = (BTE->getZExtValue() != 0);
1266 else
1267 HasBranchTargetEnforcement = 0;
1268 }
1269 return HasBranchTargetEnforcement;
1270}
1271
1272unsigned
1273LowerTypeTestsModule::getJumpTableEntrySize(Triple::ArchType JumpTableArch) {
1274 switch (JumpTableArch) {
1275 case Triple::x86:
1276 case Triple::x86_64:
1277 if (const auto *MD = mdconst::extract_or_null<ConstantInt>(
1278 M.getModuleFlag("cf-protection-branch")))
1279 if (MD->getZExtValue())
1282 case Triple::arm:
1284 case Triple::thumb:
1285 if (CanUseThumbBWJumpTable) {
1286 if (hasBranchTargetEnforcement())
1289 } else {
1291 }
1292 case Triple::aarch64:
1293 if (hasBranchTargetEnforcement())
1296 case Triple::riscv32:
1297 case Triple::riscv64:
1301 default:
1302 report_fatal_error("Unsupported architecture for jump tables");
1303 }
1304}
1305
1306// Create an inline asm constant representing a jump table entry for the target.
1307// This consists of an instruction sequence containing a relative branch to
1308// Dest.
1309InlineAsm *
1310LowerTypeTestsModule::createJumpTableEntryAsm(Triple::ArchType JumpTableArch) {
1311 std::string Asm;
1312 raw_string_ostream AsmOS(Asm);
1313
1314 if (JumpTableArch == Triple::x86 || JumpTableArch == Triple::x86_64) {
1315 bool Endbr = false;
1316 if (const auto *MD = mdconst::extract_or_null<ConstantInt>(
1317 M.getModuleFlag("cf-protection-branch")))
1318 Endbr = !MD->isZero();
1319 if (Endbr)
1320 AsmOS << (JumpTableArch == Triple::x86 ? "endbr32\n" : "endbr64\n");
1321 AsmOS << "jmp ${0:c}@plt\n";
1322 if (Endbr)
1323 AsmOS << ".balign 16, 0xcc\n";
1324 else
1325 AsmOS << "int3\nint3\nint3\n";
1326 } else if (JumpTableArch == Triple::arm) {
1327 AsmOS << "b $0\n";
1328 } else if (JumpTableArch == Triple::aarch64) {
1329 if (hasBranchTargetEnforcement())
1330 AsmOS << "bti c\n";
1331 AsmOS << "b $0\n";
1332 } else if (JumpTableArch == Triple::thumb) {
1333 if (!CanUseThumbBWJumpTable) {
1334 // In Armv6-M, this sequence will generate a branch without corrupting
1335 // any registers. We use two stack words; in the second, we construct the
1336 // address we'll pop into pc, and the first is used to save and restore
1337 // r0 which we use as a temporary register.
1338 //
1339 // To support position-independent use cases, the offset of the target
1340 // function is stored as a relative offset (which will expand into an
1341 // R_ARM_REL32 relocation in ELF, and presumably the equivalent in other
1342 // object file types), and added to pc after we load it. (The alternative
1343 // B.W is automatically pc-relative.)
1344 //
1345 // There are five 16-bit Thumb instructions here, so the .balign 4 adds a
1346 // sixth halfword of padding, and then the offset consumes a further 4
1347 // bytes, for a total of 16, which is very convenient since entries in
1348 // this jump table need to have power-of-two size.
1349 AsmOS << "push {r0,r1}\n"
1350 << "ldr r0, 1f\n"
1351 << "0: add r0, r0, pc\n"
1352 << "str r0, [sp, #4]\n"
1353 << "pop {r0,pc}\n"
1354 << ".balign 4\n"
1355 << "1: .word $0 - (0b + 4)\n";
1356 } else {
1357 if (hasBranchTargetEnforcement())
1358 AsmOS << "bti\n";
1359 AsmOS << "b.w $0\n";
1360 }
1361 } else if (JumpTableArch == Triple::riscv32 ||
1362 JumpTableArch == Triple::riscv64) {
1363 AsmOS << "tail $0@plt\n";
1364 } else if (JumpTableArch == Triple::loongarch64) {
1365 AsmOS << "pcalau12i $$t0, %pc_hi20($0)\n"
1366 << "jirl $$r0, $$t0, %pc_lo12($0)\n";
1367 } else {
1368 report_fatal_error("Unsupported architecture for jump tables");
1369 }
1370
1371 return InlineAsm::get(
1372 FunctionType::get(Type::getVoidTy(M.getContext()), PtrTy, false),
1373 AsmOS.str(), "s",
1374 /*hasSideEffects=*/true);
1375}
1376
1377/// Given a disjoint set of type identifiers and functions, build the bit sets
1378/// and lower the llvm.type.test calls, architecture dependently.
1379void LowerTypeTestsModule::buildBitSetsFromFunctions(
1381 if (Arch == Triple::x86 || Arch == Triple::x86_64 || Arch == Triple::arm ||
1382 Arch == Triple::thumb || Arch == Triple::aarch64 ||
1383 Arch == Triple::riscv32 || Arch == Triple::riscv64 ||
1384 Arch == Triple::loongarch64)
1385 buildBitSetsFromFunctionsNative(TypeIds, Functions);
1386 else if (Arch == Triple::wasm32 || Arch == Triple::wasm64)
1387 buildBitSetsFromFunctionsWASM(TypeIds, Functions);
1388 else
1389 report_fatal_error("Unsupported architecture for jump tables");
1390}
1391
1392void LowerTypeTestsModule::moveInitializerToModuleConstructor(
1393 GlobalVariable *GV) {
1394 if (WeakInitializerFn == nullptr) {
1395 WeakInitializerFn = Function::Create(
1396 FunctionType::get(Type::getVoidTy(M.getContext()),
1397 /* IsVarArg */ false),
1399 M.getDataLayout().getProgramAddressSpace(),
1400 "__cfi_global_var_init", &M);
1401 BasicBlock *BB =
1402 BasicBlock::Create(M.getContext(), "entry", WeakInitializerFn);
1403 ReturnInst::Create(M.getContext(), BB);
1404 WeakInitializerFn->setSection(
1405 ObjectFormat == Triple::MachO
1406 ? "__TEXT,__StaticInit,regular,pure_instructions"
1407 : ".text.startup");
1408 // This code is equivalent to relocation application, and should run at the
1409 // earliest possible time (i.e. with the highest priority).
1410 appendToGlobalCtors(M, WeakInitializerFn, /* Priority */ 0);
1411 }
1412
1413 IRBuilder<> IRB(WeakInitializerFn->getEntryBlock().getTerminator());
1414 GV->setConstant(false);
1415 IRB.CreateAlignedStore(GV->getInitializer(), GV, GV->getAlign());
1417}
1418
1419void LowerTypeTestsModule::findGlobalVariableUsersOf(
1420 Constant *C, SmallSetVector<GlobalVariable *, 8> &Out) {
1421 for (auto *U : C->users()){
1422 if (auto *GV = dyn_cast<GlobalVariable>(U))
1423 Out.insert(GV);
1424 else if (auto *C2 = dyn_cast<Constant>(U))
1425 findGlobalVariableUsersOf(C2, Out);
1426 }
1427}
1428
1429// Replace all uses of F with (F ? JT : 0).
1430void LowerTypeTestsModule::replaceWeakDeclarationWithJumpTablePtr(
1431 Function *F, Constant *JT, bool IsJumpTableCanonical) {
1432 // The target expression can not appear in a constant initializer on most
1433 // (all?) targets. Switch to a runtime initializer.
1434 SmallSetVector<GlobalVariable *, 8> GlobalVarUsers;
1435 findGlobalVariableUsersOf(F, GlobalVarUsers);
1436 for (auto *GV : GlobalVarUsers) {
1437 if (GV == GlobalAnnotation)
1438 continue;
1439 moveInitializerToModuleConstructor(GV);
1440 }
1441
1442 // Can not RAUW F with an expression that uses F. Replace with a temporary
1443 // placeholder first.
1444 Function *PlaceholderFn =
1445 Function::Create(cast<FunctionType>(F->getValueType()),
1447 F->getAddressSpace(), "", &M);
1448 replaceCfiUses(F, PlaceholderFn, IsJumpTableCanonical);
1449
1451 // Don't use range based loop, because use list will be modified.
1452 while (!PlaceholderFn->use_empty()) {
1453 Use &U = *PlaceholderFn->use_begin();
1454 auto *InsertPt = dyn_cast<Instruction>(U.getUser());
1455 assert(InsertPt && "Non-instruction users should have been eliminated");
1456 auto *PN = dyn_cast<PHINode>(InsertPt);
1457 if (PN)
1458 InsertPt = PN->getIncomingBlock(U)->getTerminator();
1459 IRBuilder Builder(InsertPt);
1460 Value *ICmp = Builder.CreateICmp(CmpInst::ICMP_NE, F,
1461 Constant::getNullValue(F->getType()));
1462 Value *Select = Builder.CreateSelect(ICmp, JT,
1463 Constant::getNullValue(F->getType()));
1464 // For phi nodes, we need to update the incoming value for all operands
1465 // with the same predecessor.
1466 if (PN)
1467 PN->setIncomingValueForBlock(InsertPt->getParent(), Select);
1468 else
1469 U.set(Select);
1470 }
1471 PlaceholderFn->eraseFromParent();
1472}
1473
1474static bool isThumbFunction(Function *F, Triple::ArchType ModuleArch) {
1475 Attribute TFAttr = F->getFnAttribute("target-features");
1476 if (TFAttr.isValid()) {
1478 TFAttr.getValueAsString().split(Features, ',');
1479 for (StringRef Feature : Features) {
1480 if (Feature == "-thumb-mode")
1481 return false;
1482 else if (Feature == "+thumb-mode")
1483 return true;
1484 }
1485 }
1486
1487 return ModuleArch == Triple::thumb;
1488}
1489
1490// Each jump table must be either ARM or Thumb as a whole for the bit-test math
1491// to work. Pick one that matches the majority of members to minimize interop
1492// veneers inserted by the linker.
1493Triple::ArchType LowerTypeTestsModule::selectJumpTableArmEncoding(
1494 ArrayRef<GlobalTypeMember *> Functions) {
1495 if (Arch != Triple::arm && Arch != Triple::thumb)
1496 return Arch;
1497
1498 if (!CanUseThumbBWJumpTable && CanUseArmJumpTable) {
1499 // In architectures that provide Arm and Thumb-1 but not Thumb-2,
1500 // we should always prefer the Arm jump table format, because the
1501 // Thumb-1 one is larger and slower.
1502 return Triple::arm;
1503 }
1504
1505 // Otherwise, go with majority vote.
1506 unsigned ArmCount = 0, ThumbCount = 0;
1507 for (const auto GTM : Functions) {
1508 if (!GTM->isJumpTableCanonical()) {
1509 // PLT stubs are always ARM.
1510 // FIXME: This is the wrong heuristic for non-canonical jump tables.
1511 ++ArmCount;
1512 continue;
1513 }
1514
1515 Function *F = cast<Function>(GTM->getGlobal());
1516 ++(isThumbFunction(F, Arch) ? ThumbCount : ArmCount);
1517 }
1518
1519 return ArmCount > ThumbCount ? Triple::arm : Triple::thumb;
1520}
1521
1522void LowerTypeTestsModule::createJumpTable(
1523 Function *F, ArrayRef<GlobalTypeMember *> Functions,
1524 Triple::ArchType JumpTableArch) {
1525 BasicBlock *BB = BasicBlock::Create(M.getContext(), "entry", F);
1526 IRBuilder<> IRB(BB);
1527
1528 InlineAsm *JumpTableAsm = createJumpTableEntryAsm(JumpTableArch);
1529
1530 // Check if all entries have the NoUnwind attribute.
1531 // If all entries have it, we can safely mark the
1532 // cfi.jumptable as NoUnwind, otherwise, direct calls
1533 // to the jump table will not handle exceptions properly
1534 bool areAllEntriesNounwind = true;
1535 for (GlobalTypeMember *GTM : Functions) {
1536 if (!llvm::cast<llvm::Function>(GTM->getGlobal())
1537 ->hasFnAttribute(llvm::Attribute::NoUnwind)) {
1538 areAllEntriesNounwind = false;
1539 }
1540 IRB.CreateCall(JumpTableAsm, GTM->getGlobal());
1541 }
1542 IRB.CreateUnreachable();
1543
1544 // Align the whole table by entry size.
1545 F->setAlignment(Align(getJumpTableEntrySize(JumpTableArch)));
1546 // Skip prologue.
1547 // Disabled on win32 due to https://llvm.org/bugs/show_bug.cgi?id=28641#c3.
1548 // Luckily, this function does not get any prologue even without the
1549 // attribute.
1550 if (OS != Triple::Win32)
1551 F->addFnAttr(Attribute::Naked);
1552 if (JumpTableArch == Triple::arm)
1553 F->addFnAttr("target-features", "-thumb-mode");
1554 if (JumpTableArch == Triple::thumb) {
1555 if (hasBranchTargetEnforcement()) {
1556 // If we're generating a Thumb jump table with BTI, add a target-features
1557 // setting to ensure BTI can be assembled.
1558 F->addFnAttr("target-features", "+thumb-mode,+pacbti");
1559 } else {
1560 F->addFnAttr("target-features", "+thumb-mode");
1561 if (CanUseThumbBWJumpTable) {
1562 // Thumb jump table assembly needs Thumb2. The following attribute is
1563 // added by Clang for -march=armv7.
1564 F->addFnAttr("target-cpu", "cortex-a8");
1565 }
1566 }
1567 }
1568 // When -mbranch-protection= is used, the inline asm adds a BTI. Suppress BTI
1569 // for the function to avoid double BTI. This is a no-op without
1570 // -mbranch-protection=.
1571 if (JumpTableArch == Triple::aarch64 || JumpTableArch == Triple::thumb) {
1572 if (F->hasFnAttribute("branch-target-enforcement"))
1573 F->removeFnAttr("branch-target-enforcement");
1574 if (F->hasFnAttribute("sign-return-address"))
1575 F->removeFnAttr("sign-return-address");
1576 }
1577 if (JumpTableArch == Triple::riscv32 || JumpTableArch == Triple::riscv64) {
1578 // Make sure the jump table assembly is not modified by the assembler or
1579 // the linker.
1580 F->addFnAttr("target-features", "-c,-relax");
1581 }
1582 // When -fcf-protection= is used, the inline asm adds an ENDBR. Suppress ENDBR
1583 // for the function to avoid double ENDBR. This is a no-op without
1584 // -fcf-protection=.
1585 if (JumpTableArch == Triple::x86 || JumpTableArch == Triple::x86_64)
1586 F->addFnAttr(Attribute::NoCfCheck);
1587
1588 // Make sure we don't emit .eh_frame for this function if it isn't needed.
1589 if (areAllEntriesNounwind)
1590 F->addFnAttr(Attribute::NoUnwind);
1591
1592 // Make sure we do not inline any calls to the cfi.jumptable.
1593 F->addFnAttr(Attribute::NoInline);
1594}
1595
1596/// Given a disjoint set of type identifiers and functions, build a jump table
1597/// for the functions, build the bit sets and lower the llvm.type.test calls.
1598void LowerTypeTestsModule::buildBitSetsFromFunctionsNative(
1600 // Unlike the global bitset builder, the function bitset builder cannot
1601 // re-arrange functions in a particular order and base its calculations on the
1602 // layout of the functions' entry points, as we have no idea how large a
1603 // particular function will end up being (the size could even depend on what
1604 // this pass does!) Instead, we build a jump table, which is a block of code
1605 // consisting of one branch instruction for each of the functions in the bit
1606 // set that branches to the target function, and redirect any taken function
1607 // addresses to the corresponding jump table entry. In the object file's
1608 // symbol table, the symbols for the target functions also refer to the jump
1609 // table entries, so that addresses taken outside the module will pass any
1610 // verification done inside the module.
1611 //
1612 // In more concrete terms, suppose we have three functions f, g, h which are
1613 // of the same type, and a function foo that returns their addresses:
1614 //
1615 // f:
1616 // mov 0, %eax
1617 // ret
1618 //
1619 // g:
1620 // mov 1, %eax
1621 // ret
1622 //
1623 // h:
1624 // mov 2, %eax
1625 // ret
1626 //
1627 // foo:
1628 // mov f, %eax
1629 // mov g, %edx
1630 // mov h, %ecx
1631 // ret
1632 //
1633 // We output the jump table as module-level inline asm string. The end result
1634 // will (conceptually) look like this:
1635 //
1636 // f = .cfi.jumptable
1637 // g = .cfi.jumptable + 4
1638 // h = .cfi.jumptable + 8
1639 // .cfi.jumptable:
1640 // jmp f.cfi ; 5 bytes
1641 // int3 ; 1 byte
1642 // int3 ; 1 byte
1643 // int3 ; 1 byte
1644 // jmp g.cfi ; 5 bytes
1645 // int3 ; 1 byte
1646 // int3 ; 1 byte
1647 // int3 ; 1 byte
1648 // jmp h.cfi ; 5 bytes
1649 // int3 ; 1 byte
1650 // int3 ; 1 byte
1651 // int3 ; 1 byte
1652 //
1653 // f.cfi:
1654 // mov 0, %eax
1655 // ret
1656 //
1657 // g.cfi:
1658 // mov 1, %eax
1659 // ret
1660 //
1661 // h.cfi:
1662 // mov 2, %eax
1663 // ret
1664 //
1665 // foo:
1666 // mov f, %eax
1667 // mov g, %edx
1668 // mov h, %ecx
1669 // ret
1670 //
1671 // Because the addresses of f, g, h are evenly spaced at a power of 2, in the
1672 // normal case the check can be carried out using the same kind of simple
1673 // arithmetic that we normally use for globals.
1674
1675 // FIXME: find a better way to represent the jumptable in the IR.
1676 assert(!Functions.empty());
1677
1678 // Decide on the jump table encoding, so that we know how big the
1679 // entries will be.
1680 Triple::ArchType JumpTableArch = selectJumpTableArmEncoding(Functions);
1681
1682 // Build a simple layout based on the regular layout of jump tables.
1683 DenseMap<GlobalTypeMember *, uint64_t> GlobalLayout;
1684 unsigned EntrySize = getJumpTableEntrySize(JumpTableArch);
1685 for (unsigned I = 0; I != Functions.size(); ++I)
1686 GlobalLayout[Functions[I]] = I * EntrySize;
1687
1688 Function *JumpTableFn =
1690 /* IsVarArg */ false),
1692 M.getDataLayout().getProgramAddressSpace(),
1693 ".cfi.jumptable", &M);
1694 ArrayType *JumpTableEntryType = ArrayType::get(Int8Ty, EntrySize);
1696 ArrayType::get(JumpTableEntryType, Functions.size());
1698 JumpTableFn, PointerType::getUnqual(M.getContext()));
1699
1700 lowerTypeTestCalls(TypeIds, JumpTable, GlobalLayout);
1701
1702 // Build aliases pointing to offsets into the jump table, and replace
1703 // references to the original functions with references to the aliases.
1704 for (unsigned I = 0; I != Functions.size(); ++I) {
1705 Function *F = cast<Function>(Functions[I]->getGlobal());
1706 bool IsJumpTableCanonical = Functions[I]->isJumpTableCanonical();
1707
1708 Constant *CombinedGlobalElemPtr = ConstantExpr::getInBoundsGetElementPtr(
1709 JumpTableType, JumpTable,
1710 ArrayRef<Constant *>{ConstantInt::get(IntPtrTy, 0),
1711 ConstantInt::get(IntPtrTy, I)});
1712
1713 const bool IsExported = Functions[I]->isExported();
1714 if (!IsJumpTableCanonical) {
1717 GlobalAlias *JtAlias = GlobalAlias::create(JumpTableEntryType, 0, LT,
1718 F->getName() + ".cfi_jt",
1719 CombinedGlobalElemPtr, &M);
1720 if (IsExported)
1722 else
1723 appendToUsed(M, {JtAlias});
1724 }
1725
1726 if (IsExported) {
1727 if (IsJumpTableCanonical)
1728 ExportSummary->cfiFunctionDefs().emplace(F->getName());
1729 else
1730 ExportSummary->cfiFunctionDecls().emplace(F->getName());
1731 }
1732
1733 if (!IsJumpTableCanonical) {
1734 if (F->hasExternalWeakLinkage())
1735 replaceWeakDeclarationWithJumpTablePtr(F, CombinedGlobalElemPtr,
1736 IsJumpTableCanonical);
1737 else
1738 replaceCfiUses(F, CombinedGlobalElemPtr, IsJumpTableCanonical);
1739 } else {
1740 assert(F->getType()->getAddressSpace() == 0);
1741
1742 GlobalAlias *FAlias =
1743 GlobalAlias::create(JumpTableEntryType, 0, F->getLinkage(), "",
1744 CombinedGlobalElemPtr, &M);
1745 FAlias->setVisibility(F->getVisibility());
1746 FAlias->takeName(F);
1747 if (FAlias->hasName()) {
1748 F->setName(FAlias->getName() + ".cfi");
1749 maybeReplaceComdat(F, FAlias->getName());
1750 }
1751 replaceCfiUses(F, FAlias, IsJumpTableCanonical);
1752 if (!F->hasLocalLinkage())
1753 F->setVisibility(GlobalVariable::HiddenVisibility);
1754 }
1755 }
1756
1757 createJumpTable(JumpTableFn, Functions, JumpTableArch);
1758}
1759
1760/// Assign a dummy layout using an incrementing counter, tag each function
1761/// with its index represented as metadata, and lower each type test to an
1762/// integer range comparison. During generation of the indirect function call
1763/// table in the backend, it will assign the given indexes.
1764/// Note: Dynamic linking is not supported, as the WebAssembly ABI has not yet
1765/// been finalized.
1766void LowerTypeTestsModule::buildBitSetsFromFunctionsWASM(
1768 assert(!Functions.empty());
1769
1770 // Build consecutive monotonic integer ranges for each call target set
1771 DenseMap<GlobalTypeMember *, uint64_t> GlobalLayout;
1772
1773 for (GlobalTypeMember *GTM : Functions) {
1774 Function *F = cast<Function>(GTM->getGlobal());
1775
1776 // Skip functions that are not address taken, to avoid bloating the table
1777 if (!F->hasAddressTaken())
1778 continue;
1779
1780 // Store metadata with the index for each function
1781 MDNode *MD = MDNode::get(F->getContext(),
1783 ConstantInt::get(Int64Ty, IndirectIndex))));
1784 F->setMetadata("wasm.index", MD);
1785
1786 // Assign the counter value
1787 GlobalLayout[GTM] = IndirectIndex++;
1788 }
1789
1790 // The indirect function table index space starts at zero, so pass a NULL
1791 // pointer as the subtracted "jump table" offset.
1792 lowerTypeTestCalls(TypeIds, ConstantPointerNull::get(PtrTy),
1793 GlobalLayout);
1794}
1795
1796void LowerTypeTestsModule::buildBitSetsFromDisjointSet(
1798 ArrayRef<ICallBranchFunnel *> ICallBranchFunnels) {
1799 DenseMap<Metadata *, uint64_t> TypeIdIndices;
1800 for (unsigned I = 0; I != TypeIds.size(); ++I)
1801 TypeIdIndices[TypeIds[I]] = I;
1802
1803 // For each type identifier, build a set of indices that refer to members of
1804 // the type identifier.
1805 std::vector<std::set<uint64_t>> TypeMembers(TypeIds.size());
1806 unsigned GlobalIndex = 0;
1807 DenseMap<GlobalTypeMember *, uint64_t> GlobalIndices;
1808 for (GlobalTypeMember *GTM : Globals) {
1809 for (MDNode *Type : GTM->types()) {
1810 // Type = { offset, type identifier }
1811 auto I = TypeIdIndices.find(Type->getOperand(1));
1812 if (I != TypeIdIndices.end())
1813 TypeMembers[I->second].insert(GlobalIndex);
1814 }
1815 GlobalIndices[GTM] = GlobalIndex;
1816 GlobalIndex++;
1817 }
1818
1819 for (ICallBranchFunnel *JT : ICallBranchFunnels) {
1820 TypeMembers.emplace_back();
1821 std::set<uint64_t> &TMSet = TypeMembers.back();
1822 for (GlobalTypeMember *T : JT->targets())
1823 TMSet.insert(GlobalIndices[T]);
1824 }
1825
1826 // Order the sets of indices by size. The GlobalLayoutBuilder works best
1827 // when given small index sets first.
1828 llvm::stable_sort(TypeMembers, [](const std::set<uint64_t> &O1,
1829 const std::set<uint64_t> &O2) {
1830 return O1.size() < O2.size();
1831 });
1832
1833 // Create a GlobalLayoutBuilder and provide it with index sets as layout
1834 // fragments. The GlobalLayoutBuilder tries to lay out members of fragments as
1835 // close together as possible.
1836 GlobalLayoutBuilder GLB(Globals.size());
1837 for (auto &&MemSet : TypeMembers)
1838 GLB.addFragment(MemSet);
1839
1840 // Build a vector of globals with the computed layout.
1841 bool IsGlobalSet =
1842 Globals.empty() || isa<GlobalVariable>(Globals[0]->getGlobal());
1843 std::vector<GlobalTypeMember *> OrderedGTMs(Globals.size());
1844 auto OGTMI = OrderedGTMs.begin();
1845 for (auto &&F : GLB.Fragments) {
1846 for (auto &&Offset : F) {
1847 if (IsGlobalSet != isa<GlobalVariable>(Globals[Offset]->getGlobal()))
1848 report_fatal_error("Type identifier may not contain both global "
1849 "variables and functions");
1850 *OGTMI++ = Globals[Offset];
1851 }
1852 }
1853
1854 // Build the bitsets from this disjoint set.
1855 if (IsGlobalSet)
1856 buildBitSetsFromGlobalVariables(TypeIds, OrderedGTMs);
1857 else
1858 buildBitSetsFromFunctions(TypeIds, OrderedGTMs);
1859}
1860
1861/// Lower all type tests in this module.
1862LowerTypeTestsModule::LowerTypeTestsModule(
1863 Module &M, ModuleAnalysisManager &AM, ModuleSummaryIndex *ExportSummary,
1864 const ModuleSummaryIndex *ImportSummary, DropTestKind DropTypeTests)
1865 : M(M), ExportSummary(ExportSummary), ImportSummary(ImportSummary),
1866 DropTypeTests(ClDropTypeTests > DropTypeTests ? ClDropTypeTests
1867 : DropTypeTests) {
1868 assert(!(ExportSummary && ImportSummary));
1869 Triple TargetTriple(M.getTargetTriple());
1870 Arch = TargetTriple.getArch();
1871 if (Arch == Triple::arm)
1872 CanUseArmJumpTable = true;
1873 if (Arch == Triple::arm || Arch == Triple::thumb) {
1874 auto &FAM =
1876 for (Function &F : M) {
1877 // Skip declarations since we should not query the TTI for them.
1878 if (F.isDeclaration())
1879 continue;
1880 auto &TTI = FAM.getResult<TargetIRAnalysis>(F);
1881 if (TTI.hasArmWideBranch(false))
1882 CanUseArmJumpTable = true;
1883 if (TTI.hasArmWideBranch(true))
1884 CanUseThumbBWJumpTable = true;
1885 }
1886 }
1887 OS = TargetTriple.getOS();
1888 ObjectFormat = TargetTriple.getObjectFormat();
1889
1890 // Function annotation describes or applies to function itself, and
1891 // shouldn't be associated with jump table thunk generated for CFI.
1892 GlobalAnnotation = M.getGlobalVariable("llvm.global.annotations");
1893 if (GlobalAnnotation && GlobalAnnotation->hasInitializer()) {
1894 const ConstantArray *CA =
1895 cast<ConstantArray>(GlobalAnnotation->getInitializer());
1896 FunctionAnnotations.insert_range(CA->operands());
1897 }
1898}
1899
1900bool LowerTypeTestsModule::runForTesting(Module &M, ModuleAnalysisManager &AM) {
1901 ModuleSummaryIndex Summary(/*HaveGVs=*/false);
1902
1903 // Handle the command-line summary arguments. This code is for testing
1904 // purposes only, so we handle errors directly.
1905 if (!ClReadSummary.empty()) {
1906 ExitOnError ExitOnErr("-lowertypetests-read-summary: " + ClReadSummary +
1907 ": ");
1908 auto ReadSummaryFile = ExitOnErr(errorOrToExpected(
1909 MemoryBuffer::getFile(ClReadSummary, /*IsText=*/true)));
1910
1911 yaml::Input In(ReadSummaryFile->getBuffer());
1912 In >> Summary;
1913 ExitOnErr(errorCodeToError(In.error()));
1914 }
1915
1916 bool Changed =
1917 LowerTypeTestsModule(
1918 M, AM,
1919 ClSummaryAction == PassSummaryAction::Export ? &Summary : nullptr,
1920 ClSummaryAction == PassSummaryAction::Import ? &Summary : nullptr,
1921 /*DropTypeTests=*/DropTestKind::None)
1922 .lower();
1923
1924 if (!ClWriteSummary.empty()) {
1925 ExitOnError ExitOnErr("-lowertypetests-write-summary: " + ClWriteSummary +
1926 ": ");
1927 std::error_code EC;
1928 raw_fd_ostream OS(ClWriteSummary, EC, sys::fs::OF_TextWithCRLF);
1929 ExitOnErr(errorCodeToError(EC));
1930
1931 yaml::Output Out(OS);
1932 Out << Summary;
1933 }
1934
1935 return Changed;
1936}
1937
1938static bool isDirectCall(Use& U) {
1939 auto *Usr = dyn_cast<CallInst>(U.getUser());
1940 if (Usr) {
1941 auto *CB = dyn_cast<CallBase>(Usr);
1942 if (CB && CB->isCallee(&U))
1943 return true;
1944 }
1945 return false;
1946}
1947
1948void LowerTypeTestsModule::replaceCfiUses(Function *Old, Value *New,
1949 bool IsJumpTableCanonical) {
1950 SmallSetVector<Constant *, 4> Constants;
1951 for (Use &U : llvm::make_early_inc_range(Old->uses())) {
1952 // Skip no_cfi values, which refer to the function body instead of the jump
1953 // table.
1954 if (isa<NoCFIValue>(U.getUser()))
1955 continue;
1956
1957 // Skip direct calls to externally defined or non-dso_local functions.
1958 if (isDirectCall(U) && (Old->isDSOLocal() || !IsJumpTableCanonical))
1959 continue;
1960
1961 // Skip function annotation.
1962 if (isFunctionAnnotation(U.getUser()))
1963 continue;
1964
1965 // Must handle Constants specially, we cannot call replaceUsesOfWith on a
1966 // constant because they are uniqued.
1967 if (auto *C = dyn_cast<Constant>(U.getUser())) {
1968 if (!isa<GlobalValue>(C)) {
1969 // Save unique users to avoid processing operand replacement
1970 // more than once.
1971 Constants.insert(C);
1972 continue;
1973 }
1974 }
1975
1976 U.set(New);
1977 }
1978
1979 // Process operand replacement of saved constants.
1980 for (auto *C : Constants)
1981 C->handleOperandChange(Old, New);
1982}
1983
1984void LowerTypeTestsModule::replaceDirectCalls(Value *Old, Value *New) {
1986}
1987
1988static void dropTypeTests(Module &M, Function &TypeTestFunc,
1989 bool ShouldDropAll) {
1990 for (Use &U : llvm::make_early_inc_range(TypeTestFunc.uses())) {
1991 auto *CI = cast<CallInst>(U.getUser());
1992 // Find and erase llvm.assume intrinsics for this llvm.type.test call.
1993 for (Use &CIU : llvm::make_early_inc_range(CI->uses()))
1994 if (auto *Assume = dyn_cast<AssumeInst>(CIU.getUser()))
1995 Assume->eraseFromParent();
1996 // If the assume was merged with another assume, we might have a use on a
1997 // phi (which will feed the assume). Simply replace the use on the phi
1998 // with "true" and leave the merged assume.
1999 //
2000 // If ShouldDropAll is set, then we we need to update any remaining uses,
2001 // regardless of the instruction type.
2002 if (!CI->use_empty()) {
2003 assert(ShouldDropAll || all_of(CI->users(), [](User *U) -> bool {
2004 return isa<PHINode>(U);
2005 }));
2006 CI->replaceAllUsesWith(ConstantInt::getTrue(M.getContext()));
2007 }
2008 CI->eraseFromParent();
2009 }
2010}
2011
2012bool LowerTypeTestsModule::lower() {
2013 Function *TypeTestFunc =
2014 Intrinsic::getDeclarationIfExists(&M, Intrinsic::type_test);
2015
2016 if (DropTypeTests != DropTestKind::None) {
2017 bool ShouldDropAll = DropTypeTests == DropTestKind::All;
2018 if (TypeTestFunc)
2019 dropTypeTests(M, *TypeTestFunc, ShouldDropAll);
2020 // Normally we'd have already removed all @llvm.public.type.test calls,
2021 // except for in the case where we originally were performing ThinLTO but
2022 // decided not to in the backend.
2023 Function *PublicTypeTestFunc =
2024 Intrinsic::getDeclarationIfExists(&M, Intrinsic::public_type_test);
2025 if (PublicTypeTestFunc)
2026 dropTypeTests(M, *PublicTypeTestFunc, ShouldDropAll);
2027 if (TypeTestFunc || PublicTypeTestFunc) {
2028 // We have deleted the type intrinsics, so we no longer have enough
2029 // information to reason about the liveness of virtual function pointers
2030 // in GlobalDCE.
2031 for (GlobalVariable &GV : M.globals())
2032 GV.eraseMetadata(LLVMContext::MD_vcall_visibility);
2033 return true;
2034 }
2035 return false;
2036 }
2037
2038 // If only some of the modules were split, we cannot correctly perform
2039 // this transformation. We already checked for the presense of type tests
2040 // with partially split modules during the thin link, and would have emitted
2041 // an error if any were found, so here we can simply return.
2042 if ((ExportSummary && ExportSummary->partiallySplitLTOUnits()) ||
2043 (ImportSummary && ImportSummary->partiallySplitLTOUnits()))
2044 return false;
2045
2046 Function *ICallBranchFunnelFunc =
2047 Intrinsic::getDeclarationIfExists(&M, Intrinsic::icall_branch_funnel);
2048 if ((!TypeTestFunc || TypeTestFunc->use_empty()) &&
2049 (!ICallBranchFunnelFunc || ICallBranchFunnelFunc->use_empty()) &&
2050 !ExportSummary && !ImportSummary)
2051 return false;
2052
2053 if (ImportSummary) {
2054 if (TypeTestFunc)
2055 for (Use &U : llvm::make_early_inc_range(TypeTestFunc->uses()))
2056 importTypeTest(cast<CallInst>(U.getUser()));
2057
2058 if (ICallBranchFunnelFunc && !ICallBranchFunnelFunc->use_empty())
2060 "unexpected call to llvm.icall.branch.funnel during import phase");
2061
2064 for (auto &F : M) {
2065 // CFI functions are either external, or promoted. A local function may
2066 // have the same name, but it's not the one we are looking for.
2067 if (F.hasLocalLinkage())
2068 continue;
2069 if (ImportSummary->cfiFunctionDefs().count(F.getName()))
2070 Defs.push_back(&F);
2071 else if (ImportSummary->cfiFunctionDecls().count(F.getName()))
2072 Decls.push_back(&F);
2073 }
2074
2075 {
2076 ScopedSaveAliaseesAndUsed S(M);
2077 for (auto *F : Defs)
2078 importFunction(F, /*isJumpTableCanonical*/ true);
2079 for (auto *F : Decls)
2080 importFunction(F, /*isJumpTableCanonical*/ false);
2081 }
2082
2083 return true;
2084 }
2085
2086 // Equivalence class set containing type identifiers and the globals that
2087 // reference them. This is used to partition the set of type identifiers in
2088 // the module into disjoint sets.
2089 using GlobalClassesTy = EquivalenceClasses<
2090 PointerUnion<GlobalTypeMember *, Metadata *, ICallBranchFunnel *>>;
2091 GlobalClassesTy GlobalClasses;
2092
2093 // Verify the type metadata and build a few data structures to let us
2094 // efficiently enumerate the type identifiers associated with a global:
2095 // a list of GlobalTypeMembers (a GlobalObject stored alongside a vector
2096 // of associated type metadata) and a mapping from type identifiers to their
2097 // list of GlobalTypeMembers and last observed index in the list of globals.
2098 // The indices will be used later to deterministically order the list of type
2099 // identifiers.
2101 struct TIInfo {
2102 unsigned UniqueId;
2103 std::vector<GlobalTypeMember *> RefGlobals;
2104 };
2105 DenseMap<Metadata *, TIInfo> TypeIdInfo;
2106 unsigned CurUniqueId = 0;
2108
2109 // Cross-DSO CFI emits jumptable entries for exported functions as well as
2110 // address taken functions in case they are address taken in other modules.
2111 const bool CrossDsoCfi = M.getModuleFlag("Cross-DSO CFI") != nullptr;
2112
2113 struct ExportedFunctionInfo {
2115 MDNode *FuncMD; // {name, linkage, type[, type...]}
2116 };
2117 MapVector<StringRef, ExportedFunctionInfo> ExportedFunctions;
2118 if (ExportSummary) {
2119 NamedMDNode *CfiFunctionsMD = M.getNamedMetadata("cfi.functions");
2120 if (CfiFunctionsMD) {
2121 // A set of all functions that are address taken by a live global object.
2122 DenseSet<GlobalValue::GUID> AddressTaken;
2123 for (auto &I : *ExportSummary)
2124 for (auto &GVS : I.second.SummaryList)
2125 if (GVS->isLive())
2126 for (const auto &Ref : GVS->refs()) {
2127 AddressTaken.insert(Ref.getGUID());
2128 for (auto &RefGVS : Ref.getSummaryList())
2129 if (auto Alias = dyn_cast<AliasSummary>(RefGVS.get()))
2130 AddressTaken.insert(Alias->getAliaseeGUID());
2131 }
2133 if (AddressTaken.count(GUID))
2134 return true;
2135 auto VI = ExportSummary->getValueInfo(GUID);
2136 if (!VI)
2137 return false;
2138 for (auto &I : VI.getSummaryList())
2139 if (auto Alias = dyn_cast<AliasSummary>(I.get()))
2140 if (AddressTaken.count(Alias->getAliaseeGUID()))
2141 return true;
2142 return false;
2143 };
2144 for (auto *FuncMD : CfiFunctionsMD->operands()) {
2145 assert(FuncMD->getNumOperands() >= 2);
2146 StringRef FunctionName =
2147 cast<MDString>(FuncMD->getOperand(0))->getString();
2149 cast<ConstantAsMetadata>(FuncMD->getOperand(1))
2150 ->getValue()
2151 ->getUniqueInteger()
2152 .getZExtValue());
2153 const GlobalValue::GUID GUID =
2156 // Do not emit jumptable entries for functions that are not-live and
2157 // have no live references (and are not exported with cross-DSO CFI.)
2158 if (!ExportSummary->isGUIDLive(GUID))
2159 continue;
2160 if (!IsAddressTaken(GUID)) {
2161 if (!CrossDsoCfi || Linkage != CFL_Definition)
2162 continue;
2163
2164 bool Exported = false;
2165 if (auto VI = ExportSummary->getValueInfo(GUID))
2166 for (const auto &GVS : VI.getSummaryList())
2167 if (GVS->isLive() && !GlobalValue::isLocalLinkage(GVS->linkage()))
2168 Exported = true;
2169
2170 if (!Exported)
2171 continue;
2172 }
2173 auto P = ExportedFunctions.insert({FunctionName, {Linkage, FuncMD}});
2174 if (!P.second && P.first->second.Linkage != CFL_Definition)
2175 P.first->second = {Linkage, FuncMD};
2176 }
2177
2178 for (const auto &P : ExportedFunctions) {
2179 StringRef FunctionName = P.first;
2180 CfiFunctionLinkage Linkage = P.second.Linkage;
2181 MDNode *FuncMD = P.second.FuncMD;
2182 Function *F = M.getFunction(FunctionName);
2183 if (F && F->hasLocalLinkage()) {
2184 // Locally defined function that happens to have the same name as a
2185 // function defined in a ThinLTO module. Rename it to move it out of
2186 // the way of the external reference that we're about to create.
2187 // Note that setName will find a unique name for the function, so even
2188 // if there is an existing function with the suffix there won't be a
2189 // name collision.
2190 F->setName(F->getName() + ".1");
2191 F = nullptr;
2192 }
2193
2194 if (!F)
2196 FunctionType::get(Type::getVoidTy(M.getContext()), false),
2197 GlobalVariable::ExternalLinkage,
2198 M.getDataLayout().getProgramAddressSpace(), FunctionName, &M);
2199
2200 // If the function is available_externally, remove its definition so
2201 // that it is handled the same way as a declaration. Later we will try
2202 // to create an alias using this function's linkage, which will fail if
2203 // the linkage is available_externally. This will also result in us
2204 // following the code path below to replace the type metadata.
2205 if (F->hasAvailableExternallyLinkage()) {
2206 F->setLinkage(GlobalValue::ExternalLinkage);
2207 F->deleteBody();
2208 F->setComdat(nullptr);
2209 F->clearMetadata();
2210 }
2211
2212 // Update the linkage for extern_weak declarations when a definition
2213 // exists.
2214 if (Linkage == CFL_Definition && F->hasExternalWeakLinkage())
2215 F->setLinkage(GlobalValue::ExternalLinkage);
2216
2217 // If the function in the full LTO module is a declaration, replace its
2218 // type metadata with the type metadata we found in cfi.functions. That
2219 // metadata is presumed to be more accurate than the metadata attached
2220 // to the declaration.
2221 if (F->isDeclaration()) {
2224
2225 F->eraseMetadata(LLVMContext::MD_type);
2226 for (unsigned I = 2; I < FuncMD->getNumOperands(); ++I)
2227 F->addMetadata(LLVMContext::MD_type,
2228 *cast<MDNode>(FuncMD->getOperand(I).get()));
2229 }
2230 }
2231 }
2232 }
2233
2234 struct AliasToCreate {
2235 Function *Alias;
2236 std::string TargetName;
2237 };
2238 std::vector<AliasToCreate> AliasesToCreate;
2239
2240 // Parse alias data to replace stand-in function declarations for aliases
2241 // with an alias to the intended target.
2242 if (ExportSummary) {
2243 if (NamedMDNode *AliasesMD = M.getNamedMetadata("aliases")) {
2244 for (auto *AliasMD : AliasesMD->operands()) {
2246 for (Metadata *MD : AliasMD->operands()) {
2247 auto *MDS = dyn_cast<MDString>(MD);
2248 if (!MDS)
2249 continue;
2250 StringRef AliasName = MDS->getString();
2251 if (!ExportedFunctions.count(AliasName))
2252 continue;
2253 auto *AliasF = M.getFunction(AliasName);
2254 if (AliasF)
2255 Aliases.push_back(AliasF);
2256 }
2257
2258 if (Aliases.empty())
2259 continue;
2260
2261 for (unsigned I = 1; I != Aliases.size(); ++I) {
2262 auto *AliasF = Aliases[I];
2263 ExportedFunctions.erase(AliasF->getName());
2264 AliasesToCreate.push_back(
2265 {AliasF, std::string(Aliases[0]->getName())});
2266 }
2267 }
2268 }
2269 }
2270
2271 DenseMap<GlobalObject *, GlobalTypeMember *> GlobalTypeMembers;
2272 for (GlobalObject &GO : M.global_objects()) {
2274 continue;
2275
2276 Types.clear();
2277 GO.getMetadata(LLVMContext::MD_type, Types);
2278
2279 bool IsJumpTableCanonical = false;
2280 bool IsExported = false;
2281 if (Function *F = dyn_cast<Function>(&GO)) {
2282 IsJumpTableCanonical = isJumpTableCanonical(F);
2283 if (auto It = ExportedFunctions.find(F->getName());
2284 It != ExportedFunctions.end()) {
2285 IsJumpTableCanonical |= It->second.Linkage == CFL_Definition;
2286 IsExported = true;
2287 // TODO: The logic here checks only that the function is address taken,
2288 // not that the address takers are live. This can be updated to check
2289 // their liveness and emit fewer jumptable entries once monolithic LTO
2290 // builds also emit summaries.
2291 } else if (!F->hasAddressTaken()) {
2292 if (!CrossDsoCfi || !IsJumpTableCanonical || F->hasLocalLinkage())
2293 continue;
2294 }
2295 }
2296
2297 auto *GTM = GlobalTypeMember::create(Alloc, &GO, IsJumpTableCanonical,
2298 IsExported, Types);
2299 GlobalTypeMembers[&GO] = GTM;
2300 for (MDNode *Type : Types) {
2301 verifyTypeMDNode(&GO, Type);
2302 auto &Info = TypeIdInfo[Type->getOperand(1)];
2303 Info.UniqueId = ++CurUniqueId;
2304 Info.RefGlobals.push_back(GTM);
2305 }
2306 }
2307
2308 auto AddTypeIdUse = [&](Metadata *TypeId) -> TypeIdUserInfo & {
2309 // Add the call site to the list of call sites for this type identifier. We
2310 // also use TypeIdUsers to keep track of whether we have seen this type
2311 // identifier before. If we have, we don't need to re-add the referenced
2312 // globals to the equivalence class.
2313 auto Ins = TypeIdUsers.insert({TypeId, {}});
2314 if (Ins.second) {
2315 // Add the type identifier to the equivalence class.
2316 auto &GCI = GlobalClasses.insert(TypeId);
2317 GlobalClassesTy::member_iterator CurSet = GlobalClasses.findLeader(GCI);
2318
2319 // Add the referenced globals to the type identifier's equivalence class.
2320 for (GlobalTypeMember *GTM : TypeIdInfo[TypeId].RefGlobals)
2321 CurSet = GlobalClasses.unionSets(
2322 CurSet, GlobalClasses.findLeader(GlobalClasses.insert(GTM)));
2323 }
2324
2325 return Ins.first->second;
2326 };
2327
2328 if (TypeTestFunc) {
2329 for (const Use &U : TypeTestFunc->uses()) {
2330 auto CI = cast<CallInst>(U.getUser());
2331 // If this type test is only used by llvm.assume instructions, it
2332 // was used for whole program devirtualization, and is being kept
2333 // for use by other optimization passes. We do not need or want to
2334 // lower it here. We also don't want to rewrite any associated globals
2335 // unnecessarily. These will be removed by a subsequent LTT invocation
2336 // with the DropTypeTests flag set.
2337 bool OnlyAssumeUses = !CI->use_empty();
2338 for (const Use &CIU : CI->uses()) {
2339 if (isa<AssumeInst>(CIU.getUser()))
2340 continue;
2341 OnlyAssumeUses = false;
2342 break;
2343 }
2344 if (OnlyAssumeUses)
2345 continue;
2346
2347 auto TypeIdMDVal = dyn_cast<MetadataAsValue>(CI->getArgOperand(1));
2348 if (!TypeIdMDVal)
2349 report_fatal_error("Second argument of llvm.type.test must be metadata");
2350 auto TypeId = TypeIdMDVal->getMetadata();
2351 AddTypeIdUse(TypeId).CallSites.push_back(CI);
2352 }
2353 }
2354
2355 if (ICallBranchFunnelFunc) {
2356 for (const Use &U : ICallBranchFunnelFunc->uses()) {
2357 if (Arch != Triple::x86_64)
2359 "llvm.icall.branch.funnel not supported on this target");
2360
2361 auto CI = cast<CallInst>(U.getUser());
2362
2363 std::vector<GlobalTypeMember *> Targets;
2364 if (CI->arg_size() % 2 != 1)
2365 report_fatal_error("number of arguments should be odd");
2366
2367 GlobalClassesTy::member_iterator CurSet;
2368 for (unsigned I = 1; I != CI->arg_size(); I += 2) {
2369 int64_t Offset;
2371 CI->getOperand(I), Offset, M.getDataLayout()));
2372 if (!Base)
2374 "Expected branch funnel operand to be global value");
2375
2376 GlobalTypeMember *GTM = GlobalTypeMembers[Base];
2377 Targets.push_back(GTM);
2378 GlobalClassesTy::member_iterator NewSet =
2379 GlobalClasses.findLeader(GlobalClasses.insert(GTM));
2380 if (I == 1)
2381 CurSet = NewSet;
2382 else
2383 CurSet = GlobalClasses.unionSets(CurSet, NewSet);
2384 }
2385
2386 GlobalClasses.unionSets(
2387 CurSet, GlobalClasses.findLeader(
2388 GlobalClasses.insert(ICallBranchFunnel::create(
2389 Alloc, CI, Targets, ++CurUniqueId))));
2390 }
2391 }
2392
2393 if (ExportSummary) {
2394 DenseMap<GlobalValue::GUID, TinyPtrVector<Metadata *>> MetadataByGUID;
2395 for (auto &P : TypeIdInfo) {
2396 if (auto *TypeId = dyn_cast<MDString>(P.first))
2398 TypeId->getString())]
2399 .push_back(TypeId);
2400 }
2401
2402 for (auto &P : *ExportSummary) {
2403 for (auto &S : P.second.SummaryList) {
2404 if (!ExportSummary->isGlobalValueLive(S.get()))
2405 continue;
2406 if (auto *FS = dyn_cast<FunctionSummary>(S->getBaseObject()))
2407 for (GlobalValue::GUID G : FS->type_tests())
2408 for (Metadata *MD : MetadataByGUID[G])
2409 AddTypeIdUse(MD).IsExported = true;
2410 }
2411 }
2412 }
2413
2414 if (GlobalClasses.empty())
2415 return false;
2416
2417 {
2418 ScopedSaveAliaseesAndUsed S(M);
2419 // For each disjoint set we found...
2420 for (const auto &C : GlobalClasses) {
2421 if (!C->isLeader())
2422 continue;
2423
2424 ++NumTypeIdDisjointSets;
2425 // Build the list of type identifiers in this disjoint set.
2426 std::vector<Metadata *> TypeIds;
2427 std::vector<GlobalTypeMember *> Globals;
2428 std::vector<ICallBranchFunnel *> ICallBranchFunnels;
2429 for (auto M : GlobalClasses.members(*C)) {
2430 if (isa<Metadata *>(M))
2431 TypeIds.push_back(cast<Metadata *>(M));
2432 else if (isa<GlobalTypeMember *>(M))
2433 Globals.push_back(cast<GlobalTypeMember *>(M));
2434 else
2435 ICallBranchFunnels.push_back(cast<ICallBranchFunnel *>(M));
2436 }
2437
2438 // Order type identifiers by unique ID for determinism. This ordering is
2439 // stable as there is a one-to-one mapping between metadata and unique
2440 // IDs.
2441 llvm::sort(TypeIds, [&](Metadata *M1, Metadata *M2) {
2442 return TypeIdInfo[M1].UniqueId < TypeIdInfo[M2].UniqueId;
2443 });
2444
2445 // Same for the branch funnels.
2446 llvm::sort(ICallBranchFunnels,
2447 [&](ICallBranchFunnel *F1, ICallBranchFunnel *F2) {
2448 return F1->UniqueId < F2->UniqueId;
2449 });
2450
2451 // Build bitsets for this disjoint set.
2452 buildBitSetsFromDisjointSet(TypeIds, Globals, ICallBranchFunnels);
2453 }
2454 }
2455
2456 allocateByteArrays();
2457
2458 for (auto A : AliasesToCreate) {
2459 auto *Target = M.getNamedValue(A.TargetName);
2460 if (!isa<GlobalAlias>(Target))
2461 continue;
2462 auto *AliasGA = GlobalAlias::create("", Target);
2463 AliasGA->setVisibility(A.Alias->getVisibility());
2464 AliasGA->setLinkage(A.Alias->getLinkage());
2465 AliasGA->takeName(A.Alias);
2466 A.Alias->replaceAllUsesWith(AliasGA);
2467 A.Alias->eraseFromParent();
2468 }
2469
2470 // Emit .symver directives for exported functions, if they exist.
2471 if (ExportSummary) {
2472 if (NamedMDNode *SymversMD = M.getNamedMetadata("symvers")) {
2473 for (auto *Symver : SymversMD->operands()) {
2474 assert(Symver->getNumOperands() >= 2);
2475 StringRef SymbolName =
2476 cast<MDString>(Symver->getOperand(0))->getString();
2477 StringRef Alias = cast<MDString>(Symver->getOperand(1))->getString();
2478
2479 if (!ExportedFunctions.count(SymbolName))
2480 continue;
2481
2482 M.appendModuleInlineAsm(
2483 (llvm::Twine(".symver ") + SymbolName + ", " + Alias).str());
2484 }
2485 }
2486 }
2487
2488 return true;
2489}
2490
2493 bool Changed;
2494 if (UseCommandLine)
2495 Changed = LowerTypeTestsModule::runForTesting(M, AM);
2496 else
2497 Changed =
2498 LowerTypeTestsModule(M, AM, ExportSummary, ImportSummary, DropTypeTests)
2499 .lower();
2500 if (!Changed)
2501 return PreservedAnalyses::all();
2502 return PreservedAnalyses::none();
2503}
2504
2507 bool Changed = false;
2508 // Figure out whether inlining has exposed a constant address to a lowered
2509 // type test, and remove the test if so and the address is known to pass the
2510 // test. Unfortunately this pass ends up needing to reverse engineer what
2511 // LowerTypeTests did; this is currently inherent to the design of ThinLTO
2512 // importing where LowerTypeTests needs to run at the start.
2513 //
2514 // We look for things like:
2515 //
2516 // sub (i64 ptrtoint (ptr @_Z2fpv to i64), i64 ptrtoint (ptr
2517 // @__typeid__ZTSFvvE_global_addr to i64))
2518 //
2519 // which gets replaced with 0 if _Z2fpv (more specifically _Z2fpv.cfi, the
2520 // function referred to by the jump table) is a member of the type _ZTSFvv, as
2521 // well as things like
2522 //
2523 // icmp eq ptr @_Z2fpv, @__typeid__ZTSFvvE_global_addr
2524 //
2525 // which gets replaced with true if _Z2fpv is a member.
2526 for (auto &GV : M.globals()) {
2527 if (!GV.getName().starts_with("__typeid_") ||
2528 !GV.getName().ends_with("_global_addr"))
2529 continue;
2530 // __typeid_foo_global_addr -> foo
2531 auto *MD = MDString::get(M.getContext(),
2532 GV.getName().substr(9, GV.getName().size() - 21));
2533 auto MaySimplifyPtr = [&](Value *Ptr) {
2534 if (auto *GV = dyn_cast<GlobalValue>(Ptr))
2535 if (auto *CFIGV = M.getNamedValue((GV->getName() + ".cfi").str()))
2536 Ptr = CFIGV;
2537 return isKnownTypeIdMember(MD, M.getDataLayout(), Ptr, 0);
2538 };
2539 auto MaySimplifyInt = [&](Value *Op) {
2540 auto *PtrAsInt = dyn_cast<ConstantExpr>(Op);
2541 if (!PtrAsInt || PtrAsInt->getOpcode() != Instruction::PtrToInt)
2542 return false;
2543 return MaySimplifyPtr(PtrAsInt->getOperand(0));
2544 };
2545 for (User *U : make_early_inc_range(GV.users())) {
2546 if (auto *CI = dyn_cast<ICmpInst>(U)) {
2547 if (CI->getPredicate() == CmpInst::ICMP_EQ &&
2548 MaySimplifyPtr(CI->getOperand(0))) {
2549 // This is an equality comparison (TypeTestResolution::Single case in
2550 // lowerTypeTestCall). In this case we just replace the comparison
2551 // with true.
2552 CI->replaceAllUsesWith(ConstantInt::getTrue(M.getContext()));
2553 CI->eraseFromParent();
2554 Changed = true;
2555 continue;
2556 }
2557 }
2558 auto *CE = dyn_cast<ConstantExpr>(U);
2559 if (!CE || CE->getOpcode() != Instruction::PtrToInt)
2560 continue;
2561 for (Use &U : make_early_inc_range(CE->uses())) {
2562 auto *CE = dyn_cast<ConstantExpr>(U.getUser());
2563 if (U.getOperandNo() == 0 && CE &&
2564 CE->getOpcode() == Instruction::Sub &&
2565 MaySimplifyInt(CE->getOperand(1))) {
2566 // This is a computation of PtrOffset as generated by
2567 // LowerTypeTestsModule::lowerTypeTestCall above. If
2568 // isKnownTypeIdMember passes we just pretend it evaluated to 0. This
2569 // should cause later passes to remove the range and alignment checks.
2570 // The bitset checks won't be removed but those are uncommon.
2571 CE->replaceAllUsesWith(ConstantInt::get(CE->getType(), 0));
2572 Changed = true;
2573 }
2574 auto *CI = dyn_cast<ICmpInst>(U.getUser());
2575 if (U.getOperandNo() == 1 && CI &&
2576 CI->getPredicate() == CmpInst::ICMP_EQ &&
2577 MaySimplifyInt(CI->getOperand(0))) {
2578 // This is an equality comparison. Unlike in the case above it
2579 // remained as an integer compare.
2580 CI->replaceAllUsesWith(ConstantInt::getTrue(M.getContext()));
2581 CI->eraseFromParent();
2582 Changed = true;
2583 }
2584 }
2585 }
2586 }
2587
2588 if (!Changed)
2589 return PreservedAnalyses::all();
2593 PA.preserve<LoopAnalysis>();
2594 return PA;
2595}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Prepare AGPR Alloc
AMDGPU Register Bank Select
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file defines the BumpPtrAllocator interface.
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Analysis containing CSE Info
Definition CSEInfo.cpp:27
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
This file contains the declarations for the subclasses of Constant, which represent the different fla...
DXIL Finalize Linkage
dxil translate DXIL Translate Metadata
This file defines the DenseMap class.
Generic implementation of equivalence classes through the use Tarjan's efficient union-find algorithm...
Hexagon Common GEP
Module.h This file contains the declarations for the Module class.
This header defines various interfaces for pass management in LLVM.
This defines the Use class.
static const unsigned kARMJumpTableEntrySize
static const unsigned kLOONGARCH64JumpTableEntrySize
static bool isKnownTypeIdMember(Metadata *TypeId, const DataLayout &DL, Value *V, uint64_t COffset)
static const unsigned kX86IBTJumpTableEntrySize
static cl::opt< std::string > ClReadSummary("lowertypetests-read-summary", cl::desc("Read summary from given YAML file before running pass"), cl::Hidden)
static const unsigned kRISCVJumpTableEntrySize
static void dropTypeTests(Module &M, Function &TypeTestFunc, bool ShouldDropAll)
static Value * createMaskedBitTest(IRBuilder<> &B, Value *Bits, Value *BitOffset)
Build a test that bit BitOffset mod sizeof(Bits)*8 is set in Bits.
static bool isThumbFunction(Function *F, Triple::ArchType ModuleArch)
static const unsigned kX86JumpTableEntrySize
static cl::opt< bool > AvoidReuse("lowertypetests-avoid-reuse", cl::desc("Try to avoid reuse of byte array addresses using aliases"), cl::Hidden, cl::init(true))
static cl::opt< PassSummaryAction > ClSummaryAction("lowertypetests-summary-action", cl::desc("What to do with the summary when running this pass"), cl::values(clEnumValN(PassSummaryAction::None, "none", "Do nothing"), clEnumValN(PassSummaryAction::Import, "import", "Import typeid resolutions from summary and globals"), clEnumValN(PassSummaryAction::Export, "export", "Export typeid resolutions to summary and globals")), cl::Hidden)
static const unsigned kARMBTIJumpTableEntrySize
static cl::opt< std::string > ClWriteSummary("lowertypetests-write-summary", cl::desc("Write summary to given YAML file after running pass"), cl::Hidden)
static BitSetInfo buildBitSet(Metadata *TypeId, const DenseMap< GlobalTypeMember *, uint64_t > &GlobalLayout)
Build a bit set for TypeId using the object layouts in GlobalLayout.
static bool isDirectCall(Use &U)
static const unsigned kARMv6MJumpTableEntrySize
static cl::opt< DropTestKind > ClDropTypeTests("lowertypetests-drop-type-tests", cl::desc("Simply drop type test sequences"), cl::values(clEnumValN(DropTestKind::None, "none", "Do not drop any type tests"), clEnumValN(DropTestKind::Assume, "assume", "Drop type test assume sequences"), clEnumValN(DropTestKind::All, "all", "Drop all type test sequences")), cl::Hidden, cl::init(DropTestKind::None))
#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
Machine Check Debug Module
This file contains the declarations for metadata subclasses.
#define T
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
#define P(N)
FunctionAnalysisManager FAM
This file defines the PointerUnion class, which is a discriminated union of pointer types.
static StringRef getName(Value *V)
This file contains some templates that are useful if you are working with the STL at all.
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:167
#define LLVM_DEBUG(...)
Definition Debug.h:119
This pass exposes codegen information to IR-level passes.
This header defines support for implementing classes that have some trailing object (or arrays of obj...
Class for arbitrary precision integers.
Definition APInt.h:78
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1540
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
size_t size() const
size - Get the array size.
Definition ArrayRef.h:147
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:142
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:69
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition Attributes.h:223
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
Definition BasicBlock.h:206
LLVM_ABI BasicBlock * splitBasicBlock(iterator I, const Twine &BBName="", bool Before=false)
Split the basic block into two basic blocks at the specified instruction.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition BasicBlock.h:233
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
Value * getArgOperand(unsigned i) const
unsigned arg_size() const
size_t count(StringRef S) const
@ ICMP_NE
not equal
Definition InstrTypes.h:700
static LLVM_ABI ConstantAggregateZero * get(Type *Ty)
ConstantArray - Constant Array Declarations.
Definition Constants.h:433
static ConstantAsMetadata * get(Constant *C)
Definition Metadata.h:535
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
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static Constant * getInBoundsGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList)
Create an "inbounds" getelementptr.
Definition Constants.h:1301
static LLVM_ABI Constant * getPointerCast(Constant *C, Type *Ty)
Create a BitCast, AddrSpaceCast, or a PtrToInt cast constant expression.
static LLVM_ABI Constant * getPtrToInt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
Definition Constants.h:1274
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static Constant * getAnon(ArrayRef< Constant * > V, bool Packed=false)
Return an anonymous struct that has the specified elements.
Definition Constants.h:486
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:63
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:165
iterator end()
Definition DenseMap.h:81
Analysis pass which computes a DominatorTree.
Definition Dominators.h:284
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
Definition Function.h:166
void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
Definition Function.cpp:448
static LLVM_ABI GlobalAlias * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Aliasee, Module *Parent)
If a parent module is specified, the alias is automatically inserted into the end of the specified mo...
Definition Globals.cpp:585
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set a particular kind of metadata attachment.
LLVM_ABI void setComdat(Comdat *C)
Definition Globals.cpp:214
const Comdat * getComdat() const
LLVM_ABI bool eraseMetadata(unsigned KindID)
Erase all metadata attachments with the given kind.
bool hasSection() const
Check if this global has a custom object file section.
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
Definition Value.h:576
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
Definition Globals.cpp:77
bool isDSOLocal() const
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
VisibilityTypes getVisibility() const
static bool isLocalLinkage(LinkageTypes Linkage)
LinkageTypes getLinkage() const
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
bool isDeclarationForLinker() const
PointerType * getType() const
Global values are always pointers.
VisibilityTypes
An enumeration for the kinds of visibility of global values.
Definition GlobalValue.h:67
@ HiddenVisibility
The GV is hidden.
Definition GlobalValue.h:69
void setVisibility(VisibilityTypes V)
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
@ InternalLinkage
Rename collisions when linking (static functions).
Definition GlobalValue.h:60
@ ExternalLinkage
Externally visible function.
Definition GlobalValue.h:53
@ ExternalWeakLinkage
ExternalWeak linkage description.
Definition GlobalValue.h:62
Type * getValueType() const
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
LLVM_ABI void setInitializer(Constant *InitVal)
setInitializer - Sets the initializer for this global variable, removing any existing initializer if ...
Definition Globals.cpp:511
MaybeAlign getAlign() const
Returns the alignment of the given variable.
void setConstant(bool Val)
LLVM_ABI void setCodeModel(CodeModel::Model CM)
Change the code model for this global.
Definition Globals.cpp:553
LLVM_ABI void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
Definition Globals.cpp:507
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2780
static LLVM_ABI InlineAsm * get(FunctionType *Ty, StringRef AsmString, StringRef Constraints, bool hasSideEffects, bool isAlignStack=false, AsmDialect asmDialect=AD_ATT, bool canThrow=false)
InlineAsm::get - Return the specified uniqued inline asm string.
Definition InlineAsm.cpp:43
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
Analysis pass that exposes the LoopInfo for a function.
Definition LoopInfo.h:570
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
Metadata node.
Definition Metadata.h:1077
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1445
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1565
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1451
Metadata * get() const
Definition Metadata.h:928
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:607
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition MapVector.h:115
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFile(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, bool IsVolatile=false, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
Root of the metadata hierarchy.
Definition Metadata.h:63
TypeIdSummary & getOrInsertTypeIdSummary(StringRef TypeId)
Return an existing or new TypeIdSummary entry for TypeId.
const TypeIdSummary * getTypeIdSummary(StringRef TypeId) const
This returns either a pointer to the type id summary (if present in the summary map) or null (if not ...
CfiFunctionIndex & cfiFunctionDecls()
CfiFunctionIndex & cfiFunctionDefs()
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
iterator_range< op_iterator > operands()
Definition Metadata.h:1849
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
unsigned getAddressSpace() const
Return the address space of the Pointer type.
Analysis pass which computes a PostDominatorTree.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
Definition Analysis.h:115
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalyses & preserve()
Mark an analysis as preserved.
Definition Analysis.h:132
static ReturnInst * Create(LLVMContext &C, Value *retVal=nullptr, InsertPosition InsertBefore=nullptr)
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:168
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
iterator erase(const_iterator CI)
void resize(size_type N)
void push_back(const T &Elt)
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
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
Definition StringRef.h:710
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition StringRef.h:581
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition StringRef.h:269
constexpr size_t size() const
size - Get the string size.
Definition StringRef.h:154
bool ends_with(StringRef Suffix) const
Check if this string ends with the given Suffix.
Definition StringRef.h:281
Type * getElementType(unsigned N) const
Analysis pass providing the TargetTransformInfo.
See the file comment for details on the usage of the TrailingObjects type.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
@ loongarch64
Definition Triple.h:65
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:281
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
op_range operands()
Definition User.h:292
Value * getOperand(unsigned i) const
Definition User.h:232
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
user_iterator user_begin()
Definition Value.h:402
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:546
iterator_range< user_iterator > users()
Definition Value.h:426
use_iterator use_begin()
Definition Value.h:364
LLVM_ABI void replaceUsesWithIf(Value *New, llvm::function_ref< bool(Use &U)> ShouldReplace)
Go through the uses list for this definition and make each use point to "V" if the callback ShouldRep...
Definition Value.cpp:554
bool use_empty() const
Definition Value.h:346
iterator_range< use_iterator > uses()
Definition Value.h:380
bool hasName() const
Definition Value.h:262
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:396
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:194
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:169
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
Definition DenseSet.h:174
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:134
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
Definition ilist_node.h:359
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
CallInst * Call
Changed
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char SymbolName[]
Key for Kernel::Metadata::mSymbolName.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
LLVM_ABI Function * getDeclarationIfExists(const Module *M, ID id)
Look up the Function declaration of the intrinsic id in the Module M and return it if it exists.
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)
DropTestKind
Specifies how to drop type tests.
@ Assume
Do not drop type tests (default).
LLVM_ABI bool isJumpTableCanonical(Function *F)
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
SmallVector< unsigned char, 0 > ByteArray
Definition PropertySet.h:25
NodeAddr< PhiNode * > Phi
Definition RDFGraph.h:390
NodeAddr< UseNode * > Use
Definition RDFGraph.h:385
@ OF_TextWithCRLF
The file should be opened in text mode and use a carriage linefeed '\r '.
Definition FileSystem.h:771
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI void ReplaceInstWithInst(BasicBlock *BB, BasicBlock::iterator &BI, Instruction *I)
Replace the instruction specified by BI with the instruction specified by I.
@ Offset
Definition DWP.cpp:477
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
void stable_sort(R &&Range)
Definition STLExtras.h:2060
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1727
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:649
FunctionAddr VTableAddr uintptr_t uintptr_t Int32Ty
Definition InstrProf.h:296
@ Export
Export information to summary.
Definition IPO.h:57
@ None
Do nothing.
Definition IPO.h:55
@ Import
Import information from summary.
Definition IPO.h:56
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2138
Value * GetPointerBaseWithConstantOffset(Value *Ptr, int64_t &Offset, const DataLayout &DL, bool AllowNonInbounds=true)
Analyze the specified pointer to see if it can be expressed as a base pointer plus a constant offset.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:646
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:157
unsigned M1(unsigned Val)
Definition VE.h:377
LLVM_ABI bool convertUsersOfConstantsToInstructions(ArrayRef< Constant * > Consts, Function *RestrictToFunc=nullptr, bool RemoveDeadConstants=true, bool IncludeSelf=false)
Replace constant expressions users of the given constants with instructions.
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1652
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
BumpPtrAllocatorImpl BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:383
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
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
@ Ref
The access may reference the value stored in memory.
Definition ModRef.h:32
TargetTransformInfo TTI
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
LLVM_ABI void appendToCompilerUsed(Module &M, ArrayRef< GlobalValue * > Values)
Adds global values to the llvm.compiler.used list.
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
Expected< T > errorOrToExpected(ErrorOr< T > &&EO)
Convert an ErrorOr<T> to an Expected<T>.
Definition Error.h:1245
ArrayRef(const T &OneElt) -> ArrayRef< T >
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1837
constexpr unsigned BitWidth
LLVM_ABI void appendToGlobalCtors(Module &M, Function *F, int Priority, Constant *Data=nullptr)
Append F to the list of global ctors of module M with the given Priority.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:565
LLVM_ABI Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
Definition Error.cpp:111
LLVM_ABI Instruction * SplitBlockAndInsertIfThen(Value *Cond, BasicBlock::iterator SplitBefore, bool Unreachable, MDNode *BranchWeights=nullptr, DomTreeUpdater *DTU=nullptr, LoopInfo *LI=nullptr, BasicBlock *ThenBlock=nullptr)
Split the containing block at the specified instruction - everything before SplitBefore stays in the ...
LLVM_ABI void appendToUsed(Module &M, ArrayRef< GlobalValue * > Values)
Adds global values to the llvm.used list.
CfiFunctionLinkage
The type of CFI jumptable needed for a function.
@ CFL_WeakDeclaration
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
Definition MathExtras.h:378
LLVM_ABI GlobalVariable * collectUsedGlobalVariables(const Module &M, SmallVectorImpl< GlobalValue * > &Vec, bool CompilerUsed)
Given "llvm.used" or "llvm.compiler.used" as a global name, collect the initializer elements of that ...
Definition Module.cpp:865
TypeTestResolution TTRes
Kind
Specifies which kind of type check we should emit for this byte array.
@ Unknown
Unknown (analysis not performed, don't lower)
@ Single
Single element (last example in "Short Inline Bit Vectors")
@ Inline
Inlined bit vector ("Short Inline Bit Vectors")
@ Unsat
Unsatisfiable type (i.e. no global has this type metadata)
@ AllOnes
All-ones bit vector ("Eliminating Bit Vector Checks for All-Ones Bit Vectors")
@ ByteArray
Test a byte array (first example)
unsigned SizeM1BitWidth
Range of size-1 expressed as a bit width.
enum llvm::TypeTestResolution::Kind TheKind
SmallVector< uint64_t, 16 > Offsets
LLVM_ABI bool containsGlobalOffset(uint64_t Offset) const
LLVM_ABI void print(raw_ostream &OS) const
This class is used to build a byte array containing overlapping bit sets.
uint64_t BitAllocs[BitsPerByte]
The number of bytes allocated so far for each of the bits.
std::vector< uint8_t > Bytes
The byte array built so far.
LLVM_ABI void allocate(const std::set< uint64_t > &Bits, uint64_t BitSize, uint64_t &AllocByteOffset, uint8_t &AllocMask)
Allocate BitSize bits in the byte array where Bits contains the bits to set.
This class implements a layout algorithm for globals referenced by bit sets that tries to keep member...
std::vector< std::vector< uint64_t > > Fragments
The computed layout.
LLVM_ABI void addFragment(const std::set< uint64_t > &F)
Add F to the layout while trying to keep its indices contiguous.
std::vector< uint64_t > FragmentMap
Mapping from object index to fragment index.