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 list of offsets.
578 // Compute the byte offset of each address associated with this type
579 // identifier.
580 return BitSetBuilder(Offsets).build();
581}
582
583/// Build a test that bit BitOffset mod sizeof(Bits)*8 is set in
584/// Bits. This pattern matches to the bt instruction on x86.
586 Value *BitOffset) {
587 auto BitsType = cast<IntegerType>(Bits->getType());
588 unsigned BitWidth = BitsType->getBitWidth();
589
590 BitOffset = B.CreateZExtOrTrunc(BitOffset, BitsType);
591 Value *BitIndex =
592 B.CreateAnd(BitOffset, ConstantInt::get(BitsType, BitWidth - 1));
593 Value *BitMask = B.CreateShl(ConstantInt::get(BitsType, 1), BitIndex);
594 Value *MaskedBits = B.CreateAnd(Bits, BitMask);
595 return B.CreateICmpNE(MaskedBits, ConstantInt::get(BitsType, 0));
596}
597
598ByteArrayInfo *LowerTypeTestsModule::createByteArray(const BitSetInfo &BSI) {
599 // Create globals to stand in for byte arrays and masks. These never actually
600 // get initialized, we RAUW and erase them later in allocateByteArrays() once
601 // we know the offset and mask to use.
602 auto ByteArrayGlobal = new GlobalVariable(
603 M, Int8Ty, /*isConstant=*/true, GlobalValue::PrivateLinkage, nullptr);
604 auto MaskGlobal = new GlobalVariable(M, Int8Ty, /*isConstant=*/true,
606
607 ByteArrayInfos.emplace_back();
608 ByteArrayInfo *BAI = &ByteArrayInfos.back();
609
610 BAI->Bits = BSI.Bits;
611 BAI->BitSize = BSI.BitSize;
612 BAI->ByteArray = ByteArrayGlobal;
613 BAI->MaskGlobal = MaskGlobal;
614 return BAI;
615}
616
617void LowerTypeTestsModule::allocateByteArrays() {
618 llvm::stable_sort(ByteArrayInfos,
619 [](const ByteArrayInfo &BAI1, const ByteArrayInfo &BAI2) {
620 return BAI1.BitSize > BAI2.BitSize;
621 });
622
623 std::vector<uint64_t> ByteArrayOffsets(ByteArrayInfos.size());
624
626 for (unsigned I = 0; I != ByteArrayInfos.size(); ++I) {
627 ByteArrayInfo *BAI = &ByteArrayInfos[I];
628
629 uint8_t Mask;
630 BAB.allocate(BAI->Bits, BAI->BitSize, ByteArrayOffsets[I], Mask);
631
632 BAI->MaskGlobal->replaceAllUsesWith(
633 ConstantExpr::getIntToPtr(ConstantInt::get(Int8Ty, Mask), PtrTy));
634 BAI->MaskGlobal->eraseFromParent();
635 if (BAI->MaskPtr)
636 *BAI->MaskPtr = Mask;
637 }
638
639 Constant *ByteArrayConst = ConstantDataArray::get(M.getContext(), BAB.Bytes);
640 auto ByteArray =
641 new GlobalVariable(M, ByteArrayConst->getType(), /*isConstant=*/true,
642 GlobalValue::PrivateLinkage, ByteArrayConst);
643
644 for (unsigned I = 0; I != ByteArrayInfos.size(); ++I) {
645 ByteArrayInfo *BAI = &ByteArrayInfos[I];
646
647 Constant *Idxs[] = {ConstantInt::get(IntPtrTy, 0),
648 ConstantInt::get(IntPtrTy, ByteArrayOffsets[I])};
650 ByteArrayConst->getType(), ByteArray, Idxs);
651
652 // Create an alias instead of RAUW'ing the gep directly. On x86 this ensures
653 // that the pc-relative displacement is folded into the lea instead of the
654 // test instruction getting another displacement.
655 GlobalAlias *Alias = GlobalAlias::create(
656 Int8Ty, 0, GlobalValue::PrivateLinkage, "bits", GEP, &M);
657 BAI->ByteArray->replaceAllUsesWith(Alias);
658 BAI->ByteArray->eraseFromParent();
659 }
660
661 ByteArraySizeBits = BAB.BitAllocs[0] + BAB.BitAllocs[1] + BAB.BitAllocs[2] +
662 BAB.BitAllocs[3] + BAB.BitAllocs[4] + BAB.BitAllocs[5] +
663 BAB.BitAllocs[6] + BAB.BitAllocs[7];
664 ByteArraySizeBytes = BAB.Bytes.size();
665}
666
667/// Build a test that bit BitOffset is set in the type identifier that was
668/// lowered to TIL, which must be either an Inline or a ByteArray.
669Value *LowerTypeTestsModule::createBitSetTest(IRBuilder<> &B,
670 const TypeIdLowering &TIL,
671 Value *BitOffset) {
672 if (TIL.TheKind == TypeTestResolution::Inline) {
673 // If the bit set is sufficiently small, we can avoid a load by bit testing
674 // a constant.
675 return createMaskedBitTest(B, TIL.InlineBits, BitOffset);
676 } else {
677 Constant *ByteArray = TIL.TheByteArray;
678 if (AvoidReuse && !ImportSummary) {
679 // Each use of the byte array uses a different alias. This makes the
680 // backend less likely to reuse previously computed byte array addresses,
681 // improving the security of the CFI mechanism based on this pass.
682 // This won't work when importing because TheByteArray is external.
684 "bits_use", ByteArray, &M);
685 }
686
687 Value *ByteAddr = B.CreateGEP(Int8Ty, ByteArray, BitOffset);
688 Value *Byte = B.CreateLoad(Int8Ty, ByteAddr);
689
690 Value *ByteAndMask =
691 B.CreateAnd(Byte, ConstantExpr::getPtrToInt(TIL.BitMask, Int8Ty));
692 return B.CreateICmpNE(ByteAndMask, ConstantInt::get(Int8Ty, 0));
693 }
694}
695
696static bool isKnownTypeIdMember(Metadata *TypeId, const DataLayout &DL,
697 Value *V, uint64_t COffset) {
698 if (auto GV = dyn_cast<GlobalObject>(V)) {
700 GV->getMetadata(LLVMContext::MD_type, Types);
701 for (MDNode *Type : Types) {
702 if (Type->getOperand(1) != TypeId)
703 continue;
706 cast<ConstantAsMetadata>(Type->getOperand(0))->getValue())
707 ->getZExtValue();
708 if (COffset == Offset)
709 return true;
710 }
711 return false;
712 }
713
714 if (auto GEP = dyn_cast<GEPOperator>(V)) {
715 APInt APOffset(DL.getIndexSizeInBits(0), 0);
716 bool Result = GEP->accumulateConstantOffset(DL, APOffset);
717 if (!Result)
718 return false;
719 COffset += APOffset.getZExtValue();
720 return isKnownTypeIdMember(TypeId, DL, GEP->getPointerOperand(), COffset);
721 }
722
723 if (auto Op = dyn_cast<Operator>(V)) {
724 if (Op->getOpcode() == Instruction::BitCast)
725 return isKnownTypeIdMember(TypeId, DL, Op->getOperand(0), COffset);
726
727 if (Op->getOpcode() == Instruction::Select)
728 return isKnownTypeIdMember(TypeId, DL, Op->getOperand(1), COffset) &&
729 isKnownTypeIdMember(TypeId, DL, Op->getOperand(2), COffset);
730 }
731
732 return false;
733}
734
735/// Lower a llvm.type.test call to its implementation. Returns the value to
736/// replace the call with.
737Value *LowerTypeTestsModule::lowerTypeTestCall(Metadata *TypeId, CallInst *CI,
738 const TypeIdLowering &TIL) {
739 // Delay lowering if the resolution is currently unknown.
740 if (TIL.TheKind == TypeTestResolution::Unknown)
741 return nullptr;
742 if (TIL.TheKind == TypeTestResolution::Unsat)
743 return ConstantInt::getFalse(M.getContext());
744
745 Value *Ptr = CI->getArgOperand(0);
746 const DataLayout &DL = M.getDataLayout();
747 if (isKnownTypeIdMember(TypeId, DL, Ptr, 0))
748 return ConstantInt::getTrue(M.getContext());
749
750 BasicBlock *InitialBB = CI->getParent();
751
752 IRBuilder<> B(CI);
753
754 Value *PtrAsInt = B.CreatePtrToInt(Ptr, IntPtrTy);
755
756 Constant *OffsetedGlobalAsInt =
757 ConstantExpr::getPtrToInt(TIL.OffsetedGlobal, IntPtrTy);
758 if (TIL.TheKind == TypeTestResolution::Single)
759 return B.CreateICmpEQ(PtrAsInt, OffsetedGlobalAsInt);
760
761 // Here we compute `last element - address`. The reason why we do this instead
762 // of computing `address - first element` is that it leads to a slightly
763 // shorter instruction sequence on x86. Because it doesn't matter how we do
764 // the subtraction on other architectures, we do so unconditionally.
765 Value *PtrOffset = B.CreateSub(OffsetedGlobalAsInt, PtrAsInt);
766
767 // We need to check that the offset both falls within our range and is
768 // suitably aligned. We can check both properties at the same time by
769 // performing a right rotate by log2(alignment) followed by an integer
770 // comparison against the bitset size. The rotate will move the lower
771 // order bits that need to be zero into the higher order bits of the
772 // result, causing the comparison to fail if they are nonzero. The rotate
773 // also conveniently gives us a bit offset to use during the load from
774 // the bitset.
775 Value *BitOffset = B.CreateIntrinsic(IntPtrTy, Intrinsic::fshr,
776 {PtrOffset, PtrOffset, TIL.AlignLog2});
777
778 Value *OffsetInRange = B.CreateICmpULE(BitOffset, TIL.SizeM1);
779
780 // If the bit set is all ones, testing against it is unnecessary.
781 if (TIL.TheKind == TypeTestResolution::AllOnes)
782 return OffsetInRange;
783
784 // See if the intrinsic is used in the following common pattern:
785 // br(llvm.type.test(...), thenbb, elsebb)
786 // where nothing happens between the type test and the br.
787 // If so, create slightly simpler IR.
788 if (CI->hasOneUse())
789 if (auto *Br = dyn_cast<BranchInst>(*CI->user_begin()))
790 if (CI->getNextNode() == Br) {
791 BasicBlock *Then = InitialBB->splitBasicBlock(CI->getIterator());
792 BasicBlock *Else = Br->getSuccessor(1);
793 BranchInst *NewBr = BranchInst::Create(Then, Else, OffsetInRange);
794 NewBr->setMetadata(LLVMContext::MD_prof,
795 Br->getMetadata(LLVMContext::MD_prof));
796 ReplaceInstWithInst(InitialBB->getTerminator(), NewBr);
797
798 // Update phis in Else resulting from InitialBB being split
799 for (auto &Phi : Else->phis())
800 Phi.addIncoming(Phi.getIncomingValueForBlock(Then), InitialBB);
801
802 IRBuilder<> ThenB(CI);
803 return createBitSetTest(ThenB, TIL, BitOffset);
804 }
805
806 IRBuilder<> ThenB(SplitBlockAndInsertIfThen(OffsetInRange, CI, false));
807
808 // Now that we know that the offset is in range and aligned, load the
809 // appropriate bit from the bitset.
810 Value *Bit = createBitSetTest(ThenB, TIL, BitOffset);
811
812 // The value we want is 0 if we came directly from the initial block
813 // (having failed the range or alignment checks), or the loaded bit if
814 // we came from the block in which we loaded it.
815 B.SetInsertPoint(CI);
816 PHINode *P = B.CreatePHI(Int1Ty, 2);
817 P->addIncoming(ConstantInt::get(Int1Ty, 0), InitialBB);
818 P->addIncoming(Bit, ThenB.GetInsertBlock());
819 return P;
820}
821
822/// Given a disjoint set of type identifiers and globals, lay out the globals,
823/// build the bit sets and lower the llvm.type.test calls.
824void LowerTypeTestsModule::buildBitSetsFromGlobalVariables(
826 // Build a new global with the combined contents of the referenced globals.
827 // This global is a struct whose even-indexed elements contain the original
828 // contents of the referenced globals and whose odd-indexed elements contain
829 // any padding required to align the next element to the next power of 2 plus
830 // any additional padding required to meet its alignment requirements.
831 std::vector<Constant *> GlobalInits;
832 const DataLayout &DL = M.getDataLayout();
833 DenseMap<GlobalTypeMember *, uint64_t> GlobalLayout;
834 Align MaxAlign;
835 uint64_t CurOffset = 0;
836 uint64_t DesiredPadding = 0;
837 for (GlobalTypeMember *G : Globals) {
838 auto *GV = cast<GlobalVariable>(G->getGlobal());
839 Align Alignment =
840 DL.getValueOrABITypeAlignment(GV->getAlign(), GV->getValueType());
841 MaxAlign = std::max(MaxAlign, Alignment);
842 uint64_t GVOffset = alignTo(CurOffset + DesiredPadding, Alignment);
843 GlobalLayout[G] = GVOffset;
844 if (GVOffset != 0) {
845 uint64_t Padding = GVOffset - CurOffset;
846 GlobalInits.push_back(
848 }
849
850 GlobalInits.push_back(GV->getInitializer());
851 uint64_t InitSize = DL.getTypeAllocSize(GV->getValueType());
852 CurOffset = GVOffset + InitSize;
853
854 // Compute the amount of padding that we'd like for the next element.
855 DesiredPadding = NextPowerOf2(InitSize - 1) - InitSize;
856
857 // Experiments of different caps with Chromium on both x64 and ARM64
858 // have shown that the 32-byte cap generates the smallest binary on
859 // both platforms while different caps yield similar performance.
860 // (see https://lists.llvm.org/pipermail/llvm-dev/2018-July/124694.html)
861 if (DesiredPadding > 32)
862 DesiredPadding = alignTo(InitSize, 32) - InitSize;
863 }
864
865 Constant *NewInit = ConstantStruct::getAnon(M.getContext(), GlobalInits);
866 auto *CombinedGlobal =
867 new GlobalVariable(M, NewInit->getType(), /*isConstant=*/true,
869 CombinedGlobal->setAlignment(MaxAlign);
870
871 StructType *NewTy = cast<StructType>(NewInit->getType());
872 lowerTypeTestCalls(TypeIds, CombinedGlobal, GlobalLayout);
873
874 // Build aliases pointing to offsets into the combined global for each
875 // global from which we built the combined global, and replace references
876 // to the original globals with references to the aliases.
877 for (unsigned I = 0; I != Globals.size(); ++I) {
878 GlobalVariable *GV = cast<GlobalVariable>(Globals[I]->getGlobal());
879
880 // Multiply by 2 to account for padding elements.
881 Constant *CombinedGlobalIdxs[] = {ConstantInt::get(Int32Ty, 0),
882 ConstantInt::get(Int32Ty, I * 2)};
883 Constant *CombinedGlobalElemPtr = ConstantExpr::getInBoundsGetElementPtr(
884 NewInit->getType(), CombinedGlobal, CombinedGlobalIdxs);
885 assert(GV->getType()->getAddressSpace() == 0);
886 GlobalAlias *GAlias =
887 GlobalAlias::create(NewTy->getElementType(I * 2), 0, GV->getLinkage(),
888 "", CombinedGlobalElemPtr, &M);
889 GAlias->setVisibility(GV->getVisibility());
890 GAlias->takeName(GV);
891 GV->replaceAllUsesWith(GAlias);
892 GV->eraseFromParent();
893 }
894}
895
896bool LowerTypeTestsModule::shouldExportConstantsAsAbsoluteSymbols() {
897 return (Arch == Triple::x86 || Arch == Triple::x86_64) &&
898 ObjectFormat == Triple::ELF;
899}
900
901/// Export the given type identifier so that ThinLTO backends may import it.
902/// Type identifiers are exported by adding coarse-grained information about how
903/// to test the type identifier to the summary, and creating symbols in the
904/// object file (aliases and absolute symbols) containing fine-grained
905/// information about the type identifier.
906///
907/// Returns a pointer to the location in which to store the bitmask, if
908/// applicable.
909uint8_t *LowerTypeTestsModule::exportTypeId(StringRef TypeId,
910 const TypeIdLowering &TIL) {
911 TypeTestResolution &TTRes =
912 ExportSummary->getOrInsertTypeIdSummary(TypeId).TTRes;
913 TTRes.TheKind = TIL.TheKind;
914
915 auto ExportGlobal = [&](StringRef Name, Constant *C) {
916 GlobalAlias *GA =
918 "__typeid_" + TypeId + "_" + Name, C, &M);
920 };
921
922 auto ExportConstant = [&](StringRef Name, uint64_t &Storage, Constant *C) {
923 if (shouldExportConstantsAsAbsoluteSymbols())
924 ExportGlobal(Name, ConstantExpr::getIntToPtr(C, PtrTy));
925 else
926 Storage = cast<ConstantInt>(C)->getZExtValue();
927 };
928
929 if (TIL.TheKind != TypeTestResolution::Unsat)
930 ExportGlobal("global_addr", TIL.OffsetedGlobal);
931
932 if (TIL.TheKind == TypeTestResolution::ByteArray ||
933 TIL.TheKind == TypeTestResolution::Inline ||
934 TIL.TheKind == TypeTestResolution::AllOnes) {
935 ExportConstant("align", TTRes.AlignLog2, TIL.AlignLog2);
936 ExportConstant("size_m1", TTRes.SizeM1, TIL.SizeM1);
937
938 uint64_t BitSize = cast<ConstantInt>(TIL.SizeM1)->getZExtValue() + 1;
939 if (TIL.TheKind == TypeTestResolution::Inline)
940 TTRes.SizeM1BitWidth = (BitSize <= 32) ? 5 : 6;
941 else
942 TTRes.SizeM1BitWidth = (BitSize <= 128) ? 7 : 32;
943 }
944
945 if (TIL.TheKind == TypeTestResolution::ByteArray) {
946 ExportGlobal("byte_array", TIL.TheByteArray);
947 if (shouldExportConstantsAsAbsoluteSymbols())
948 ExportGlobal("bit_mask", TIL.BitMask);
949 else
950 return &TTRes.BitMask;
951 }
952
953 if (TIL.TheKind == TypeTestResolution::Inline)
954 ExportConstant("inline_bits", TTRes.InlineBits, TIL.InlineBits);
955
956 return nullptr;
957}
958
959LowerTypeTestsModule::TypeIdLowering
960LowerTypeTestsModule::importTypeId(StringRef TypeId) {
961 const TypeIdSummary *TidSummary = ImportSummary->getTypeIdSummary(TypeId);
962 if (!TidSummary)
963 return {}; // Unsat: no globals match this type id.
964 const TypeTestResolution &TTRes = TidSummary->TTRes;
965
966 TypeIdLowering TIL;
967 TIL.TheKind = TTRes.TheKind;
968
969 auto ImportGlobal = [&](StringRef Name) {
970 // Give the global a type of length 0 so that it is not assumed not to alias
971 // with any other global.
972 GlobalVariable *GV = M.getOrInsertGlobal(
973 ("__typeid_" + TypeId + "_" + Name).str(), Int8Arr0Ty);
975 return GV;
976 };
977
978 auto ImportConstant = [&](StringRef Name, uint64_t Const, unsigned AbsWidth,
979 Type *Ty) {
980 if (!shouldExportConstantsAsAbsoluteSymbols()) {
981 Constant *C =
982 ConstantInt::get(isa<IntegerType>(Ty) ? Ty : Int64Ty, Const);
983 if (!isa<IntegerType>(Ty))
985 return C;
986 }
987
988 Constant *C = ImportGlobal(Name);
989 auto *GV = cast<GlobalVariable>(C->stripPointerCasts());
990 if (isa<IntegerType>(Ty))
992 if (GV->getMetadata(LLVMContext::MD_absolute_symbol))
993 return C;
994
995 auto SetAbsRange = [&](uint64_t Min, uint64_t Max) {
996 auto *MinC = ConstantAsMetadata::get(ConstantInt::get(IntPtrTy, Min));
997 auto *MaxC = ConstantAsMetadata::get(ConstantInt::get(IntPtrTy, Max));
998 GV->setMetadata(LLVMContext::MD_absolute_symbol,
999 MDNode::get(M.getContext(), {MinC, MaxC}));
1000 };
1001 if (AbsWidth == IntPtrTy->getBitWidth())
1002 SetAbsRange(~0ull, ~0ull); // Full set.
1003 else
1004 SetAbsRange(0, 1ull << AbsWidth);
1005 return C;
1006 };
1007
1008 if (TIL.TheKind != TypeTestResolution::Unsat) {
1009 auto *GV = ImportGlobal("global_addr");
1010 // This is either a vtable (in .data.rel.ro) or a jump table (in .text).
1011 // Either way it's expected to be in the low 2 GiB, so set the small code
1012 // model.
1013 //
1014 // For .data.rel.ro, we currently place all such sections in the low 2 GiB
1015 // [1], and for .text the sections are expected to be in the low 2 GiB under
1016 // the small and medium code models [2] and this pass only supports those
1017 // code models (e.g. jump tables use jmp instead of movabs/jmp).
1018 //
1019 // [1]https://github.com/llvm/llvm-project/pull/137742
1020 // [2]https://maskray.me/blog/2023-05-14-relocation-overflow-and-code-models
1022 TIL.OffsetedGlobal = GV;
1023 }
1024
1025 if (TIL.TheKind == TypeTestResolution::ByteArray ||
1026 TIL.TheKind == TypeTestResolution::Inline ||
1027 TIL.TheKind == TypeTestResolution::AllOnes) {
1028 TIL.AlignLog2 = ImportConstant("align", TTRes.AlignLog2, 8, IntPtrTy);
1029 TIL.SizeM1 =
1030 ImportConstant("size_m1", TTRes.SizeM1, TTRes.SizeM1BitWidth, IntPtrTy);
1031 }
1032
1033 if (TIL.TheKind == TypeTestResolution::ByteArray) {
1034 TIL.TheByteArray = ImportGlobal("byte_array");
1035 TIL.BitMask = ImportConstant("bit_mask", TTRes.BitMask, 8, PtrTy);
1036 }
1037
1038 if (TIL.TheKind == TypeTestResolution::Inline)
1039 TIL.InlineBits = ImportConstant(
1040 "inline_bits", TTRes.InlineBits, 1 << TTRes.SizeM1BitWidth,
1041 TTRes.SizeM1BitWidth <= 5 ? Int32Ty : Int64Ty);
1042
1043 return TIL;
1044}
1045
1046void LowerTypeTestsModule::importTypeTest(CallInst *CI) {
1047 auto TypeIdMDVal = dyn_cast<MetadataAsValue>(CI->getArgOperand(1));
1048 if (!TypeIdMDVal)
1049 report_fatal_error("Second argument of llvm.type.test must be metadata");
1050
1051 auto TypeIdStr = dyn_cast<MDString>(TypeIdMDVal->getMetadata());
1052 // If this is a local unpromoted type, which doesn't have a metadata string,
1053 // treat as Unknown and delay lowering, so that we can still utilize it for
1054 // later optimizations.
1055 if (!TypeIdStr)
1056 return;
1057
1058 TypeIdLowering TIL = importTypeId(TypeIdStr->getString());
1059 Value *Lowered = lowerTypeTestCall(TypeIdStr, CI, TIL);
1060 if (Lowered) {
1061 CI->replaceAllUsesWith(Lowered);
1062 CI->eraseFromParent();
1063 }
1064}
1065
1066void LowerTypeTestsModule::maybeReplaceComdat(Function *F,
1067 StringRef OriginalName) {
1068 // For COFF we should also rename the comdat if this function also
1069 // happens to be the key function. Even if the comdat name changes, this
1070 // should still be fine since comdat and symbol resolution happens
1071 // before LTO, so all symbols which would prevail have been selected.
1072 if (F->hasComdat() && ObjectFormat == Triple::COFF &&
1073 F->getComdat()->getName() == OriginalName) {
1074 Comdat *OldComdat = F->getComdat();
1075 Comdat *NewComdat = M.getOrInsertComdat(F->getName());
1076 for (GlobalObject &GO : M.global_objects()) {
1077 if (GO.getComdat() == OldComdat)
1078 GO.setComdat(NewComdat);
1079 }
1080 }
1081}
1082
1083// ThinLTO backend: the function F has a jump table entry; update this module
1084// accordingly. isJumpTableCanonical describes the type of the jump table entry.
1085void LowerTypeTestsModule::importFunction(Function *F,
1086 bool isJumpTableCanonical) {
1087 assert(F->getType()->getAddressSpace() == 0);
1088
1089 GlobalValue::VisibilityTypes Visibility = F->getVisibility();
1090 std::string Name = std::string(F->getName());
1091
1092 if (F->isDeclarationForLinker() && isJumpTableCanonical) {
1093 // Non-dso_local functions may be overriden at run time,
1094 // don't short curcuit them
1095 if (F->isDSOLocal()) {
1096 Function *RealF = Function::Create(F->getFunctionType(),
1098 F->getAddressSpace(),
1099 Name + ".cfi", &M);
1101 replaceDirectCalls(F, RealF);
1102 }
1103 return;
1104 }
1105
1106 Function *FDecl;
1107 if (!isJumpTableCanonical) {
1108 // Either a declaration of an external function or a reference to a locally
1109 // defined jump table.
1110 FDecl = Function::Create(F->getFunctionType(), GlobalValue::ExternalLinkage,
1111 F->getAddressSpace(), Name + ".cfi_jt", &M);
1113 } else {
1114 F->setName(Name + ".cfi");
1115 maybeReplaceComdat(F, Name);
1116 FDecl = Function::Create(F->getFunctionType(), GlobalValue::ExternalLinkage,
1117 F->getAddressSpace(), Name, &M);
1118 FDecl->setVisibility(Visibility);
1119 Visibility = GlobalValue::HiddenVisibility;
1120
1121 // Update aliases pointing to this function to also include the ".cfi" suffix,
1122 // We expect the jump table entry to either point to the real function or an
1123 // alias. Redirect all other users to the jump table entry.
1124 for (auto &U : F->uses()) {
1125 if (auto *A = dyn_cast<GlobalAlias>(U.getUser())) {
1126 std::string AliasName = A->getName().str() + ".cfi";
1127 Function *AliasDecl = Function::Create(
1128 F->getFunctionType(), GlobalValue::ExternalLinkage,
1129 F->getAddressSpace(), "", &M);
1130 AliasDecl->takeName(A);
1131 A->replaceAllUsesWith(AliasDecl);
1132 A->setName(AliasName);
1133 }
1134 }
1135 }
1136
1137 if (F->hasExternalWeakLinkage())
1138 replaceWeakDeclarationWithJumpTablePtr(F, FDecl, isJumpTableCanonical);
1139 else
1140 replaceCfiUses(F, FDecl, isJumpTableCanonical);
1141
1142 // Set visibility late because it's used in replaceCfiUses() to determine
1143 // whether uses need to be replaced.
1144 F->setVisibility(Visibility);
1145}
1146
1147static auto
1149 const DenseMap<GlobalTypeMember *, uint64_t> &GlobalLayout) {
1151 // Pre-populate the map with interesting type identifiers.
1152 for (Metadata *TypeId : TypeIds)
1153 OffsetsByTypeID[TypeId];
1154 for (const auto &[Mem, MemOff] : GlobalLayout) {
1155 for (MDNode *Type : Mem->types()) {
1156 auto It = OffsetsByTypeID.find(Type->getOperand(1));
1157 if (It == OffsetsByTypeID.end())
1158 continue;
1161 cast<ConstantAsMetadata>(Type->getOperand(0))->getValue())
1162 ->getZExtValue();
1163 It->second.push_back(MemOff + Offset);
1164 }
1165 }
1166
1168 BitSets.reserve(TypeIds.size());
1169 for (Metadata *TypeId : TypeIds) {
1170 BitSets.emplace_back(TypeId, buildBitSet(OffsetsByTypeID[TypeId]));
1171 LLVM_DEBUG({
1172 if (auto MDS = dyn_cast<MDString>(TypeId))
1173 dbgs() << MDS->getString() << ": ";
1174 else
1175 dbgs() << "<unnamed>: ";
1176 BitSets.back().second.print(dbgs());
1177 });
1178 }
1179
1180 return BitSets;
1181}
1182
1183void LowerTypeTestsModule::lowerTypeTestCalls(
1184 ArrayRef<Metadata *> TypeIds, Constant *CombinedGlobalAddr,
1185 const DenseMap<GlobalTypeMember *, uint64_t> &GlobalLayout) {
1186 // For each type identifier in this disjoint set...
1187 for (const auto &[TypeId, BSI] : buildBitSets(TypeIds, GlobalLayout)) {
1188 ByteArrayInfo *BAI = nullptr;
1189 TypeIdLowering TIL;
1190
1191 uint64_t GlobalOffset =
1192 BSI.ByteOffset + ((BSI.BitSize - 1) << BSI.AlignLog2);
1193 TIL.OffsetedGlobal = ConstantExpr::getGetElementPtr(
1194 Int8Ty, CombinedGlobalAddr, ConstantInt::get(IntPtrTy, GlobalOffset)),
1195 TIL.AlignLog2 = ConstantInt::get(IntPtrTy, BSI.AlignLog2);
1196 TIL.SizeM1 = ConstantInt::get(IntPtrTy, BSI.BitSize - 1);
1197 if (BSI.isAllOnes()) {
1198 TIL.TheKind = (BSI.BitSize == 1) ? TypeTestResolution::Single
1199 : TypeTestResolution::AllOnes;
1200 } else if (BSI.BitSize <= IntPtrTy->getBitWidth()) {
1201 TIL.TheKind = TypeTestResolution::Inline;
1202 uint64_t InlineBits = 0;
1203 for (auto Bit : BSI.Bits)
1204 InlineBits |= uint64_t(1) << Bit;
1205 if (InlineBits == 0)
1206 TIL.TheKind = TypeTestResolution::Unsat;
1207 else
1208 TIL.InlineBits = ConstantInt::get(
1209 (BSI.BitSize <= 32) ? Int32Ty : Int64Ty, InlineBits);
1210 } else {
1211 TIL.TheKind = TypeTestResolution::ByteArray;
1212 ++NumByteArraysCreated;
1213 BAI = createByteArray(BSI);
1214 TIL.TheByteArray = BAI->ByteArray;
1215 TIL.BitMask = BAI->MaskGlobal;
1216 }
1217
1218 TypeIdUserInfo &TIUI = TypeIdUsers[TypeId];
1219
1220 if (TIUI.IsExported) {
1221 uint8_t *MaskPtr = exportTypeId(cast<MDString>(TypeId)->getString(), TIL);
1222 if (BAI)
1223 BAI->MaskPtr = MaskPtr;
1224 }
1225
1226 // Lower each call to llvm.type.test for this type identifier.
1227 for (CallInst *CI : TIUI.CallSites) {
1228 ++NumTypeTestCallsLowered;
1229 Value *Lowered = lowerTypeTestCall(TypeId, CI, TIL);
1230 if (Lowered) {
1231 CI->replaceAllUsesWith(Lowered);
1232 CI->eraseFromParent();
1233 }
1234 }
1235 }
1236}
1237
1238void LowerTypeTestsModule::verifyTypeMDNode(GlobalObject *GO, MDNode *Type) {
1239 if (Type->getNumOperands() != 2)
1240 report_fatal_error("All operands of type metadata must have 2 elements");
1241
1242 if (GO->isThreadLocal())
1243 report_fatal_error("Bit set element may not be thread-local");
1244 if (isa<GlobalVariable>(GO) && GO->hasSection())
1246 "A member of a type identifier may not have an explicit section");
1247
1248 // FIXME: We previously checked that global var member of a type identifier
1249 // must be a definition, but the IR linker may leave type metadata on
1250 // declarations. We should restore this check after fixing PR31759.
1251
1252 auto OffsetConstMD = dyn_cast<ConstantAsMetadata>(Type->getOperand(0));
1253 if (!OffsetConstMD)
1254 report_fatal_error("Type offset must be a constant");
1255 auto OffsetInt = dyn_cast<ConstantInt>(OffsetConstMD->getValue());
1256 if (!OffsetInt)
1257 report_fatal_error("Type offset must be an integer constant");
1258}
1259
1260static const unsigned kX86JumpTableEntrySize = 8;
1261static const unsigned kX86IBTJumpTableEntrySize = 16;
1262static const unsigned kARMJumpTableEntrySize = 4;
1263static const unsigned kARMBTIJumpTableEntrySize = 8;
1264static const unsigned kARMv6MJumpTableEntrySize = 16;
1265static const unsigned kRISCVJumpTableEntrySize = 8;
1266static const unsigned kLOONGARCH64JumpTableEntrySize = 8;
1267
1268bool LowerTypeTestsModule::hasBranchTargetEnforcement() {
1269 if (HasBranchTargetEnforcement == -1) {
1270 // First time this query has been called. Find out the answer by checking
1271 // the module flags.
1272 if (const auto *BTE = mdconst::extract_or_null<ConstantInt>(
1273 M.getModuleFlag("branch-target-enforcement")))
1274 HasBranchTargetEnforcement = (BTE->getZExtValue() != 0);
1275 else
1276 HasBranchTargetEnforcement = 0;
1277 }
1278 return HasBranchTargetEnforcement;
1279}
1280
1281unsigned
1282LowerTypeTestsModule::getJumpTableEntrySize(Triple::ArchType JumpTableArch) {
1283 switch (JumpTableArch) {
1284 case Triple::x86:
1285 case Triple::x86_64:
1286 if (const auto *MD = mdconst::extract_or_null<ConstantInt>(
1287 M.getModuleFlag("cf-protection-branch")))
1288 if (MD->getZExtValue())
1291 case Triple::arm:
1293 case Triple::thumb:
1294 if (CanUseThumbBWJumpTable) {
1295 if (hasBranchTargetEnforcement())
1298 } else {
1300 }
1301 case Triple::aarch64:
1302 if (hasBranchTargetEnforcement())
1305 case Triple::riscv32:
1306 case Triple::riscv64:
1310 default:
1311 report_fatal_error("Unsupported architecture for jump tables");
1312 }
1313}
1314
1315// Create an inline asm constant representing a jump table entry for the target.
1316// This consists of an instruction sequence containing a relative branch to
1317// Dest.
1318InlineAsm *
1319LowerTypeTestsModule::createJumpTableEntryAsm(Triple::ArchType JumpTableArch) {
1320 std::string Asm;
1321 raw_string_ostream AsmOS(Asm);
1322
1323 if (JumpTableArch == Triple::x86 || JumpTableArch == Triple::x86_64) {
1324 bool Endbr = false;
1325 if (const auto *MD = mdconst::extract_or_null<ConstantInt>(
1326 M.getModuleFlag("cf-protection-branch")))
1327 Endbr = !MD->isZero();
1328 if (Endbr)
1329 AsmOS << (JumpTableArch == Triple::x86 ? "endbr32\n" : "endbr64\n");
1330 AsmOS << "jmp ${0:c}@plt\n";
1331 if (Endbr)
1332 AsmOS << ".balign 16, 0xcc\n";
1333 else
1334 AsmOS << "int3\nint3\nint3\n";
1335 } else if (JumpTableArch == Triple::arm) {
1336 AsmOS << "b $0\n";
1337 } else if (JumpTableArch == Triple::aarch64) {
1338 if (hasBranchTargetEnforcement())
1339 AsmOS << "bti c\n";
1340 AsmOS << "b $0\n";
1341 } else if (JumpTableArch == Triple::thumb) {
1342 if (!CanUseThumbBWJumpTable) {
1343 // In Armv6-M, this sequence will generate a branch without corrupting
1344 // any registers. We use two stack words; in the second, we construct the
1345 // address we'll pop into pc, and the first is used to save and restore
1346 // r0 which we use as a temporary register.
1347 //
1348 // To support position-independent use cases, the offset of the target
1349 // function is stored as a relative offset (which will expand into an
1350 // R_ARM_REL32 relocation in ELF, and presumably the equivalent in other
1351 // object file types), and added to pc after we load it. (The alternative
1352 // B.W is automatically pc-relative.)
1353 //
1354 // There are five 16-bit Thumb instructions here, so the .balign 4 adds a
1355 // sixth halfword of padding, and then the offset consumes a further 4
1356 // bytes, for a total of 16, which is very convenient since entries in
1357 // this jump table need to have power-of-two size.
1358 AsmOS << "push {r0,r1}\n"
1359 << "ldr r0, 1f\n"
1360 << "0: add r0, r0, pc\n"
1361 << "str r0, [sp, #4]\n"
1362 << "pop {r0,pc}\n"
1363 << ".balign 4\n"
1364 << "1: .word $0 - (0b + 4)\n";
1365 } else {
1366 if (hasBranchTargetEnforcement())
1367 AsmOS << "bti\n";
1368 AsmOS << "b.w $0\n";
1369 }
1370 } else if (JumpTableArch == Triple::riscv32 ||
1371 JumpTableArch == Triple::riscv64) {
1372 AsmOS << "tail $0@plt\n";
1373 } else if (JumpTableArch == Triple::loongarch64) {
1374 AsmOS << "pcalau12i $$t0, %pc_hi20($0)\n"
1375 << "jirl $$r0, $$t0, %pc_lo12($0)\n";
1376 } else {
1377 report_fatal_error("Unsupported architecture for jump tables");
1378 }
1379
1380 return InlineAsm::get(
1381 FunctionType::get(Type::getVoidTy(M.getContext()), PtrTy, false),
1382 AsmOS.str(), "s",
1383 /*hasSideEffects=*/true);
1384}
1385
1386/// Given a disjoint set of type identifiers and functions, build the bit sets
1387/// and lower the llvm.type.test calls, architecture dependently.
1388void LowerTypeTestsModule::buildBitSetsFromFunctions(
1390 if (Arch == Triple::x86 || Arch == Triple::x86_64 || Arch == Triple::arm ||
1391 Arch == Triple::thumb || Arch == Triple::aarch64 ||
1392 Arch == Triple::riscv32 || Arch == Triple::riscv64 ||
1393 Arch == Triple::loongarch64)
1394 buildBitSetsFromFunctionsNative(TypeIds, Functions);
1395 else if (Arch == Triple::wasm32 || Arch == Triple::wasm64)
1396 buildBitSetsFromFunctionsWASM(TypeIds, Functions);
1397 else
1398 report_fatal_error("Unsupported architecture for jump tables");
1399}
1400
1401void LowerTypeTestsModule::moveInitializerToModuleConstructor(
1402 GlobalVariable *GV) {
1403 if (WeakInitializerFn == nullptr) {
1404 WeakInitializerFn = Function::Create(
1405 FunctionType::get(Type::getVoidTy(M.getContext()),
1406 /* IsVarArg */ false),
1408 M.getDataLayout().getProgramAddressSpace(),
1409 "__cfi_global_var_init", &M);
1410 BasicBlock *BB =
1411 BasicBlock::Create(M.getContext(), "entry", WeakInitializerFn);
1412 ReturnInst::Create(M.getContext(), BB);
1413 WeakInitializerFn->setSection(
1414 ObjectFormat == Triple::MachO
1415 ? "__TEXT,__StaticInit,regular,pure_instructions"
1416 : ".text.startup");
1417 // This code is equivalent to relocation application, and should run at the
1418 // earliest possible time (i.e. with the highest priority).
1419 appendToGlobalCtors(M, WeakInitializerFn, /* Priority */ 0);
1420 }
1421
1422 IRBuilder<> IRB(WeakInitializerFn->getEntryBlock().getTerminator());
1423 GV->setConstant(false);
1424 IRB.CreateAlignedStore(GV->getInitializer(), GV, GV->getAlign());
1426}
1427
1428void LowerTypeTestsModule::findGlobalVariableUsersOf(
1429 Constant *C, SmallSetVector<GlobalVariable *, 8> &Out) {
1430 for (auto *U : C->users()){
1431 if (auto *GV = dyn_cast<GlobalVariable>(U))
1432 Out.insert(GV);
1433 else if (auto *C2 = dyn_cast<Constant>(U))
1434 findGlobalVariableUsersOf(C2, Out);
1435 }
1436}
1437
1438// Replace all uses of F with (F ? JT : 0).
1439void LowerTypeTestsModule::replaceWeakDeclarationWithJumpTablePtr(
1440 Function *F, Constant *JT, bool IsJumpTableCanonical) {
1441 // The target expression can not appear in a constant initializer on most
1442 // (all?) targets. Switch to a runtime initializer.
1443 SmallSetVector<GlobalVariable *, 8> GlobalVarUsers;
1444 findGlobalVariableUsersOf(F, GlobalVarUsers);
1445 for (auto *GV : GlobalVarUsers) {
1446 if (GV == GlobalAnnotation)
1447 continue;
1448 moveInitializerToModuleConstructor(GV);
1449 }
1450
1451 // Can not RAUW F with an expression that uses F. Replace with a temporary
1452 // placeholder first.
1453 Function *PlaceholderFn =
1454 Function::Create(cast<FunctionType>(F->getValueType()),
1456 F->getAddressSpace(), "", &M);
1457 replaceCfiUses(F, PlaceholderFn, IsJumpTableCanonical);
1458
1460 // Don't use range based loop, because use list will be modified.
1461 while (!PlaceholderFn->use_empty()) {
1462 Use &U = *PlaceholderFn->use_begin();
1463 auto *InsertPt = dyn_cast<Instruction>(U.getUser());
1464 assert(InsertPt && "Non-instruction users should have been eliminated");
1465 auto *PN = dyn_cast<PHINode>(InsertPt);
1466 if (PN)
1467 InsertPt = PN->getIncomingBlock(U)->getTerminator();
1468 IRBuilder Builder(InsertPt);
1469 Value *ICmp = Builder.CreateICmp(CmpInst::ICMP_NE, F,
1470 Constant::getNullValue(F->getType()));
1471 Value *Select = Builder.CreateSelect(ICmp, JT,
1472 Constant::getNullValue(F->getType()));
1473 // For phi nodes, we need to update the incoming value for all operands
1474 // with the same predecessor.
1475 if (PN)
1476 PN->setIncomingValueForBlock(InsertPt->getParent(), Select);
1477 else
1478 U.set(Select);
1479 }
1480 PlaceholderFn->eraseFromParent();
1481}
1482
1483static bool isThumbFunction(Function *F, Triple::ArchType ModuleArch) {
1484 Attribute TFAttr = F->getFnAttribute("target-features");
1485 if (TFAttr.isValid()) {
1487 TFAttr.getValueAsString().split(Features, ',');
1488 for (StringRef Feature : Features) {
1489 if (Feature == "-thumb-mode")
1490 return false;
1491 else if (Feature == "+thumb-mode")
1492 return true;
1493 }
1494 }
1495
1496 return ModuleArch == Triple::thumb;
1497}
1498
1499// Each jump table must be either ARM or Thumb as a whole for the bit-test math
1500// to work. Pick one that matches the majority of members to minimize interop
1501// veneers inserted by the linker.
1502Triple::ArchType LowerTypeTestsModule::selectJumpTableArmEncoding(
1503 ArrayRef<GlobalTypeMember *> Functions) {
1504 if (Arch != Triple::arm && Arch != Triple::thumb)
1505 return Arch;
1506
1507 if (!CanUseThumbBWJumpTable && CanUseArmJumpTable) {
1508 // In architectures that provide Arm and Thumb-1 but not Thumb-2,
1509 // we should always prefer the Arm jump table format, because the
1510 // Thumb-1 one is larger and slower.
1511 return Triple::arm;
1512 }
1513
1514 // Otherwise, go with majority vote.
1515 unsigned ArmCount = 0, ThumbCount = 0;
1516 for (const auto GTM : Functions) {
1517 if (!GTM->isJumpTableCanonical()) {
1518 // PLT stubs are always ARM.
1519 // FIXME: This is the wrong heuristic for non-canonical jump tables.
1520 ++ArmCount;
1521 continue;
1522 }
1523
1524 Function *F = cast<Function>(GTM->getGlobal());
1525 ++(isThumbFunction(F, Arch) ? ThumbCount : ArmCount);
1526 }
1527
1528 return ArmCount > ThumbCount ? Triple::arm : Triple::thumb;
1529}
1530
1531void LowerTypeTestsModule::createJumpTable(
1532 Function *F, ArrayRef<GlobalTypeMember *> Functions,
1533 Triple::ArchType JumpTableArch) {
1534 BasicBlock *BB = BasicBlock::Create(M.getContext(), "entry", F);
1535 IRBuilder<> IRB(BB);
1536
1537 InlineAsm *JumpTableAsm = createJumpTableEntryAsm(JumpTableArch);
1538
1539 // Check if all entries have the NoUnwind attribute.
1540 // If all entries have it, we can safely mark the
1541 // cfi.jumptable as NoUnwind, otherwise, direct calls
1542 // to the jump table will not handle exceptions properly
1543 bool areAllEntriesNounwind = true;
1544 for (GlobalTypeMember *GTM : Functions) {
1545 if (!llvm::cast<llvm::Function>(GTM->getGlobal())
1546 ->hasFnAttribute(llvm::Attribute::NoUnwind)) {
1547 areAllEntriesNounwind = false;
1548 }
1549 IRB.CreateCall(JumpTableAsm, GTM->getGlobal());
1550 }
1551 IRB.CreateUnreachable();
1552
1553 // Align the whole table by entry size.
1554 F->setAlignment(Align(getJumpTableEntrySize(JumpTableArch)));
1555 // Skip prologue.
1556 // Disabled on win32 due to https://llvm.org/bugs/show_bug.cgi?id=28641#c3.
1557 // Luckily, this function does not get any prologue even without the
1558 // attribute.
1559 if (OS != Triple::Win32)
1560 F->addFnAttr(Attribute::Naked);
1561 if (JumpTableArch == Triple::arm)
1562 F->addFnAttr("target-features", "-thumb-mode");
1563 if (JumpTableArch == Triple::thumb) {
1564 if (hasBranchTargetEnforcement()) {
1565 // If we're generating a Thumb jump table with BTI, add a target-features
1566 // setting to ensure BTI can be assembled.
1567 F->addFnAttr("target-features", "+thumb-mode,+pacbti");
1568 } else {
1569 F->addFnAttr("target-features", "+thumb-mode");
1570 if (CanUseThumbBWJumpTable) {
1571 // Thumb jump table assembly needs Thumb2. The following attribute is
1572 // added by Clang for -march=armv7.
1573 F->addFnAttr("target-cpu", "cortex-a8");
1574 }
1575 }
1576 }
1577 // When -mbranch-protection= is used, the inline asm adds a BTI. Suppress BTI
1578 // for the function to avoid double BTI. This is a no-op without
1579 // -mbranch-protection=.
1580 if (JumpTableArch == Triple::aarch64 || JumpTableArch == Triple::thumb) {
1581 if (F->hasFnAttribute("branch-target-enforcement"))
1582 F->removeFnAttr("branch-target-enforcement");
1583 if (F->hasFnAttribute("sign-return-address"))
1584 F->removeFnAttr("sign-return-address");
1585 }
1586 if (JumpTableArch == Triple::riscv32 || JumpTableArch == Triple::riscv64) {
1587 // Make sure the jump table assembly is not modified by the assembler or
1588 // the linker.
1589 F->addFnAttr("target-features", "-c,-relax");
1590 }
1591 // When -fcf-protection= is used, the inline asm adds an ENDBR. Suppress ENDBR
1592 // for the function to avoid double ENDBR. This is a no-op without
1593 // -fcf-protection=.
1594 if (JumpTableArch == Triple::x86 || JumpTableArch == Triple::x86_64)
1595 F->addFnAttr(Attribute::NoCfCheck);
1596
1597 // Make sure we don't emit .eh_frame for this function if it isn't needed.
1598 if (areAllEntriesNounwind)
1599 F->addFnAttr(Attribute::NoUnwind);
1600
1601 // Make sure we do not inline any calls to the cfi.jumptable.
1602 F->addFnAttr(Attribute::NoInline);
1603}
1604
1605/// Given a disjoint set of type identifiers and functions, build a jump table
1606/// for the functions, build the bit sets and lower the llvm.type.test calls.
1607void LowerTypeTestsModule::buildBitSetsFromFunctionsNative(
1609 // Unlike the global bitset builder, the function bitset builder cannot
1610 // re-arrange functions in a particular order and base its calculations on the
1611 // layout of the functions' entry points, as we have no idea how large a
1612 // particular function will end up being (the size could even depend on what
1613 // this pass does!) Instead, we build a jump table, which is a block of code
1614 // consisting of one branch instruction for each of the functions in the bit
1615 // set that branches to the target function, and redirect any taken function
1616 // addresses to the corresponding jump table entry. In the object file's
1617 // symbol table, the symbols for the target functions also refer to the jump
1618 // table entries, so that addresses taken outside the module will pass any
1619 // verification done inside the module.
1620 //
1621 // In more concrete terms, suppose we have three functions f, g, h which are
1622 // of the same type, and a function foo that returns their addresses:
1623 //
1624 // f:
1625 // mov 0, %eax
1626 // ret
1627 //
1628 // g:
1629 // mov 1, %eax
1630 // ret
1631 //
1632 // h:
1633 // mov 2, %eax
1634 // ret
1635 //
1636 // foo:
1637 // mov f, %eax
1638 // mov g, %edx
1639 // mov h, %ecx
1640 // ret
1641 //
1642 // We output the jump table as module-level inline asm string. The end result
1643 // will (conceptually) look like this:
1644 //
1645 // f = .cfi.jumptable
1646 // g = .cfi.jumptable + 4
1647 // h = .cfi.jumptable + 8
1648 // .cfi.jumptable:
1649 // jmp f.cfi ; 5 bytes
1650 // int3 ; 1 byte
1651 // int3 ; 1 byte
1652 // int3 ; 1 byte
1653 // jmp g.cfi ; 5 bytes
1654 // int3 ; 1 byte
1655 // int3 ; 1 byte
1656 // int3 ; 1 byte
1657 // jmp h.cfi ; 5 bytes
1658 // int3 ; 1 byte
1659 // int3 ; 1 byte
1660 // int3 ; 1 byte
1661 //
1662 // f.cfi:
1663 // mov 0, %eax
1664 // ret
1665 //
1666 // g.cfi:
1667 // mov 1, %eax
1668 // ret
1669 //
1670 // h.cfi:
1671 // mov 2, %eax
1672 // ret
1673 //
1674 // foo:
1675 // mov f, %eax
1676 // mov g, %edx
1677 // mov h, %ecx
1678 // ret
1679 //
1680 // Because the addresses of f, g, h are evenly spaced at a power of 2, in the
1681 // normal case the check can be carried out using the same kind of simple
1682 // arithmetic that we normally use for globals.
1683
1684 // FIXME: find a better way to represent the jumptable in the IR.
1685 assert(!Functions.empty());
1686
1687 // Decide on the jump table encoding, so that we know how big the
1688 // entries will be.
1689 Triple::ArchType JumpTableArch = selectJumpTableArmEncoding(Functions);
1690
1691 // Build a simple layout based on the regular layout of jump tables.
1692 DenseMap<GlobalTypeMember *, uint64_t> GlobalLayout;
1693 unsigned EntrySize = getJumpTableEntrySize(JumpTableArch);
1694 for (unsigned I = 0; I != Functions.size(); ++I)
1695 GlobalLayout[Functions[I]] = I * EntrySize;
1696
1697 Function *JumpTableFn =
1699 /* IsVarArg */ false),
1701 M.getDataLayout().getProgramAddressSpace(),
1702 ".cfi.jumptable", &M);
1703 ArrayType *JumpTableEntryType = ArrayType::get(Int8Ty, EntrySize);
1705 ArrayType::get(JumpTableEntryType, Functions.size());
1707 JumpTableFn, PointerType::getUnqual(M.getContext()));
1708
1709 lowerTypeTestCalls(TypeIds, JumpTable, GlobalLayout);
1710
1711 // Build aliases pointing to offsets into the jump table, and replace
1712 // references to the original functions with references to the aliases.
1713 for (unsigned I = 0; I != Functions.size(); ++I) {
1714 Function *F = cast<Function>(Functions[I]->getGlobal());
1715 bool IsJumpTableCanonical = Functions[I]->isJumpTableCanonical();
1716
1717 Constant *CombinedGlobalElemPtr = ConstantExpr::getInBoundsGetElementPtr(
1718 JumpTableType, JumpTable,
1719 ArrayRef<Constant *>{ConstantInt::get(IntPtrTy, 0),
1720 ConstantInt::get(IntPtrTy, I)});
1721
1722 const bool IsExported = Functions[I]->isExported();
1723 if (!IsJumpTableCanonical) {
1726 GlobalAlias *JtAlias = GlobalAlias::create(JumpTableEntryType, 0, LT,
1727 F->getName() + ".cfi_jt",
1728 CombinedGlobalElemPtr, &M);
1729 if (IsExported)
1731 else
1732 appendToUsed(M, {JtAlias});
1733 }
1734
1735 if (IsExported) {
1736 if (IsJumpTableCanonical)
1737 ExportSummary->cfiFunctionDefs().emplace(F->getName());
1738 else
1739 ExportSummary->cfiFunctionDecls().emplace(F->getName());
1740 }
1741
1742 if (!IsJumpTableCanonical) {
1743 if (F->hasExternalWeakLinkage())
1744 replaceWeakDeclarationWithJumpTablePtr(F, CombinedGlobalElemPtr,
1745 IsJumpTableCanonical);
1746 else
1747 replaceCfiUses(F, CombinedGlobalElemPtr, IsJumpTableCanonical);
1748 } else {
1749 assert(F->getType()->getAddressSpace() == 0);
1750
1751 GlobalAlias *FAlias =
1752 GlobalAlias::create(JumpTableEntryType, 0, F->getLinkage(), "",
1753 CombinedGlobalElemPtr, &M);
1754 FAlias->setVisibility(F->getVisibility());
1755 FAlias->takeName(F);
1756 if (FAlias->hasName()) {
1757 F->setName(FAlias->getName() + ".cfi");
1758 maybeReplaceComdat(F, FAlias->getName());
1759 }
1760 replaceCfiUses(F, FAlias, IsJumpTableCanonical);
1761 if (!F->hasLocalLinkage())
1762 F->setVisibility(GlobalVariable::HiddenVisibility);
1763 }
1764 }
1765
1766 createJumpTable(JumpTableFn, Functions, JumpTableArch);
1767}
1768
1769/// Assign a dummy layout using an incrementing counter, tag each function
1770/// with its index represented as metadata, and lower each type test to an
1771/// integer range comparison. During generation of the indirect function call
1772/// table in the backend, it will assign the given indexes.
1773/// Note: Dynamic linking is not supported, as the WebAssembly ABI has not yet
1774/// been finalized.
1775void LowerTypeTestsModule::buildBitSetsFromFunctionsWASM(
1777 assert(!Functions.empty());
1778
1779 // Build consecutive monotonic integer ranges for each call target set
1780 DenseMap<GlobalTypeMember *, uint64_t> GlobalLayout;
1781
1782 for (GlobalTypeMember *GTM : Functions) {
1783 Function *F = cast<Function>(GTM->getGlobal());
1784
1785 // Skip functions that are not address taken, to avoid bloating the table
1786 if (!F->hasAddressTaken())
1787 continue;
1788
1789 // Store metadata with the index for each function
1790 MDNode *MD = MDNode::get(F->getContext(),
1792 ConstantInt::get(Int64Ty, IndirectIndex))));
1793 F->setMetadata("wasm.index", MD);
1794
1795 // Assign the counter value
1796 GlobalLayout[GTM] = IndirectIndex++;
1797 }
1798
1799 // The indirect function table index space starts at zero, so pass a NULL
1800 // pointer as the subtracted "jump table" offset.
1801 lowerTypeTestCalls(TypeIds, ConstantPointerNull::get(PtrTy),
1802 GlobalLayout);
1803}
1804
1805void LowerTypeTestsModule::buildBitSetsFromDisjointSet(
1807 ArrayRef<ICallBranchFunnel *> ICallBranchFunnels) {
1808 DenseMap<Metadata *, uint64_t> TypeIdIndices;
1809 for (unsigned I = 0; I != TypeIds.size(); ++I)
1810 TypeIdIndices[TypeIds[I]] = I;
1811
1812 // For each type identifier, build a set of indices that refer to members of
1813 // the type identifier.
1814 std::vector<std::set<uint64_t>> TypeMembers(TypeIds.size());
1815 unsigned GlobalIndex = 0;
1816 DenseMap<GlobalTypeMember *, uint64_t> GlobalIndices;
1817 for (GlobalTypeMember *GTM : Globals) {
1818 for (MDNode *Type : GTM->types()) {
1819 // Type = { offset, type identifier }
1820 auto I = TypeIdIndices.find(Type->getOperand(1));
1821 if (I != TypeIdIndices.end())
1822 TypeMembers[I->second].insert(GlobalIndex);
1823 }
1824 GlobalIndices[GTM] = GlobalIndex;
1825 GlobalIndex++;
1826 }
1827
1828 for (ICallBranchFunnel *JT : ICallBranchFunnels) {
1829 TypeMembers.emplace_back();
1830 std::set<uint64_t> &TMSet = TypeMembers.back();
1831 for (GlobalTypeMember *T : JT->targets())
1832 TMSet.insert(GlobalIndices[T]);
1833 }
1834
1835 // Order the sets of indices by size. The GlobalLayoutBuilder works best
1836 // when given small index sets first.
1837 llvm::stable_sort(TypeMembers, [](const std::set<uint64_t> &O1,
1838 const std::set<uint64_t> &O2) {
1839 return O1.size() < O2.size();
1840 });
1841
1842 // Create a GlobalLayoutBuilder and provide it with index sets as layout
1843 // fragments. The GlobalLayoutBuilder tries to lay out members of fragments as
1844 // close together as possible.
1845 GlobalLayoutBuilder GLB(Globals.size());
1846 for (auto &&MemSet : TypeMembers)
1847 GLB.addFragment(MemSet);
1848
1849 // Build a vector of globals with the computed layout.
1850 bool IsGlobalSet =
1851 Globals.empty() || isa<GlobalVariable>(Globals[0]->getGlobal());
1852 std::vector<GlobalTypeMember *> OrderedGTMs(Globals.size());
1853 auto OGTMI = OrderedGTMs.begin();
1854 for (auto &&F : GLB.Fragments) {
1855 for (auto &&Offset : F) {
1856 if (IsGlobalSet != isa<GlobalVariable>(Globals[Offset]->getGlobal()))
1857 report_fatal_error("Type identifier may not contain both global "
1858 "variables and functions");
1859 *OGTMI++ = Globals[Offset];
1860 }
1861 }
1862
1863 // Build the bitsets from this disjoint set.
1864 if (IsGlobalSet)
1865 buildBitSetsFromGlobalVariables(TypeIds, OrderedGTMs);
1866 else
1867 buildBitSetsFromFunctions(TypeIds, OrderedGTMs);
1868}
1869
1870/// Lower all type tests in this module.
1871LowerTypeTestsModule::LowerTypeTestsModule(
1872 Module &M, ModuleAnalysisManager &AM, ModuleSummaryIndex *ExportSummary,
1873 const ModuleSummaryIndex *ImportSummary, DropTestKind DropTypeTests)
1874 : M(M), ExportSummary(ExportSummary), ImportSummary(ImportSummary),
1875 DropTypeTests(ClDropTypeTests > DropTypeTests ? ClDropTypeTests
1876 : DropTypeTests) {
1877 assert(!(ExportSummary && ImportSummary));
1878 Triple TargetTriple(M.getTargetTriple());
1879 Arch = TargetTriple.getArch();
1880 if (Arch == Triple::arm)
1881 CanUseArmJumpTable = true;
1882 if (Arch == Triple::arm || Arch == Triple::thumb) {
1883 auto &FAM =
1885 for (Function &F : M) {
1886 // Skip declarations since we should not query the TTI for them.
1887 if (F.isDeclaration())
1888 continue;
1889 auto &TTI = FAM.getResult<TargetIRAnalysis>(F);
1890 if (TTI.hasArmWideBranch(false))
1891 CanUseArmJumpTable = true;
1892 if (TTI.hasArmWideBranch(true))
1893 CanUseThumbBWJumpTable = true;
1894 }
1895 }
1896 OS = TargetTriple.getOS();
1897 ObjectFormat = TargetTriple.getObjectFormat();
1898
1899 // Function annotation describes or applies to function itself, and
1900 // shouldn't be associated with jump table thunk generated for CFI.
1901 GlobalAnnotation = M.getGlobalVariable("llvm.global.annotations");
1902 if (GlobalAnnotation && GlobalAnnotation->hasInitializer()) {
1903 const ConstantArray *CA =
1904 cast<ConstantArray>(GlobalAnnotation->getInitializer());
1905 FunctionAnnotations.insert_range(CA->operands());
1906 }
1907}
1908
1909bool LowerTypeTestsModule::runForTesting(Module &M, ModuleAnalysisManager &AM) {
1910 ModuleSummaryIndex Summary(/*HaveGVs=*/false);
1911
1912 // Handle the command-line summary arguments. This code is for testing
1913 // purposes only, so we handle errors directly.
1914 if (!ClReadSummary.empty()) {
1915 ExitOnError ExitOnErr("-lowertypetests-read-summary: " + ClReadSummary +
1916 ": ");
1917 auto ReadSummaryFile = ExitOnErr(errorOrToExpected(
1918 MemoryBuffer::getFile(ClReadSummary, /*IsText=*/true)));
1919
1920 yaml::Input In(ReadSummaryFile->getBuffer());
1921 In >> Summary;
1922 ExitOnErr(errorCodeToError(In.error()));
1923 }
1924
1925 bool Changed =
1926 LowerTypeTestsModule(
1927 M, AM,
1928 ClSummaryAction == PassSummaryAction::Export ? &Summary : nullptr,
1929 ClSummaryAction == PassSummaryAction::Import ? &Summary : nullptr,
1930 /*DropTypeTests=*/DropTestKind::None)
1931 .lower();
1932
1933 if (!ClWriteSummary.empty()) {
1934 ExitOnError ExitOnErr("-lowertypetests-write-summary: " + ClWriteSummary +
1935 ": ");
1936 std::error_code EC;
1937 raw_fd_ostream OS(ClWriteSummary, EC, sys::fs::OF_TextWithCRLF);
1938 ExitOnErr(errorCodeToError(EC));
1939
1940 yaml::Output Out(OS);
1941 Out << Summary;
1942 }
1943
1944 return Changed;
1945}
1946
1947static bool isDirectCall(Use& U) {
1948 auto *Usr = dyn_cast<CallInst>(U.getUser());
1949 if (Usr) {
1950 auto *CB = dyn_cast<CallBase>(Usr);
1951 if (CB && CB->isCallee(&U))
1952 return true;
1953 }
1954 return false;
1955}
1956
1957void LowerTypeTestsModule::replaceCfiUses(Function *Old, Value *New,
1958 bool IsJumpTableCanonical) {
1959 SmallSetVector<Constant *, 4> Constants;
1960 for (Use &U : llvm::make_early_inc_range(Old->uses())) {
1961 // Skip no_cfi values, which refer to the function body instead of the jump
1962 // table.
1963 if (isa<NoCFIValue>(U.getUser()))
1964 continue;
1965
1966 // Skip direct calls to externally defined or non-dso_local functions.
1967 if (isDirectCall(U) && (Old->isDSOLocal() || !IsJumpTableCanonical))
1968 continue;
1969
1970 // Skip function annotation.
1971 if (isFunctionAnnotation(U.getUser()))
1972 continue;
1973
1974 // Must handle Constants specially, we cannot call replaceUsesOfWith on a
1975 // constant because they are uniqued.
1976 if (auto *C = dyn_cast<Constant>(U.getUser())) {
1977 if (!isa<GlobalValue>(C)) {
1978 // Save unique users to avoid processing operand replacement
1979 // more than once.
1980 Constants.insert(C);
1981 continue;
1982 }
1983 }
1984
1985 U.set(New);
1986 }
1987
1988 // Process operand replacement of saved constants.
1989 for (auto *C : Constants)
1990 C->handleOperandChange(Old, New);
1991}
1992
1993void LowerTypeTestsModule::replaceDirectCalls(Value *Old, Value *New) {
1995}
1996
1997static void dropTypeTests(Module &M, Function &TypeTestFunc,
1998 bool ShouldDropAll) {
1999 for (Use &U : llvm::make_early_inc_range(TypeTestFunc.uses())) {
2000 auto *CI = cast<CallInst>(U.getUser());
2001 // Find and erase llvm.assume intrinsics for this llvm.type.test call.
2002 for (Use &CIU : llvm::make_early_inc_range(CI->uses()))
2003 if (auto *Assume = dyn_cast<AssumeInst>(CIU.getUser()))
2004 Assume->eraseFromParent();
2005 // If the assume was merged with another assume, we might have a use on a
2006 // phi (which will feed the assume). Simply replace the use on the phi
2007 // with "true" and leave the merged assume.
2008 //
2009 // If ShouldDropAll is set, then we we need to update any remaining uses,
2010 // regardless of the instruction type.
2011 if (!CI->use_empty()) {
2012 assert(ShouldDropAll || all_of(CI->users(), [](User *U) -> bool {
2013 return isa<PHINode>(U);
2014 }));
2015 CI->replaceAllUsesWith(ConstantInt::getTrue(M.getContext()));
2016 }
2017 CI->eraseFromParent();
2018 }
2019}
2020
2021bool LowerTypeTestsModule::lower() {
2022 Function *TypeTestFunc =
2023 Intrinsic::getDeclarationIfExists(&M, Intrinsic::type_test);
2024
2025 if (DropTypeTests != DropTestKind::None) {
2026 bool ShouldDropAll = DropTypeTests == DropTestKind::All;
2027 if (TypeTestFunc)
2028 dropTypeTests(M, *TypeTestFunc, ShouldDropAll);
2029 // Normally we'd have already removed all @llvm.public.type.test calls,
2030 // except for in the case where we originally were performing ThinLTO but
2031 // decided not to in the backend.
2032 Function *PublicTypeTestFunc =
2033 Intrinsic::getDeclarationIfExists(&M, Intrinsic::public_type_test);
2034 if (PublicTypeTestFunc)
2035 dropTypeTests(M, *PublicTypeTestFunc, ShouldDropAll);
2036 if (TypeTestFunc || PublicTypeTestFunc) {
2037 // We have deleted the type intrinsics, so we no longer have enough
2038 // information to reason about the liveness of virtual function pointers
2039 // in GlobalDCE.
2040 for (GlobalVariable &GV : M.globals())
2041 GV.eraseMetadata(LLVMContext::MD_vcall_visibility);
2042 return true;
2043 }
2044 return false;
2045 }
2046
2047 // If only some of the modules were split, we cannot correctly perform
2048 // this transformation. We already checked for the presense of type tests
2049 // with partially split modules during the thin link, and would have emitted
2050 // an error if any were found, so here we can simply return.
2051 if ((ExportSummary && ExportSummary->partiallySplitLTOUnits()) ||
2052 (ImportSummary && ImportSummary->partiallySplitLTOUnits()))
2053 return false;
2054
2055 Function *ICallBranchFunnelFunc =
2056 Intrinsic::getDeclarationIfExists(&M, Intrinsic::icall_branch_funnel);
2057 if ((!TypeTestFunc || TypeTestFunc->use_empty()) &&
2058 (!ICallBranchFunnelFunc || ICallBranchFunnelFunc->use_empty()) &&
2059 !ExportSummary && !ImportSummary)
2060 return false;
2061
2062 if (ImportSummary) {
2063 if (TypeTestFunc)
2064 for (Use &U : llvm::make_early_inc_range(TypeTestFunc->uses()))
2065 importTypeTest(cast<CallInst>(U.getUser()));
2066
2067 if (ICallBranchFunnelFunc && !ICallBranchFunnelFunc->use_empty())
2069 "unexpected call to llvm.icall.branch.funnel during import phase");
2070
2073 for (auto &F : M) {
2074 // CFI functions are either external, or promoted. A local function may
2075 // have the same name, but it's not the one we are looking for.
2076 if (F.hasLocalLinkage())
2077 continue;
2078 if (ImportSummary->cfiFunctionDefs().count(F.getName()))
2079 Defs.push_back(&F);
2080 else if (ImportSummary->cfiFunctionDecls().count(F.getName()))
2081 Decls.push_back(&F);
2082 }
2083
2084 {
2085 ScopedSaveAliaseesAndUsed S(M);
2086 for (auto *F : Defs)
2087 importFunction(F, /*isJumpTableCanonical*/ true);
2088 for (auto *F : Decls)
2089 importFunction(F, /*isJumpTableCanonical*/ false);
2090 }
2091
2092 return true;
2093 }
2094
2095 // Equivalence class set containing type identifiers and the globals that
2096 // reference them. This is used to partition the set of type identifiers in
2097 // the module into disjoint sets.
2098 using GlobalClassesTy = EquivalenceClasses<
2099 PointerUnion<GlobalTypeMember *, Metadata *, ICallBranchFunnel *>>;
2100 GlobalClassesTy GlobalClasses;
2101
2102 // Verify the type metadata and build a few data structures to let us
2103 // efficiently enumerate the type identifiers associated with a global:
2104 // a list of GlobalTypeMembers (a GlobalObject stored alongside a vector
2105 // of associated type metadata) and a mapping from type identifiers to their
2106 // list of GlobalTypeMembers and last observed index in the list of globals.
2107 // The indices will be used later to deterministically order the list of type
2108 // identifiers.
2110 struct TIInfo {
2111 unsigned UniqueId;
2112 std::vector<GlobalTypeMember *> RefGlobals;
2113 };
2114 DenseMap<Metadata *, TIInfo> TypeIdInfo;
2115 unsigned CurUniqueId = 0;
2117
2118 // Cross-DSO CFI emits jumptable entries for exported functions as well as
2119 // address taken functions in case they are address taken in other modules.
2120 const bool CrossDsoCfi = M.getModuleFlag("Cross-DSO CFI") != nullptr;
2121
2122 struct ExportedFunctionInfo {
2124 MDNode *FuncMD; // {name, linkage, type[, type...]}
2125 };
2126 MapVector<StringRef, ExportedFunctionInfo> ExportedFunctions;
2127 if (ExportSummary) {
2128 NamedMDNode *CfiFunctionsMD = M.getNamedMetadata("cfi.functions");
2129 if (CfiFunctionsMD) {
2130 // A set of all functions that are address taken by a live global object.
2131 DenseSet<GlobalValue::GUID> AddressTaken;
2132 for (auto &I : *ExportSummary)
2133 for (auto &GVS : I.second.SummaryList)
2134 if (GVS->isLive())
2135 for (const auto &Ref : GVS->refs()) {
2136 AddressTaken.insert(Ref.getGUID());
2137 for (auto &RefGVS : Ref.getSummaryList())
2138 if (auto Alias = dyn_cast<AliasSummary>(RefGVS.get()))
2139 AddressTaken.insert(Alias->getAliaseeGUID());
2140 }
2142 if (AddressTaken.count(GUID))
2143 return true;
2144 auto VI = ExportSummary->getValueInfo(GUID);
2145 if (!VI)
2146 return false;
2147 for (auto &I : VI.getSummaryList())
2148 if (auto Alias = dyn_cast<AliasSummary>(I.get()))
2149 if (AddressTaken.count(Alias->getAliaseeGUID()))
2150 return true;
2151 return false;
2152 };
2153 for (auto *FuncMD : CfiFunctionsMD->operands()) {
2154 assert(FuncMD->getNumOperands() >= 2);
2155 StringRef FunctionName =
2156 cast<MDString>(FuncMD->getOperand(0))->getString();
2158 cast<ConstantAsMetadata>(FuncMD->getOperand(1))
2159 ->getValue()
2160 ->getUniqueInteger()
2161 .getZExtValue());
2162 const GlobalValue::GUID GUID =
2165 // Do not emit jumptable entries for functions that are not-live and
2166 // have no live references (and are not exported with cross-DSO CFI.)
2167 if (!ExportSummary->isGUIDLive(GUID))
2168 continue;
2169 if (!IsAddressTaken(GUID)) {
2170 if (!CrossDsoCfi || Linkage != CFL_Definition)
2171 continue;
2172
2173 bool Exported = false;
2174 if (auto VI = ExportSummary->getValueInfo(GUID))
2175 for (const auto &GVS : VI.getSummaryList())
2176 if (GVS->isLive() && !GlobalValue::isLocalLinkage(GVS->linkage()))
2177 Exported = true;
2178
2179 if (!Exported)
2180 continue;
2181 }
2182 auto P = ExportedFunctions.insert({FunctionName, {Linkage, FuncMD}});
2183 if (!P.second && P.first->second.Linkage != CFL_Definition)
2184 P.first->second = {Linkage, FuncMD};
2185 }
2186
2187 for (const auto &P : ExportedFunctions) {
2188 StringRef FunctionName = P.first;
2189 CfiFunctionLinkage Linkage = P.second.Linkage;
2190 MDNode *FuncMD = P.second.FuncMD;
2191 Function *F = M.getFunction(FunctionName);
2192 if (F && F->hasLocalLinkage()) {
2193 // Locally defined function that happens to have the same name as a
2194 // function defined in a ThinLTO module. Rename it to move it out of
2195 // the way of the external reference that we're about to create.
2196 // Note that setName will find a unique name for the function, so even
2197 // if there is an existing function with the suffix there won't be a
2198 // name collision.
2199 F->setName(F->getName() + ".1");
2200 F = nullptr;
2201 }
2202
2203 if (!F)
2205 FunctionType::get(Type::getVoidTy(M.getContext()), false),
2206 GlobalVariable::ExternalLinkage,
2207 M.getDataLayout().getProgramAddressSpace(), FunctionName, &M);
2208
2209 // If the function is available_externally, remove its definition so
2210 // that it is handled the same way as a declaration. Later we will try
2211 // to create an alias using this function's linkage, which will fail if
2212 // the linkage is available_externally. This will also result in us
2213 // following the code path below to replace the type metadata.
2214 if (F->hasAvailableExternallyLinkage()) {
2215 F->setLinkage(GlobalValue::ExternalLinkage);
2216 F->deleteBody();
2217 F->setComdat(nullptr);
2218 F->clearMetadata();
2219 }
2220
2221 // Update the linkage for extern_weak declarations when a definition
2222 // exists.
2223 if (Linkage == CFL_Definition && F->hasExternalWeakLinkage())
2224 F->setLinkage(GlobalValue::ExternalLinkage);
2225
2226 // If the function in the full LTO module is a declaration, replace its
2227 // type metadata with the type metadata we found in cfi.functions. That
2228 // metadata is presumed to be more accurate than the metadata attached
2229 // to the declaration.
2230 if (F->isDeclaration()) {
2233
2234 F->eraseMetadata(LLVMContext::MD_type);
2235 for (unsigned I = 2; I < FuncMD->getNumOperands(); ++I)
2236 F->addMetadata(LLVMContext::MD_type,
2237 *cast<MDNode>(FuncMD->getOperand(I).get()));
2238 }
2239 }
2240 }
2241 }
2242
2243 struct AliasToCreate {
2244 Function *Alias;
2245 std::string TargetName;
2246 };
2247 std::vector<AliasToCreate> AliasesToCreate;
2248
2249 // Parse alias data to replace stand-in function declarations for aliases
2250 // with an alias to the intended target.
2251 if (ExportSummary) {
2252 if (NamedMDNode *AliasesMD = M.getNamedMetadata("aliases")) {
2253 for (auto *AliasMD : AliasesMD->operands()) {
2255 for (Metadata *MD : AliasMD->operands()) {
2256 auto *MDS = dyn_cast<MDString>(MD);
2257 if (!MDS)
2258 continue;
2259 StringRef AliasName = MDS->getString();
2260 if (!ExportedFunctions.count(AliasName))
2261 continue;
2262 auto *AliasF = M.getFunction(AliasName);
2263 if (AliasF)
2264 Aliases.push_back(AliasF);
2265 }
2266
2267 if (Aliases.empty())
2268 continue;
2269
2270 for (unsigned I = 1; I != Aliases.size(); ++I) {
2271 auto *AliasF = Aliases[I];
2272 ExportedFunctions.erase(AliasF->getName());
2273 AliasesToCreate.push_back(
2274 {AliasF, std::string(Aliases[0]->getName())});
2275 }
2276 }
2277 }
2278 }
2279
2280 DenseMap<GlobalObject *, GlobalTypeMember *> GlobalTypeMembers;
2281 for (GlobalObject &GO : M.global_objects()) {
2283 continue;
2284
2285 Types.clear();
2286 GO.getMetadata(LLVMContext::MD_type, Types);
2287
2288 bool IsJumpTableCanonical = false;
2289 bool IsExported = false;
2290 if (Function *F = dyn_cast<Function>(&GO)) {
2291 IsJumpTableCanonical = isJumpTableCanonical(F);
2292 if (auto It = ExportedFunctions.find(F->getName());
2293 It != ExportedFunctions.end()) {
2294 IsJumpTableCanonical |= It->second.Linkage == CFL_Definition;
2295 IsExported = true;
2296 // TODO: The logic here checks only that the function is address taken,
2297 // not that the address takers are live. This can be updated to check
2298 // their liveness and emit fewer jumptable entries once monolithic LTO
2299 // builds also emit summaries.
2300 } else if (!F->hasAddressTaken()) {
2301 if (!CrossDsoCfi || !IsJumpTableCanonical || F->hasLocalLinkage())
2302 continue;
2303 }
2304 }
2305
2306 auto *GTM = GlobalTypeMember::create(Alloc, &GO, IsJumpTableCanonical,
2307 IsExported, Types);
2308 GlobalTypeMembers[&GO] = GTM;
2309 for (MDNode *Type : Types) {
2310 verifyTypeMDNode(&GO, Type);
2311 auto &Info = TypeIdInfo[Type->getOperand(1)];
2312 Info.UniqueId = ++CurUniqueId;
2313 Info.RefGlobals.push_back(GTM);
2314 }
2315 }
2316
2317 auto AddTypeIdUse = [&](Metadata *TypeId) -> TypeIdUserInfo & {
2318 // Add the call site to the list of call sites for this type identifier. We
2319 // also use TypeIdUsers to keep track of whether we have seen this type
2320 // identifier before. If we have, we don't need to re-add the referenced
2321 // globals to the equivalence class.
2322 auto Ins = TypeIdUsers.insert({TypeId, {}});
2323 if (Ins.second) {
2324 // Add the type identifier to the equivalence class.
2325 auto &GCI = GlobalClasses.insert(TypeId);
2326 GlobalClassesTy::member_iterator CurSet = GlobalClasses.findLeader(GCI);
2327
2328 // Add the referenced globals to the type identifier's equivalence class.
2329 for (GlobalTypeMember *GTM : TypeIdInfo[TypeId].RefGlobals)
2330 CurSet = GlobalClasses.unionSets(
2331 CurSet, GlobalClasses.findLeader(GlobalClasses.insert(GTM)));
2332 }
2333
2334 return Ins.first->second;
2335 };
2336
2337 if (TypeTestFunc) {
2338 for (const Use &U : TypeTestFunc->uses()) {
2339 auto CI = cast<CallInst>(U.getUser());
2340 // If this type test is only used by llvm.assume instructions, it
2341 // was used for whole program devirtualization, and is being kept
2342 // for use by other optimization passes. We do not need or want to
2343 // lower it here. We also don't want to rewrite any associated globals
2344 // unnecessarily. These will be removed by a subsequent LTT invocation
2345 // with the DropTypeTests flag set.
2346 bool OnlyAssumeUses = !CI->use_empty();
2347 for (const Use &CIU : CI->uses()) {
2348 if (isa<AssumeInst>(CIU.getUser()))
2349 continue;
2350 OnlyAssumeUses = false;
2351 break;
2352 }
2353 if (OnlyAssumeUses)
2354 continue;
2355
2356 auto TypeIdMDVal = dyn_cast<MetadataAsValue>(CI->getArgOperand(1));
2357 if (!TypeIdMDVal)
2358 report_fatal_error("Second argument of llvm.type.test must be metadata");
2359 auto TypeId = TypeIdMDVal->getMetadata();
2360 AddTypeIdUse(TypeId).CallSites.push_back(CI);
2361 }
2362 }
2363
2364 if (ICallBranchFunnelFunc) {
2365 for (const Use &U : ICallBranchFunnelFunc->uses()) {
2366 if (Arch != Triple::x86_64)
2368 "llvm.icall.branch.funnel not supported on this target");
2369
2370 auto CI = cast<CallInst>(U.getUser());
2371
2372 std::vector<GlobalTypeMember *> Targets;
2373 if (CI->arg_size() % 2 != 1)
2374 report_fatal_error("number of arguments should be odd");
2375
2376 GlobalClassesTy::member_iterator CurSet;
2377 for (unsigned I = 1; I != CI->arg_size(); I += 2) {
2378 int64_t Offset;
2380 CI->getOperand(I), Offset, M.getDataLayout()));
2381 if (!Base)
2383 "Expected branch funnel operand to be global value");
2384
2385 GlobalTypeMember *GTM = GlobalTypeMembers[Base];
2386 Targets.push_back(GTM);
2387 GlobalClassesTy::member_iterator NewSet =
2388 GlobalClasses.findLeader(GlobalClasses.insert(GTM));
2389 if (I == 1)
2390 CurSet = NewSet;
2391 else
2392 CurSet = GlobalClasses.unionSets(CurSet, NewSet);
2393 }
2394
2395 GlobalClasses.unionSets(
2396 CurSet, GlobalClasses.findLeader(
2397 GlobalClasses.insert(ICallBranchFunnel::create(
2398 Alloc, CI, Targets, ++CurUniqueId))));
2399 }
2400 }
2401
2402 if (ExportSummary) {
2403 DenseMap<GlobalValue::GUID, TinyPtrVector<Metadata *>> MetadataByGUID;
2404 for (auto &P : TypeIdInfo) {
2405 if (auto *TypeId = dyn_cast<MDString>(P.first))
2407 TypeId->getString())]
2408 .push_back(TypeId);
2409 }
2410
2411 for (auto &P : *ExportSummary) {
2412 for (auto &S : P.second.SummaryList) {
2413 if (!ExportSummary->isGlobalValueLive(S.get()))
2414 continue;
2415 if (auto *FS = dyn_cast<FunctionSummary>(S->getBaseObject()))
2416 for (GlobalValue::GUID G : FS->type_tests())
2417 for (Metadata *MD : MetadataByGUID[G])
2418 AddTypeIdUse(MD).IsExported = true;
2419 }
2420 }
2421 }
2422
2423 if (GlobalClasses.empty())
2424 return false;
2425
2426 {
2427 ScopedSaveAliaseesAndUsed S(M);
2428 // For each disjoint set we found...
2429 for (const auto &C : GlobalClasses) {
2430 if (!C->isLeader())
2431 continue;
2432
2433 ++NumTypeIdDisjointSets;
2434 // Build the list of type identifiers in this disjoint set.
2435 std::vector<Metadata *> TypeIds;
2436 std::vector<GlobalTypeMember *> Globals;
2437 std::vector<ICallBranchFunnel *> ICallBranchFunnels;
2438 for (auto M : GlobalClasses.members(*C)) {
2439 if (isa<Metadata *>(M))
2440 TypeIds.push_back(cast<Metadata *>(M));
2441 else if (isa<GlobalTypeMember *>(M))
2442 Globals.push_back(cast<GlobalTypeMember *>(M));
2443 else
2444 ICallBranchFunnels.push_back(cast<ICallBranchFunnel *>(M));
2445 }
2446
2447 // Order type identifiers by unique ID for determinism. This ordering is
2448 // stable as there is a one-to-one mapping between metadata and unique
2449 // IDs.
2450 llvm::sort(TypeIds, [&](Metadata *M1, Metadata *M2) {
2451 return TypeIdInfo[M1].UniqueId < TypeIdInfo[M2].UniqueId;
2452 });
2453
2454 // Same for the branch funnels.
2455 llvm::sort(ICallBranchFunnels,
2456 [&](ICallBranchFunnel *F1, ICallBranchFunnel *F2) {
2457 return F1->UniqueId < F2->UniqueId;
2458 });
2459
2460 // Build bitsets for this disjoint set.
2461 buildBitSetsFromDisjointSet(TypeIds, Globals, ICallBranchFunnels);
2462 }
2463 }
2464
2465 allocateByteArrays();
2466
2467 for (auto A : AliasesToCreate) {
2468 auto *Target = M.getNamedValue(A.TargetName);
2469 if (!isa<GlobalAlias>(Target))
2470 continue;
2471 auto *AliasGA = GlobalAlias::create("", Target);
2472 AliasGA->setVisibility(A.Alias->getVisibility());
2473 AliasGA->setLinkage(A.Alias->getLinkage());
2474 AliasGA->takeName(A.Alias);
2475 A.Alias->replaceAllUsesWith(AliasGA);
2476 A.Alias->eraseFromParent();
2477 }
2478
2479 // Emit .symver directives for exported functions, if they exist.
2480 if (ExportSummary) {
2481 if (NamedMDNode *SymversMD = M.getNamedMetadata("symvers")) {
2482 for (auto *Symver : SymversMD->operands()) {
2483 assert(Symver->getNumOperands() >= 2);
2484 StringRef SymbolName =
2485 cast<MDString>(Symver->getOperand(0))->getString();
2486 StringRef Alias = cast<MDString>(Symver->getOperand(1))->getString();
2487
2488 if (!ExportedFunctions.count(SymbolName))
2489 continue;
2490
2491 M.appendModuleInlineAsm(
2492 (llvm::Twine(".symver ") + SymbolName + ", " + Alias).str());
2493 }
2494 }
2495 }
2496
2497 return true;
2498}
2499
2502 bool Changed;
2503 if (UseCommandLine)
2504 Changed = LowerTypeTestsModule::runForTesting(M, AM);
2505 else
2506 Changed =
2507 LowerTypeTestsModule(M, AM, ExportSummary, ImportSummary, DropTypeTests)
2508 .lower();
2509 if (!Changed)
2510 return PreservedAnalyses::all();
2511 return PreservedAnalyses::none();
2512}
2513
2516 bool Changed = false;
2517 // Figure out whether inlining has exposed a constant address to a lowered
2518 // type test, and remove the test if so and the address is known to pass the
2519 // test. Unfortunately this pass ends up needing to reverse engineer what
2520 // LowerTypeTests did; this is currently inherent to the design of ThinLTO
2521 // importing where LowerTypeTests needs to run at the start.
2522 //
2523 // We look for things like:
2524 //
2525 // sub (i64 ptrtoint (ptr @_Z2fpv to i64), i64 ptrtoint (ptr
2526 // @__typeid__ZTSFvvE_global_addr to i64))
2527 //
2528 // which gets replaced with 0 if _Z2fpv (more specifically _Z2fpv.cfi, the
2529 // function referred to by the jump table) is a member of the type _ZTSFvv, as
2530 // well as things like
2531 //
2532 // icmp eq ptr @_Z2fpv, @__typeid__ZTSFvvE_global_addr
2533 //
2534 // which gets replaced with true if _Z2fpv is a member.
2535 for (auto &GV : M.globals()) {
2536 if (!GV.getName().starts_with("__typeid_") ||
2537 !GV.getName().ends_with("_global_addr"))
2538 continue;
2539 // __typeid_foo_global_addr -> foo
2540 auto *MD = MDString::get(M.getContext(),
2541 GV.getName().substr(9, GV.getName().size() - 21));
2542 auto MaySimplifyPtr = [&](Value *Ptr) {
2543 if (auto *GV = dyn_cast<GlobalValue>(Ptr))
2544 if (auto *CFIGV = M.getNamedValue((GV->getName() + ".cfi").str()))
2545 Ptr = CFIGV;
2546 return isKnownTypeIdMember(MD, M.getDataLayout(), Ptr, 0);
2547 };
2548 auto MaySimplifyInt = [&](Value *Op) {
2549 auto *PtrAsInt = dyn_cast<ConstantExpr>(Op);
2550 if (!PtrAsInt || PtrAsInt->getOpcode() != Instruction::PtrToInt)
2551 return false;
2552 return MaySimplifyPtr(PtrAsInt->getOperand(0));
2553 };
2554 for (User *U : make_early_inc_range(GV.users())) {
2555 if (auto *CI = dyn_cast<ICmpInst>(U)) {
2556 if (CI->getPredicate() == CmpInst::ICMP_EQ &&
2557 MaySimplifyPtr(CI->getOperand(0))) {
2558 // This is an equality comparison (TypeTestResolution::Single case in
2559 // lowerTypeTestCall). In this case we just replace the comparison
2560 // with true.
2561 CI->replaceAllUsesWith(ConstantInt::getTrue(M.getContext()));
2562 CI->eraseFromParent();
2563 Changed = true;
2564 continue;
2565 }
2566 }
2567 auto *CE = dyn_cast<ConstantExpr>(U);
2568 if (!CE || CE->getOpcode() != Instruction::PtrToInt)
2569 continue;
2570 for (Use &U : make_early_inc_range(CE->uses())) {
2571 auto *CE = dyn_cast<ConstantExpr>(U.getUser());
2572 if (U.getOperandNo() == 0 && CE &&
2573 CE->getOpcode() == Instruction::Sub &&
2574 MaySimplifyInt(CE->getOperand(1))) {
2575 // This is a computation of PtrOffset as generated by
2576 // LowerTypeTestsModule::lowerTypeTestCall above. If
2577 // isKnownTypeIdMember passes we just pretend it evaluated to 0. This
2578 // should cause later passes to remove the range and alignment checks.
2579 // The bitset checks won't be removed but those are uncommon.
2580 CE->replaceAllUsesWith(ConstantInt::get(CE->getType(), 0));
2581 Changed = true;
2582 }
2583 auto *CI = dyn_cast<ICmpInst>(U.getUser());
2584 if (U.getOperandNo() == 1 && CI &&
2585 CI->getPredicate() == CmpInst::ICMP_EQ &&
2586 MaySimplifyInt(CI->getOperand(0))) {
2587 // This is an equality comparison. Unlike in the case above it
2588 // remained as an integer compare.
2589 CI->replaceAllUsesWith(ConstantInt::getTrue(M.getContext()));
2590 CI->eraseFromParent();
2591 Changed = true;
2592 }
2593 }
2594 }
2595 }
2596
2597 if (!Changed)
2598 return PreservedAnalyses::all();
2602 PA.preserve<LoopAnalysis>();
2603 return PA;
2604}
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 auto buildBitSets(ArrayRef< Metadata * > TypeIds, const DenseMap< GlobalTypeMember *, uint64_t > &GlobalLayout)
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(ArrayRef< uint64_t > Offsets)
Build a bit set for list of offsets.
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:114
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:569
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)
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
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:2040
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:1707
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:2118
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:626
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:1632
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:1817
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:384
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.