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