Skip to content

Commit e0ead75

Browse files
committed
[CoroutineAccessors] Use typed-malloc.
1 parent 66c001e commit e0ead75

File tree

14 files changed

+152
-79
lines changed

14 files changed

+152
-79
lines changed

include/swift/ABI/Coro.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ enum class CoroAllocatorKind : uint8_t {
3030
Async = 1,
3131
// malloc/free
3232
Malloc = 2,
33+
// swift_coroFrameAlloc/free
34+
TypedMalloc = 3,
3335
};
3436

3537
class CoroAllocatorFlags : public FlagSet<uint32_t> {

lib/IRGen/GenCall.cpp

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,11 @@ IRGenFunction::getDefaultCoroutineAllocatorKind() {
221221
return CoroAllocatorKind::Async;
222222
}
223223
if (isCoroutine()) {
224-
return CoroAllocatorKind::Malloc;
224+
if (getOptions().EmitTypeMallocForCoroFrame) {
225+
return CoroAllocatorKind::TypedMalloc;
226+
} else {
227+
return CoroAllocatorKind::Malloc;
228+
}
225229
}
226230
if (IGM.SwiftCoroCC != llvm::CallingConv::SwiftCoro) {
227231
// If the swiftcorocc isn't available, fall back to malloc.
@@ -2707,17 +2711,14 @@ irgen::getAsyncFunctionAndSize(IRGenFunction &IGF,
27072711
return {fn, size};
27082712
}
27092713

2710-
std::pair<llvm::Value *, llvm::Value *>
2711-
irgen::getCoroFunctionAndSize(IRGenFunction &IGF,
2712-
FunctionPointer functionPointer,
2713-
std::pair<bool, bool> values) {
2714-
assert(values.first || values.second);
2714+
std::tuple<llvm::Value *, llvm::Value *, llvm::Value *>
2715+
irgen::getCoroFunctionValues(IRGenFunction &IGF,
2716+
FunctionPointer functionPointer,
2717+
std::tuple<bool, bool, bool> values) {
2718+
auto [emitFunction, emitSize, emitTypeID] = values;
2719+
assert(emitFunction || emitSize || emitTypeID);
27152720
assert(functionPointer.getKind() != FunctionPointer::Kind::Function);
27162721

2717-
bool emitFunction = values.first;
2718-
bool emitSize = values.second;
2719-
assert(emitFunction || emitSize);
2720-
27212722
// Ensure that the CoroFunctionPointer is not auth'd if it is not used and
27222723
// that it is not auth'd more than once if it is needed.
27232724
//
@@ -2770,7 +2771,15 @@ irgen::getCoroFunctionAndSize(IRGenFunction &IGF,
27702771
size = IGF.Builder.CreateLoad(sizePtr, IGF.IGM.Int32Ty,
27712772
IGF.IGM.getPointerAlignment());
27722773
}
2773-
return {fn, size};
2774+
2775+
llvm::Value *typeID = nullptr;
2776+
if (emitTypeID) {
2777+
auto *sizePtr = IGF.Builder.CreateStructGEP(IGF.IGM.CoroFunctionPointerTy,
2778+
getCoroPtr(), 2);
2779+
typeID = IGF.Builder.CreateLoad(sizePtr, IGF.IGM.Int64Ty,
2780+
IGF.IGM.getPointerAlignment());
2781+
}
2782+
return {fn, size, typeID};
27742783
}
27752784

27762785
namespace {
@@ -2810,16 +2819,17 @@ class SyncCallEmission final : public CallEmission {
28102819
assert(!coroAllocator);
28112820

28122821
if (IsCalleeAllocatedCoroutine) {
2813-
llvm::Value *bufferSize32;
2814-
std::tie(calleeFunction, bufferSize32) =
2815-
getCoroFunctionAndSize(IGF, CurCallee.getFunctionPointer());
2822+
auto kind = IGF.getDefaultCoroutineAllocatorKind();
2823+
llvm::Value *bufferSize32, *mallocTypeId;
2824+
std::tie(calleeFunction, bufferSize32, mallocTypeId) =
2825+
getCoroFunctionValues(IGF, CurCallee.getFunctionPointer());
28162826
auto *bufferSize = IGF.Builder.CreateZExt(bufferSize32, IGF.IGM.SizeTy);
2817-
coroStaticFrame = emitAllocYieldOnce2CoroutineFrame(IGF, bufferSize);
2827+
coroStaticFrame =
2828+
emitAllocYieldOnce2CoroutineFrame(IGF, bufferSize, mallocTypeId);
28182829
// TODO: CoroutineAccessors: Optimize allocator kind (e.g. async callers
28192830
// only need to use the TaskAllocator if the
28202831
// coroutine is suspended across an await).
2821-
coroAllocator = emitYieldOnce2CoroutineAllocator(
2822-
IGF, IGF.getDefaultCoroutineAllocatorKind());
2832+
coroAllocator = emitYieldOnce2CoroutineAllocator(IGF, kind);
28232833
}
28242834
}
28252835
void end() override { super::end(); }
@@ -5185,10 +5195,12 @@ void irgen::emitYieldOnce2CoroutineEntry(IRGenFunction &IGF,
51855195
auto deallocFn = IGF.IGM.getOpaquePtr(getCoroDeallocFn(IGF.IGM));
51865196
auto allocFrameFn = IGF.IGM.getOpaquePtr(getCoroAllocFrameFn(IGF.IGM));
51875197
auto deallocFrameFn = IGF.IGM.getOpaquePtr(getCoroDeallocFrameFn(IGF.IGM));
5198+
auto *typeID = IGF.getMallocTypeId();
51885199
emitRetconCoroutineEntry(
51895200
IGF, fnType, buffer, llvm::Intrinsic::coro_id_retcon_once_dynamic,
51905201
Size(-1) /*dynamic-to-IRGen size*/, IGF.IGM.getCoroStaticFrameAlignment(),
5191-
{cfp, allocator}, allocFn, deallocFn, {allocFrameFn, deallocFrameFn});
5202+
{cfp, allocator}, allocFn, deallocFn,
5203+
{allocFrameFn, deallocFrameFn, typeID});
51925204
}
51935205
void irgen::emitYieldOnce2CoroutineEntry(
51945206
IRGenFunction &IGF, LinkEntity coroFunction, CanSILFunctionType fnType,
@@ -5219,9 +5231,10 @@ Address irgen::emitAllocYieldManyCoroutineBuffer(IRGenFunction &IGF) {
52195231
getYieldManyCoroutineBufferAlignment(IGF.IGM));
52205232
}
52215233

5222-
StackAddress irgen::emitAllocYieldOnce2CoroutineFrame(IRGenFunction &IGF,
5223-
llvm::Value *size) {
5224-
return emitAllocCoroStaticFrame(IGF, size);
5234+
StackAddress
5235+
irgen::emitAllocYieldOnce2CoroutineFrame(IRGenFunction &IGF, llvm::Value *size,
5236+
llvm::Value *mallocTypeId) {
5237+
return emitAllocCoroStaticFrame(IGF, size, mallocTypeId);
52255238
}
52265239

52275240
void irgen::emitDeallocYieldOnceCoroutineBuffer(IRGenFunction &IGF,
@@ -5270,14 +5283,15 @@ void irgen::emitStaticDeallocAsyncContext(IRGenFunction &IGF, Address context,
52705283
}
52715284

52725285
StackAddress irgen::emitAllocCoroStaticFrame(IRGenFunction &IGF,
5273-
llvm::Value *size) {
5286+
llvm::Value *size,
5287+
llvm::Value *mallocTypeId) {
5288+
ASSERT(mallocTypeId);
52745289
// TODO: Avoid swift_task_alloc (async) and malloc (yield_once) if the
52755290
// suspension doesn't span an apply of an async function or a yield
52765291
// respectively.
5277-
auto retval = IGF.emitDynamicAlloca(
5278-
IGF.IGM.Int8Ty, size, Alignment(MaximumAlignment), AllowsTaskAlloc,
5279-
IsForCalleeCoroutineFrame_t(IGF.isCalleeAllocatedCoroutine()),
5280-
"callee-coro-frame");
5292+
auto retval =
5293+
IGF.emitDynamicAlloca(IGF.IGM.Int8Ty, size, Alignment(MaximumAlignment),
5294+
AllowsTaskAlloc, mallocTypeId, "callee-coro-frame");
52815295
IGF.Builder.CreateLifetimeStart(retval.getAddress(),
52825296
Size(-1) /*dynamic size*/);
52835297
return retval;

lib/IRGen/GenCall.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,9 @@ namespace irgen {
143143
std::pair<llvm::Value *, llvm::Value *>
144144
getAsyncFunctionAndSize(IRGenFunction &IGF, FunctionPointer functionPointer,
145145
std::pair<bool, bool> values = {true, true});
146-
std::pair<llvm::Value *, llvm::Value *>
147-
getCoroFunctionAndSize(IRGenFunction &IGF, FunctionPointer functionPointer,
148-
std::pair<bool, bool> values = {true, true});
146+
std::tuple<llvm::Value *, llvm::Value *, llvm::Value *> getCoroFunctionValues(
147+
IRGenFunction &IGF, FunctionPointer functionPointer,
148+
std::tuple<bool, bool, bool> values = {true, true, true});
149149
llvm::CallingConv::ID
150150
expandCallingConv(IRGenModule &IGM, SILFunctionTypeRepresentation convention,
151151
bool isAsync, bool isCalleeAllocatedCoro);
@@ -221,7 +221,8 @@ namespace irgen {
221221
NativeCCEntryPointArgumentEmission &emission);
222222

223223
StackAddress emitAllocYieldOnce2CoroutineFrame(IRGenFunction &IGF,
224-
llvm::Value *size);
224+
llvm::Value *size,
225+
llvm::Value *mallocTypeId);
225226
void emitDeallocYieldOnce2CoroutineFrame(IRGenFunction &IGF,
226227
StackAddress allocation);
227228
void
@@ -252,7 +253,8 @@ namespace irgen {
252253
LinkEntity asyncFunction,
253254
unsigned asyncContextIndex);
254255

255-
StackAddress emitAllocCoroStaticFrame(IRGenFunction &IGF, llvm::Value *size);
256+
StackAddress emitAllocCoroStaticFrame(IRGenFunction &IGF, llvm::Value *size,
257+
llvm::Value *mallocTypeId);
256258
void emitDeallocCoroStaticFrame(IRGenFunction &IGF, StackAddress frame);
257259

258260
/// Yield the given values from the current continuation.

lib/IRGen/GenCoro.cpp

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "ConstantBuilder.h"
2222
#include "Explosion.h"
2323
#include "GenCoro.h"
24+
#include "GenFunc.h"
2425
#include "GenPointerAuth.h"
2526
#include "IRGenFunction.h"
2627
#include "IRGenModule.h"
@@ -664,6 +665,18 @@ struct Allocator {
664665
constexpr Field(Kind kind) : kind(kind) {}
665666
constexpr operator Kind() { return kind; }
666667

668+
bool isAllocateFunction() const {
669+
switch (kind) {
670+
case Flags:
671+
case Field::Deallocate:
672+
case Field::DeallocateFrame:
673+
return false;
674+
case Field::Allocate:
675+
case Field::AllocateFrame:
676+
return true;
677+
}
678+
}
679+
667680
llvm::Type *getType(IRGenModule &IGM) {
668681
switch (kind) {
669682
case Flags:
@@ -886,7 +899,7 @@ struct Allocator {
886899
llvm::Constant *getCoroAllocFn(AllocationKind kind, IRGenModule &IGM) {
887900
return IGM.getOrCreateHelperFunction(
888901
kind.getAllocationFunctionName(), IGM.CoroAllocationTy,
889-
{IGM.CoroAllocatorPtrTy, IGM.CoroAllocationTy, IGM.SizeTy},
902+
{IGM.CoroAllocatorPtrTy, IGM.CoroAllocationTy, IGM.SizeTy, IGM.Int64Ty},
890903
[kind](IRGenFunction &IGF) {
891904
auto isSwiftCoroCCAvailable =
892905
IGF.IGM.SwiftCoroCC == llvm::CallingConv::SwiftCoro;
@@ -895,6 +908,7 @@ llvm::Constant *getCoroAllocFn(AllocationKind kind, IRGenModule &IGM) {
895908
auto *allocatorValue = parameters.claimNext();
896909
auto allocator = Allocator(allocatorValue, IGF);
897910
auto *size = parameters.claimNext();
911+
auto *typeID = parameters.claimNext();
898912
if (isSwiftCoroCCAvailable) {
899913
// swiftcorocc is available, so if there's no allocator pointer,
900914
// allocate storage on the stack and return a pointer to it without
@@ -912,7 +926,8 @@ llvm::Constant *getCoroAllocFn(AllocationKind kind, IRGenModule &IGM) {
912926
});
913927
}
914928
auto fnPtr = allocator.getAllocate(kind);
915-
auto *call = IGF.Builder.CreateCall(fnPtr, {frame, allocatorValue, size});
929+
auto *call = IGF.Builder.CreateCall(
930+
fnPtr, {frame, allocatorValue, size, typeID});
916931
call->setDoesNotThrow();
917932
call->setCallingConv(IGF.IGM.SwiftCC);
918933
IGF.Builder.CreateRet(call);
@@ -1005,19 +1020,22 @@ llvm::Constant *swift::irgen::getCoroDeallocFrameFn(IRGenModule &IGM) {
10051020
static llvm::Constant *getAddrOfSwiftCoroAllocatorThunk(
10061021
StringRef name, Allocator::Field field, IRGenModule &IGM,
10071022
llvm::function_ref<llvm::Value *(IRGenFunction &, llvm::Value *,
1008-
llvm::Value *, llvm::Value *)>
1023+
llvm::Value *, llvm::Value *,
1024+
llvm::Value *)>
10091025
builder) {
10101026
auto *ty = field.getFunctionType(IGM);
10111027
return IGM.getOrCreateHelperFunction(
10121028
name, ty->getReturnType(), ty->params(),
1013-
[builder, ty](IRGenFunction &IGF) {
1029+
[builder, field](IRGenFunction &IGF) {
10141030
auto parameters = IGF.collectParameters();
10151031
auto *frame = parameters.claimNext();
10161032
auto *allocator = parameters.claimNext();
10171033
// allocate - size; deallocate - address
10181034
auto *value = parameters.claimNext();
1019-
auto *result = builder(IGF, frame, allocator, value);
1020-
if (!ty->getReturnType()->isVoidTy()) {
1035+
auto *typeID =
1036+
field.isAllocateFunction() ? parameters.claimNext() : nullptr;
1037+
auto *result = builder(IGF, frame, allocator, value, typeID);
1038+
if (field.isAllocateFunction()) {
10211039
IGF.Builder.CreateRet(result);
10221040
} else {
10231041
IGF.Builder.CreateRetVoid();
@@ -1041,8 +1059,8 @@ getAddrOfSwiftCoroAllocatorThunk(StringRef name, Allocator::Field field,
10411059
IRGenModule &IGM) {
10421060
return getAddrOfSwiftCoroAllocatorThunk(
10431061
name, field, IGM,
1044-
[getCator](IRGenFunction &IGF, auto *frame, auto *allocator,
1045-
auto *value) {
1062+
[getCator](IRGenFunction &IGF, auto *frame, auto *allocator, auto *value,
1063+
auto *typeID) {
10461064
auto alloc = (IGF.IGM.*getCator)();
10471065
auto *call = IGF.Builder.CreateCall(alloc, {value});
10481066
return call;
@@ -1108,6 +1126,24 @@ llvm::Constant *IRGenModule::getAddrOfGlobalCoroMallocAllocator() {
11081126
getAddrOfSwiftCoroFree(*this));
11091127
}
11101128

1129+
static llvm::Constant *getAddrOfSwiftCoroTypedMalloc(IRGenModule &IGM) {
1130+
return getAddrOfSwiftCoroAllocatorThunk(
1131+
"_swift_coro_typed_malloc", Allocator::Field::Allocate, IGM,
1132+
[](IRGenFunction &IGF, auto *frame, auto *allocator, auto *size,
1133+
auto *typeID) {
1134+
auto callee = getCoroFrameAllocStubFunctionPointer(IGF.IGM);
1135+
auto *allocation = IGF.Builder.CreateCall(callee, {size, typeID});
1136+
return allocation;
1137+
});
1138+
}
1139+
1140+
llvm::Constant *IRGenModule::getAddrOfGlobalCoroTypedMallocAllocator() {
1141+
return getAddrOfGlobalCoroAllocator(*this, CoroAllocatorKind::TypedMalloc,
1142+
/*shouldDeallocateImmediately=*/true,
1143+
getAddrOfSwiftCoroTypedMalloc(*this),
1144+
getAddrOfSwiftCoroFree(*this));
1145+
}
1146+
11111147
static llvm::Constant *
11121148
getAddrOfSwiftCoroTaskAlloc(IRGenModule &IGM) {
11131149
return getAddrOfSwiftCoroAllocatorThunk(
@@ -1142,6 +1178,8 @@ irgen::emitYieldOnce2CoroutineAllocator(IRGenFunction &IGF,
11421178
return IGF.IGM.getAddrOfGlobalCoroAsyncTaskAllocator();
11431179
case CoroAllocatorKind::Malloc:
11441180
return IGF.IGM.getAddrOfGlobalCoroMallocAllocator();
1181+
case CoroAllocatorKind::TypedMalloc:
1182+
return IGF.IGM.getAddrOfGlobalCoroTypedMallocAllocator();
11451183
}
11461184
llvm_unreachable("unhandled case");
11471185
}

lib/IRGen/GenMeta.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7677,6 +7677,9 @@ llvm::GlobalValue *irgen::emitCoroFunctionPointer(IRGenModule &IGM,
76777677
initBuilder.beginStruct(IGM.CoroFunctionPointerTy));
76787678
builder.addCompactFunctionReference(function);
76797679
builder.addInt32(size.getValue());
7680+
auto *typeId = IGM.getMallocTypeId(function);
7681+
ASSERT(typeId->getIntegerType() == IGM.Int64Ty);
7682+
builder.addInt64(typeId->getLimitedValue());
76807683
return cast<llvm::GlobalValue>(
76817684
IGM.defineCoroFunctionPointer(entity, builder.finishAndCreateFuture()));
76827685
}

lib/IRGen/GenOpaque.cpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -560,14 +560,15 @@ StackAddress IRGenFunction::emitDynamicAlloca(SILType T,
560560
const llvm::Twine &name) {
561561
llvm::Value *size = emitLoadOfSize(*this, T);
562562
return emitDynamicAlloca(IGM.Int8Ty, size, Alignment(16), AllowsTaskAlloc,
563-
IsNotForCalleeCoroutineFrame, name);
563+
/*mallocTypeId=*/nullptr, name);
564564
}
565565

566-
StackAddress IRGenFunction::emitDynamicAlloca(
567-
llvm::Type *eltTy, llvm::Value *arraySize, Alignment align,
568-
AllowsTaskAlloc_t allowTaskAlloc,
569-
IsForCalleeCoroutineFrame_t forCalleeCoroutineFrame,
570-
const llvm::Twine &name) {
566+
StackAddress IRGenFunction::emitDynamicAlloca(llvm::Type *eltTy,
567+
llvm::Value *arraySize,
568+
Alignment align,
569+
AllowsTaskAlloc_t allowTaskAlloc,
570+
llvm::Value *mallocTypeId,
571+
const llvm::Twine &name) {
571572
// Async functions call task alloc.
572573
if (allowTaskAlloc && isAsync()) {
573574
llvm::Value *byteCount;
@@ -601,10 +602,14 @@ StackAddress IRGenFunction::emitDynamicAlloca(
601602
auto alignment = llvm::ConstantInt::get(IGM.Int32Ty, align.getValue());
602603

603604
// Allocate memory. This produces an abstract token.
605+
llvm::SmallVector<llvm::Value *, 4> args = {byteCount, alignment};
606+
if (mallocTypeId) {
607+
args.push_back(mallocTypeId);
608+
}
604609
auto *allocToken = Builder.CreateIntrinsicCall(
605-
forCalleeCoroutineFrame ? llvm::Intrinsic::coro_alloca_alloc_frame
606-
: llvm::Intrinsic::coro_alloca_alloc,
607-
{IGM.SizeTy}, {byteCount, alignment});
610+
mallocTypeId ? llvm::Intrinsic::coro_alloca_alloc_frame
611+
: llvm::Intrinsic::coro_alloca_alloc,
612+
{IGM.SizeTy}, args);
608613

609614
// Get the allocation result.
610615
auto ptr = Builder.CreateIntrinsicCall(llvm::Intrinsic::coro_alloca_get,

lib/IRGen/IRGenFunction.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,6 @@ enum AllowsTaskAlloc_t : bool {
7171
AllowsTaskAlloc = true,
7272
};
7373

74-
enum IsForCalleeCoroutineFrame_t : bool {
75-
IsNotForCalleeCoroutineFrame,
76-
IsForCalleeCoroutineFrame,
77-
};
78-
7974
/// IRGenFunction - Primary class for emitting LLVM instructions for a
8075
/// specific function.
8176
class IRGenFunction {
@@ -315,8 +310,7 @@ class IRGenFunction {
315310
StackAddress
316311
emitDynamicAlloca(llvm::Type *eltTy, llvm::Value *arraySize, Alignment align,
317312
AllowsTaskAlloc_t allowTaskAlloc = AllowsTaskAlloc,
318-
IsForCalleeCoroutineFrame_t forCalleeCoroutineFrame =
319-
IsNotForCalleeCoroutineFrame,
313+
llvm::Value *mallocTypeId = nullptr,
320314
const llvm::Twine &name = "");
321315
void emitDeallocateDynamicAlloca(StackAddress address,
322316
bool allowTaskDealloc = true,

lib/IRGen/IRGenModule.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -771,10 +771,12 @@ IRGenModule::IRGenModule(IRGenerator &irgen,
771771
DifferentiabilityWitnessTy = createStructType(
772772
*this, "swift.differentiability_witness", {Int8PtrTy, Int8PtrTy});
773773

774-
CoroFunctionPointerTy = createStructType(*this, "swift.coro_func_pointer",
775-
{RelativeAddressTy, Int32Ty}, true);
774+
CoroFunctionPointerTy =
775+
createStructType(*this, "swift.coro_func_pointer",
776+
{RelativeAddressTy, Int32Ty, Int64Ty}, true);
776777
CoroAllocateFnTy = llvm::FunctionType::get(
777-
CoroAllocationTy, {CoroAllocationTy, CoroAllocatorPtrTy, SizeTy}, /*isVarArg*/ false);
778+
CoroAllocationTy, {CoroAllocationTy, CoroAllocatorPtrTy, SizeTy, Int64Ty},
779+
/*isVarArg*/ false);
778780
CoroDeallocateFnTy = llvm::FunctionType::get(
779781
VoidTy, {CoroAllocationTy, CoroAllocatorPtrTy, CoroAllocationTy}, /*isVarArg*/ false);
780782
CoroAllocatorFlagsTy = Int32Ty;

lib/IRGen/IRGenModule.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -882,7 +882,7 @@ class IRGenModule {
882882
llvm::StructType *DifferentiabilityWitnessTy; // { i8*, i8* }
883883
// clang-format on
884884

885-
llvm::StructType *CoroFunctionPointerTy; // { i32, i32 }
885+
llvm::StructType *CoroFunctionPointerTy; // { i32, i32, i64 }
886886
llvm::FunctionType *CoroAllocateFnTy;
887887
llvm::FunctionType *CoroDeallocateFnTy;
888888
llvm::IntegerType *CoroAllocatorFlagsTy;
@@ -1736,6 +1736,7 @@ private: \
17361736
SILFunction *getSILFunctionForCoroFunctionPointer(llvm::Constant *cfp);
17371737

17381738
llvm::Constant *getAddrOfGlobalCoroMallocAllocator();
1739+
llvm::Constant *getAddrOfGlobalCoroTypedMallocAllocator();
17391740
llvm::Constant *getAddrOfGlobalCoroAsyncTaskAllocator();
17401741

17411742
llvm::Function *getAddrOfDispatchThunk(SILDeclRef declRef,

0 commit comments

Comments
 (0)