@@ -1669,55 +1669,61 @@ void LowerTypeTestsModule::buildBitSetsFromFunctionsNative(
1669
1669
1670
1670
lowerTypeTestCalls (TypeIds, JumpTable, GlobalLayout);
1671
1671
1672
- // Build aliases pointing to offsets into the jump table, and replace
1673
- // references to the original functions with references to the aliases.
1674
- for (unsigned I = 0 ; I != Functions.size (); ++I) {
1675
- Function *F = cast<Function>(Functions[I]->getGlobal ());
1676
- bool IsJumpTableCanonical = Functions[I]->isJumpTableCanonical ();
1672
+ {
1673
+ ScopedSaveAliaseesAndUsed S (M);
1677
1674
1678
- Constant *CombinedGlobalElemPtr = ConstantExpr::getInBoundsGetElementPtr (
1679
- JumpTableType, JumpTable,
1680
- ArrayRef<Constant *>{ConstantInt::get (IntPtrTy, 0 ),
1681
- ConstantInt::get (IntPtrTy, I)});
1682
-
1683
- const bool IsExported = Functions[I]->isExported ();
1684
- if (!IsJumpTableCanonical) {
1685
- GlobalValue::LinkageTypes LT = IsExported ? GlobalValue::ExternalLinkage
1686
- : GlobalValue::InternalLinkage;
1687
- GlobalAlias *JtAlias = GlobalAlias::create (F->getValueType (), 0 , LT,
1688
- F->getName () + " .cfi_jt" ,
1689
- CombinedGlobalElemPtr, &M);
1690
- if (IsExported)
1691
- JtAlias->setVisibility (GlobalValue::HiddenVisibility);
1692
- else
1693
- appendToUsed (M, {JtAlias});
1694
- }
1675
+ // Build aliases pointing to offsets into the jump table, and replace
1676
+ // references to the original functions with references to the aliases.
1677
+ for (unsigned I = 0 ; I != Functions.size (); ++I) {
1678
+ Function *F = cast<Function>(Functions[I]->getGlobal ());
1679
+ bool IsJumpTableCanonical = Functions[I]->isJumpTableCanonical ();
1680
+
1681
+ Constant *CombinedGlobalElemPtr = ConstantExpr::getInBoundsGetElementPtr (
1682
+ JumpTableType, JumpTable,
1683
+ ArrayRef<Constant *>{ConstantInt::get (IntPtrTy, 0 ),
1684
+ ConstantInt::get (IntPtrTy, I)});
1685
+
1686
+ const bool IsExported = Functions[I]->isExported ();
1687
+ if (!IsJumpTableCanonical) {
1688
+ GlobalValue::LinkageTypes LT = IsExported
1689
+ ? GlobalValue::ExternalLinkage
1690
+ : GlobalValue::InternalLinkage;
1691
+ GlobalAlias *JtAlias = GlobalAlias::create (F->getValueType (), 0 , LT,
1692
+ F->getName () + " .cfi_jt" ,
1693
+ CombinedGlobalElemPtr, &M);
1694
+ if (IsExported)
1695
+ JtAlias->setVisibility (GlobalValue::HiddenVisibility);
1696
+ else
1697
+ appendToUsed (M, {JtAlias});
1698
+ }
1695
1699
1696
- if (IsExported) {
1697
- if (IsJumpTableCanonical)
1698
- ExportSummary->cfiFunctionDefs ().emplace (F->getName ());
1699
- else
1700
- ExportSummary->cfiFunctionDecls ().emplace (F->getName ());
1701
- }
1700
+ if (IsExported) {
1701
+ if (IsJumpTableCanonical)
1702
+ ExportSummary->cfiFunctionDefs ().emplace (F->getName ());
1703
+ else
1704
+ ExportSummary->cfiFunctionDecls ().emplace (F->getName ());
1705
+ }
1702
1706
1703
- if (!IsJumpTableCanonical) {
1704
- if (F->hasExternalWeakLinkage ())
1705
- replaceWeakDeclarationWithJumpTablePtr (F, CombinedGlobalElemPtr,
1706
- IsJumpTableCanonical);
1707
- else
1708
- replaceCfiUses (F, CombinedGlobalElemPtr, IsJumpTableCanonical);
1709
- } else {
1710
- assert (F->getType ()->getAddressSpace () == 0 );
1711
-
1712
- GlobalAlias *FAlias = GlobalAlias::create (
1713
- F->getValueType (), 0 , F->getLinkage (), " " , CombinedGlobalElemPtr, &M);
1714
- FAlias->setVisibility (F->getVisibility ());
1715
- FAlias->takeName (F);
1716
- if (FAlias->hasName ())
1717
- F->setName (FAlias->getName () + " .cfi" );
1718
- replaceCfiUses (F, FAlias, IsJumpTableCanonical);
1719
- if (!F->hasLocalLinkage ())
1720
- F->setVisibility (GlobalVariable::HiddenVisibility);
1707
+ if (!IsJumpTableCanonical) {
1708
+ if (F->hasExternalWeakLinkage ())
1709
+ replaceWeakDeclarationWithJumpTablePtr (F, CombinedGlobalElemPtr,
1710
+ IsJumpTableCanonical);
1711
+ else
1712
+ replaceCfiUses (F, CombinedGlobalElemPtr, IsJumpTableCanonical);
1713
+ } else {
1714
+ assert (F->getType ()->getAddressSpace () == 0 );
1715
+
1716
+ GlobalAlias *FAlias =
1717
+ GlobalAlias::create (F->getValueType (), 0 , F->getLinkage (), " " ,
1718
+ CombinedGlobalElemPtr, &M);
1719
+ FAlias->setVisibility (F->getVisibility ());
1720
+ FAlias->takeName (F);
1721
+ if (FAlias->hasName ())
1722
+ F->setName (FAlias->getName () + " .cfi" );
1723
+ replaceCfiUses (F, FAlias, IsJumpTableCanonical);
1724
+ if (!F->hasLocalLinkage ())
1725
+ F->setVisibility (GlobalVariable::HiddenVisibility);
1726
+ }
1721
1727
}
1722
1728
}
1723
1729
@@ -2333,43 +2339,39 @@ bool LowerTypeTestsModule::lower() {
2333
2339
if (GlobalClasses.empty ())
2334
2340
return false ;
2335
2341
2336
- {
2337
- ScopedSaveAliaseesAndUsed S (M);
2338
- // For each disjoint set we found...
2339
- for (const auto &C : GlobalClasses) {
2340
- if (!C->isLeader ())
2341
- continue ;
2342
-
2343
- ++NumTypeIdDisjointSets;
2344
- // Build the list of type identifiers in this disjoint set.
2345
- std::vector<Metadata *> TypeIds;
2346
- std::vector<GlobalTypeMember *> Globals;
2347
- std::vector<ICallBranchFunnel *> ICallBranchFunnels;
2348
- for (auto M : GlobalClasses.members (*C)) {
2349
- if (isa<Metadata *>(M))
2350
- TypeIds.push_back (cast<Metadata *>(M));
2351
- else if (isa<GlobalTypeMember *>(M))
2352
- Globals.push_back (cast<GlobalTypeMember *>(M));
2353
- else
2354
- ICallBranchFunnels.push_back (cast<ICallBranchFunnel *>(M));
2355
- }
2342
+ // For each disjoint set we found...
2343
+ for (const auto &C : GlobalClasses) {
2344
+ if (!C->isLeader ())
2345
+ continue ;
2356
2346
2357
- // Order type identifiers by unique ID for determinism. This ordering is
2358
- // stable as there is a one-to-one mapping between metadata and unique
2359
- // IDs.
2360
- llvm::sort (TypeIds, [&](Metadata *M1, Metadata *M2) {
2361
- return TypeIdInfo[M1].UniqueId < TypeIdInfo[M2].UniqueId ;
2362
- });
2363
-
2364
- // Same for the branch funnels.
2365
- llvm::sort (ICallBranchFunnels,
2366
- [&](ICallBranchFunnel *F1, ICallBranchFunnel *F2) {
2367
- return F1->UniqueId < F2->UniqueId ;
2368
- });
2369
-
2370
- // Build bitsets for this disjoint set.
2371
- buildBitSetsFromDisjointSet (TypeIds, Globals, ICallBranchFunnels);
2347
+ ++NumTypeIdDisjointSets;
2348
+ // Build the list of type identifiers in this disjoint set.
2349
+ std::vector<Metadata *> TypeIds;
2350
+ std::vector<GlobalTypeMember *> Globals;
2351
+ std::vector<ICallBranchFunnel *> ICallBranchFunnels;
2352
+ for (auto M : GlobalClasses.members (*C)) {
2353
+ if (isa<Metadata *>(M))
2354
+ TypeIds.push_back (cast<Metadata *>(M));
2355
+ else if (isa<GlobalTypeMember *>(M))
2356
+ Globals.push_back (cast<GlobalTypeMember *>(M));
2357
+ else
2358
+ ICallBranchFunnels.push_back (cast<ICallBranchFunnel *>(M));
2372
2359
}
2360
+
2361
+ // Order type identifiers by unique ID for determinism. This ordering is
2362
+ // stable as there is a one-to-one mapping between metadata and unique IDs.
2363
+ llvm::sort (TypeIds, [&](Metadata *M1, Metadata *M2) {
2364
+ return TypeIdInfo[M1].UniqueId < TypeIdInfo[M2].UniqueId ;
2365
+ });
2366
+
2367
+ // Same for the branch funnels.
2368
+ llvm::sort (ICallBranchFunnels,
2369
+ [&](ICallBranchFunnel *F1, ICallBranchFunnel *F2) {
2370
+ return F1->UniqueId < F2->UniqueId ;
2371
+ });
2372
+
2373
+ // Build bitsets for this disjoint set.
2374
+ buildBitSetsFromDisjointSet (TypeIds, Globals, ICallBranchFunnels);
2373
2375
}
2374
2376
2375
2377
allocateByteArrays ();
0 commit comments