mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-29 11:17:28 +00:00
[LCG] Add aliased functions as LCG roots
Current LCG doesn't check aliased functions. So if an internal function has a public alias it will not be added to CG SCC, but it is still reachable from outside through the alias. So this patch adds aliased functions to SCC. Differential Revision: https://reviews.llvm.org/D59898 llvm-svn: 357795
This commit is contained in:
parent
19c44c5a00
commit
36fc9c3107
@ -172,6 +172,19 @@ LazyCallGraph::LazyCallGraph(Module &M, TargetLibraryInfo &TLI) {
|
||||
addEdge(EntryEdges.Edges, EntryEdges.EdgeIndexMap, get(F), Edge::Ref);
|
||||
}
|
||||
|
||||
// Externally visible aliases of internal functions are also viable entry
|
||||
// edges to the module.
|
||||
for (auto &A : M.aliases()) {
|
||||
if (A.hasLocalLinkage())
|
||||
continue;
|
||||
if (Function* F = dyn_cast<Function>(A.getAliasee())) {
|
||||
LLVM_DEBUG(dbgs() << " Adding '" << F->getName()
|
||||
<< "' with alias '" << A.getName()
|
||||
<< "' to entry set of the graph.\n");
|
||||
addEdge(EntryEdges.Edges, EntryEdges.EdgeIndexMap, get(*F), Edge::Ref);
|
||||
}
|
||||
}
|
||||
|
||||
// Now add entry nodes for functions reachable via initializers to globals.
|
||||
SmallVector<Constant *, 16> Worklist;
|
||||
SmallPtrSet<Constant *, 16> Visited;
|
||||
|
38
llvm/test/Analysis/LazyCallGraph/alias.ll
Normal file
38
llvm/test/Analysis/LazyCallGraph/alias.ll
Normal file
@ -0,0 +1,38 @@
|
||||
; RUN: opt -disable-output -passes=print-lcg %s 2>&1 | FileCheck %s
|
||||
;
|
||||
; Aliased function should be reachable in CGSCC.
|
||||
|
||||
target triple = "x86_64-grtev4-linux-gnu"
|
||||
|
||||
; CHECK: Edges in function: foo
|
||||
; CHECK: Edges in function: bar
|
||||
; CHECK: Edges in function: baz
|
||||
|
||||
; CHECK: RefSCC with 1 call SCCs:
|
||||
; CHECK-NEXT: SCC with 1 functions:
|
||||
; CHECK-NEXT: bar
|
||||
|
||||
; CHECK: RefSCC with 1 call SCCs:
|
||||
; CHECK-NEXT: SCC with 1 functions:
|
||||
; CHECK-NEXT: foo
|
||||
|
||||
; CHECK-NOT: baz
|
||||
|
||||
@alias1 = weak dso_local alias i8* (i8*), i8* (i8*)* @foo
|
||||
|
||||
define dso_local i8* @foo(i8* %returned) {
|
||||
ret i8* %returned
|
||||
}
|
||||
|
||||
@alias2 = weak dso_local alias i8* (i8*), i8* (i8*)* @bar
|
||||
|
||||
define internal i8* @bar(i8* %returned) {
|
||||
ret i8* %returned
|
||||
}
|
||||
|
||||
; Internal alias is not reachable.
|
||||
@alias3 = internal alias i8* (i8*), i8* (i8*)* @baz
|
||||
|
||||
define internal i8* @baz(i8* %returned) {
|
||||
ret i8* %returned
|
||||
}
|
Loading…
Reference in New Issue
Block a user