@@ -1669,55 +1669,61 @@ void LowerTypeTestsModule::buildBitSetsFromFunctionsNative(
16691669
16701670 lowerTypeTestCalls (TypeIds, JumpTable, GlobalLayout);
16711671
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);
16771674
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+ }
16951699
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+ }
17021706
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+ }
17211727 }
17221728 }
17231729
@@ -2333,43 +2339,39 @@ bool LowerTypeTestsModule::lower() {
23332339 if (GlobalClasses.empty ())
23342340 return false ;
23352341
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 ;
23562346
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));
23722359 }
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);
23732375 }
23742376
23752377 allocateByteArrays ();
0 commit comments