Skip to content

Commit 7ed04c3

Browse files
committed
libswift: add CalleeAnalysis
Bridging to BasicCalleeAnalysis
1 parent e096b2f commit 7ed04c3

File tree

6 files changed

+97
-1
lines changed

6 files changed

+97
-1
lines changed

include/swift/SILOptimizer/OptimizerBridging.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ typedef struct {
3333
const void * _Nonnull aliasAnalysis;
3434
} BridgedAliasAnalysis;
3535

36+
typedef struct {
37+
void * _Nullable bca;
38+
} BridgedCalleeAnalysis;
39+
40+
typedef struct {
41+
void * _Nonnull opaquePtr;
42+
unsigned char kind;
43+
unsigned char incomplete;
44+
} BridgedCalleeList;
45+
3646
typedef void (* _Nonnull BridgedFunctionPassRunFn)(BridgedFunctionPassCtxt);
3747
typedef void (* _Nonnull BridgedInstructionPassRunFn)(BridgedInstructionPassCtxt);
3848

@@ -49,6 +59,14 @@ BridgedMemoryBehavior AliasAnalysis_getMemBehavior(BridgedAliasAnalysis aa,
4959
BridgedInstruction inst,
5060
BridgedValue addr);
5161

62+
BridgedCalleeAnalysis PassContext_getCalleeAnalysis(BridgedPassContext context);
63+
64+
BridgedCalleeList CalleeAnalysis_getCallees(BridgedCalleeAnalysis calleeAnalysis,
65+
BridgedValue callee);
66+
SwiftInt BridgedFunctionArray_size(BridgedCalleeList callees);
67+
BridgedFunction BridgedFunctionArray_get(BridgedCalleeList callees,
68+
SwiftInt index);
69+
5270
#ifdef __cplusplus
5371
} // extern "C"
5472
#endif

lib/SILOptimizer/Analysis/BasicCalleeAnalysis.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
#include "swift/AST/ProtocolConformance.h"
1717
#include "swift/Basic/Statistic.h"
1818
#include "swift/SIL/SILModule.h"
19+
#include "swift/SIL/SILBridgingUtils.h"
20+
#include "swift/SILOptimizer/OptimizerBridging.h"
1921
#include "swift/SILOptimizer/Utils/InstOptUtils.h"
2022
#include "llvm/Support/Compiler.h"
2123

@@ -318,3 +320,29 @@ void BasicCalleeAnalysis::print(llvm::raw_ostream &os) const {
318320
}
319321
}
320322
}
323+
324+
//===----------------------------------------------------------------------===//
325+
// Swift Bridging
326+
//===----------------------------------------------------------------------===//
327+
328+
BridgedCalleeList CalleeAnalysis_getCallees(BridgedCalleeAnalysis calleeAnalysis,
329+
BridgedValue callee) {
330+
BasicCalleeAnalysis *bca = static_cast<BasicCalleeAnalysis *>(calleeAnalysis.bca);
331+
CalleeList cl = bca->getCalleeListOfValue(castToSILValue(callee));
332+
return {cl.getOpaquePtr(), cl.getOpaqueKind(), cl.isIncomplete()};
333+
}
334+
335+
SwiftInt BridgedFunctionArray_size(BridgedCalleeList callees) {
336+
CalleeList cl = CalleeList::fromOpaque(callees.opaquePtr, callees.kind,
337+
callees.incomplete);
338+
return cl.end() - cl.begin();
339+
}
340+
341+
BridgedFunction BridgedFunctionArray_get(BridgedCalleeList callees,
342+
SwiftInt index) {
343+
CalleeList cl = CalleeList::fromOpaque(callees.opaquePtr, callees.kind,
344+
callees.incomplete);
345+
auto iter = cl.begin() + index;
346+
assert(index >= 0 && iter < cl.end());
347+
return {*iter};
348+
}

lib/SILOptimizer/PassManager/PassManager.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1172,3 +1172,7 @@ BridgedAliasAnalysis PassContext_getAliasAnalysis(BridgedPassContext context,
11721172
return {pm->getAnalysis<AliasAnalysis>(castToFunction(function))};
11731173
}
11741174

1175+
BridgedCalleeAnalysis PassContext_getCalleeAnalysis(BridgedPassContext context) {
1176+
SILPassManager *pm = castToPassInvocation(context)->getPassManager();
1177+
return {pm->getAnalysis<BasicCalleeAnalysis>()};
1178+
}

libswift/Sources/Optimizer/Analysis/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@
77
# See http://swift.org/CONTRIBUTORS.txt for Swift project authors
88

99
libswift_sources(Optimizer
10-
AliasAnalysis.swift)
10+
AliasAnalysis.swift
11+
CalleeAnalysis.swift)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
//===--- CalleeAnalysis.swift - the callee analysis -----------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import OptimizerBridging
14+
import SIL
15+
16+
public struct CalleeAnalysis {
17+
let bridged: BridgedCalleeAnalysis
18+
19+
public func getCallees(callee: Value) -> FunctionArray {
20+
return FunctionArray(bridged: CalleeAnalysis_getCallees(bridged, callee.bridged))
21+
}
22+
}
23+
24+
public struct FunctionArray : RandomAccessCollection, CustomReflectable {
25+
fileprivate let bridged: BridgedCalleeList
26+
27+
public var startIndex: Int { 0 }
28+
public var endIndex: Int { BridgedFunctionArray_size(bridged) }
29+
30+
public subscript(_ index: Int) -> Function {
31+
return BridgedFunctionArray_get(bridged, index).function
32+
}
33+
34+
public var allCalleesKnown: Bool { bridged.incomplete == 0 }
35+
36+
public var customMirror: Mirror {
37+
let c: [Mirror.Child] = map { (label: nil, value: $0.name) }
38+
return Mirror(self, children: c)
39+
}
40+
}

libswift/Sources/Optimizer/PassManager/PassUtils.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ struct FunctionPassContext {
3535
let bridgedAA = PassContext_getAliasAnalysis(passContext, function.bridged)
3636
return AliasAnalysis(bridged: bridgedAA)
3737
}
38+
39+
var calleeAnalysis: CalleeAnalysis {
40+
let bridgeCA = PassContext_getCalleeAnalysis(passContext)
41+
return CalleeAnalysis(bridged: bridgeCA)
42+
}
3843
}
3944

4045
struct FunctionPass {

0 commit comments

Comments
 (0)