@@ -1669,61 +1669,55 @@ void LowerTypeTestsModule::buildBitSetsFromFunctionsNative(
1669
1669
1670
1670
lowerTypeTestCalls (TypeIds, JumpTable, GlobalLayout);
1671
1671
1672
- {
1673
- ScopedSaveAliaseesAndUsed S (M);
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 ();
1674
1677
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
- }
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
+ }
1699
1695
1700
- if (IsExported) {
1701
- if (IsJumpTableCanonical)
1702
- ExportSummary->cfiFunctionDefs ().emplace (F->getName ());
1703
- else
1704
- ExportSummary->cfiFunctionDecls ().emplace (F->getName ());
1705
- }
1696
+ if (IsExported) {
1697
+ if (IsJumpTableCanonical)
1698
+ ExportSummary->cfiFunctionDefs ().emplace (F->getName ());
1699
+ else
1700
+ ExportSummary->cfiFunctionDecls ().emplace (F->getName ());
1701
+ }
1706
1702
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
- }
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);
1727
1721
}
1728
1722
}
1729
1723
@@ -2339,39 +2333,43 @@ bool LowerTypeTestsModule::lower() {
2339
2333
if (GlobalClasses.empty ())
2340
2334
return false ;
2341
2335
2342
- // For each disjoint set we found...
2343
- for (const auto &C : GlobalClasses) {
2344
- if (!C->isLeader ())
2345
- continue ;
2346
-
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));
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
- });
2336
+ {
2337
+ ScopedSaveAliaseesAndUsed S (M);
2338
+ // For each disjoint set we found...
2339
+ for (const auto &C : GlobalClasses) {
2340
+ if (!C->isLeader ())
2341
+ continue ;
2366
2342
2367
- // Same for the branch funnels.
2368
- llvm::sort (ICallBranchFunnels,
2369
- [&](ICallBranchFunnel *F1, ICallBranchFunnel *F2) {
2370
- return F1->UniqueId < F2->UniqueId ;
2371
- });
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
+ }
2372
2356
2373
- // Build bitsets for this disjoint set.
2374
- buildBitSetsFromDisjointSet (TypeIds, Globals, ICallBranchFunnels);
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);
2372
+ }
2375
2373
}
2376
2374
2377
2375
allocateByteArrays ();
0 commit comments