@@ -1445,15 +1445,21 @@ namespace {
14451445 .withThrows (type->isThrowing ())
14461446 .withParameterFlags (hasParameterFlags)
14471447 .withEscaping (isEscaping)
1448- .withDifferentiable (type->isDifferentiable ());
1448+ .withDifferentiable (type->isDifferentiable ())
1449+ .withGlobalActor (!type->getGlobalActor ().isNull ());
14491450
14501451 auto flagsVal = llvm::ConstantInt::get (IGF.IGM .SizeTy ,
14511452 flags.getIntValue ());
14521453 llvm::Value *diffKindVal = nullptr ;
14531454 if (type->isDifferentiable ()) {
14541455 assert (metadataDifferentiabilityKind.isDifferentiable ());
1456+ // FIXME: Shouldn't this use metadataDifferentiabilityKind?
14551457 diffKindVal = llvm::ConstantInt::get (IGF.IGM .SizeTy ,
14561458 flags.getIntValue ());
1459+ } else if (type->getGlobalActor ()) {
1460+ diffKindVal = llvm::ConstantInt::get (
1461+ IGF.IGM .SizeTy ,
1462+ FunctionMetadataDifferentiabilityKind::NonDifferentiable);
14571463 }
14581464
14591465 auto collectParameters =
@@ -1507,56 +1513,65 @@ namespace {
15071513 case 1 :
15081514 case 2 :
15091515 case 3 : {
1510- if (!hasParameterFlags && !type->isDifferentiable ()) {
1516+ if (!hasParameterFlags && !type->isDifferentiable () &&
1517+ !type->getGlobalActor ()) {
15111518 llvm::SmallVector<llvm::Value *, 8 > arguments;
15121519 auto *metadataFn = constructSimpleCall (arguments);
15131520 auto *call = IGF.Builder .CreateCall (metadataFn, arguments);
15141521 call->setDoesNotThrow ();
15151522 return setLocal (CanType (type), MetadataResponse::forComplete (call));
15161523 }
15171524
1518- // If function type has parameter flags or is differentiable, let's emit
1519- // the most general function to retrieve them.
1525+ // If function type has parameter flags or is differentiable or has a
1526+ // global actor, emit the most general function to retrieve them.
15201527 LLVM_FALLTHROUGH;
15211528 }
15221529
15231530 default :
1524- assert (!params.empty () || type->isDifferentiable () &&
1531+ assert ((!params.empty () || type->isDifferentiable () ||
1532+ type->getGlobalActor ()) &&
15251533 " 0 parameter case should be specialized unless it is a "
1526- " differentiable function" );
1534+ " differentiable function or has a global actor " );
15271535
15281536 auto *const Int32Ptr = IGF.IGM .Int32Ty ->getPointerTo ();
15291537 llvm::SmallVector<llvm::Value *, 8 > arguments;
15301538
15311539 arguments.push_back (flagsVal);
15321540
1533- if (type->isDifferentiable ()) {
1534- assert (diffKindVal);
1541+ if (diffKindVal) {
15351542 arguments.push_back (diffKindVal);
15361543 }
15371544
15381545 ConstantInitBuilder paramFlags (IGF.IGM );
15391546 auto flagsArr = paramFlags.beginArray ();
15401547
1541- auto arrayTy =
1542- llvm::ArrayType::get (IGF.IGM .TypeMetadataPtrTy , numParams);
1543- Address parameters = IGF.createAlloca (
1544- arrayTy, IGF.IGM .getTypeMetadataAlignment (), " function-parameters" );
1545-
1546- IGF.Builder .CreateLifetimeStart (parameters,
1547- IGF.IGM .getPointerSize () * numParams);
1548-
1549- collectParameters ([&](unsigned i, llvm::Value *typeRef,
1550- ParameterFlags flags) {
1551- auto argPtr = IGF.Builder .CreateStructGEP (parameters, i,
1552- IGF.IGM .getPointerSize ());
1553- IGF.Builder .CreateStore (typeRef, argPtr);
1554- if (i == 0 )
1555- arguments.push_back (argPtr.getAddress ());
1556-
1557- if (hasParameterFlags)
1558- flagsArr.addInt32 (flags.getIntValue ());
1559- });
1548+ Address parameters;
1549+ if (!params.empty ()) {
1550+ auto arrayTy =
1551+ llvm::ArrayType::get (IGF.IGM .TypeMetadataPtrTy , numParams);
1552+ parameters = IGF.createAlloca (
1553+ arrayTy, IGF.IGM .getTypeMetadataAlignment (), " function-parameters" );
1554+
1555+ IGF.Builder .CreateLifetimeStart (parameters,
1556+ IGF.IGM .getPointerSize () * numParams);
1557+
1558+ collectParameters ([&](unsigned i, llvm::Value *typeRef,
1559+ ParameterFlags flags) {
1560+ auto argPtr = IGF.Builder .CreateStructGEP (parameters, i,
1561+ IGF.IGM .getPointerSize ());
1562+ IGF.Builder .CreateStore (typeRef, argPtr);
1563+ if (i == 0 )
1564+ arguments.push_back (argPtr.getAddress ());
1565+
1566+ if (hasParameterFlags)
1567+ flagsArr.addInt32 (flags.getIntValue ());
1568+ });
1569+ } else {
1570+ auto parametersPtr =
1571+ llvm::ConstantPointerNull::get (
1572+ IGF.IGM .TypeMetadataPtrTy ->getPointerTo ());
1573+ arguments.push_back (parametersPtr);
1574+ }
15601575
15611576 if (hasParameterFlags) {
15621577 auto *flagsVar = flagsArr.finishAndCreateGlobal (
@@ -1570,9 +1585,16 @@ namespace {
15701585
15711586 arguments.push_back (result);
15721587
1573- auto *getMetadataFn = type->isDifferentiable ()
1574- ? IGF.IGM .getGetFunctionMetadataDifferentiableFn ()
1575- : IGF.IGM .getGetFunctionMetadataFn ();
1588+ if (Type globalActor = type->getGlobalActor ()) {
1589+ arguments.push_back (
1590+ IGF.emitAbstractTypeMetadataRef (globalActor->getCanonicalType ()));
1591+ }
1592+
1593+ auto *getMetadataFn = type->getGlobalActor ()
1594+ ? IGF.IGM .getGetFunctionMetadataGlobalActorFn ()
1595+ : type->isDifferentiable ()
1596+ ? IGF.IGM .getGetFunctionMetadataDifferentiableFn ()
1597+ : IGF.IGM .getGetFunctionMetadataFn ();
15761598
15771599 auto call = IGF.Builder .CreateCall (getMetadataFn, arguments);
15781600 call->setDoesNotThrow ();
0 commit comments