diff options
| author | Yong He <yonghe@outlook.com> | 2023-12-06 12:05:07 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-12-06 12:05:07 -0800 |
| commit | 11111e5733b189127dc2c4934d67693b9bc6e764 (patch) | |
| tree | 0ba84df3e856eb104abec2ecac47242bc70a7b7d /source/slang/slang-lower-to-ir.cpp | |
| parent | fa6d8717d02912697c09f2d7de802723ac6d6e47 (diff) | |
Support visibility control and default to `internal`. (#3380)
* Support visibility control and default to `internal`.
* Fix wip.
* Fixes.
* Fix.
* Fix test.
* Add legacy language detection and compatibility for existing code.
* Add doc.
---------
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-lower-to-ir.cpp')
| -rw-r--r-- | source/slang/slang-lower-to-ir.cpp | 41 |
1 files changed, 20 insertions, 21 deletions
diff --git a/source/slang/slang-lower-to-ir.cpp b/source/slang/slang-lower-to-ir.cpp index 609a5d1e5..8f94b7e90 100644 --- a/source/slang/slang-lower-to-ir.cpp +++ b/source/slang/slang-lower-to-ir.cpp @@ -1327,7 +1327,6 @@ static void addLinkageDecoration( if (as<PublicModifier>(modifier)) { builder->addPublicDecoration(inst); - builder->addKeepAliveDecoration(inst); } else if (as<HLSLExportModifier>(modifier)) { @@ -1349,43 +1348,50 @@ static void addLinkageDecoration( else if (as<DllExportAttribute>(modifier)) { builder->addDllExportDecoration(inst, decl->getName()->text.getUnownedSlice()); - builder->addPublicDecoration(inst); + builder->addHLSLExportDecoration(inst); + builder->addKeepAliveDecoration(inst); } else if (as<CudaDeviceExportAttribute>(modifier)) { builder->addCudaDeviceExportDecoration(inst, decl->getName()->text.getUnownedSlice()); - builder->addPublicDecoration(inst); + builder->addHLSLExportDecoration(inst); builder->addExternCppDecoration(inst, decl->getName()->text.getUnownedSlice()); + builder->addKeepAliveDecoration(inst); } else if (as<CudaHostAttribute>(modifier)) { builder->addCudaHostDecoration(inst); builder->addExternCppDecoration(inst, decl->getName()->text.getUnownedSlice()); + builder->addKeepAliveDecoration(inst); } else if (as<CudaKernelAttribute>(modifier)) { builder->addCudaKernelDecoration(inst); builder->addExternCppDecoration(inst, decl->getName()->text.getUnownedSlice()); - builder->addPublicDecoration(inst); + builder->addHLSLExportDecoration(inst); builder->addKeepAliveDecoration(inst); } else if (as<TorchEntryPointAttribute>(modifier)) { builder->addTorchEntryPointDecoration(inst, decl->getName()->text.getUnownedSlice()); builder->addCudaHostDecoration(inst); - builder->addPublicDecoration(inst); + builder->addHLSLExportDecoration(inst); + builder->addKeepAliveDecoration(inst); builder->addExternCppDecoration(inst, decl->getName()->text.getUnownedSlice()); } else if (as<AutoPyBindCudaAttribute>(modifier)) { builder->addAutoPyBindCudaDecoration(inst, decl->getName()->text.getUnownedSlice()); builder->addAutoPyBindExportInfoDecoration(inst); + builder->addKeepAliveDecoration(inst); + builder->addHLSLExportDecoration(inst); } else if (auto pyExportModifier = as<PyExportAttribute>(modifier)) { builder->addPyExportDecoration(inst, pyExportModifier->name.getLength() ? pyExportModifier->name.getUnownedSlice() : decl->getName()->text.getUnownedSlice()); + builder->addHLSLExportDecoration(inst); } else if (auto knownBuiltinModifier = as<KnownBuiltinAttribute>(modifier)) { @@ -7012,15 +7018,11 @@ struct DeclLoweringVisitor : DeclVisitor<DeclLoweringVisitor, LoweredValInfo> return LoweredValInfo::simple(inst); } - bool isPublicType(Type* type) + bool isExportedType(Type* type) { - // TODO(JS): - // Not clear how should handle HLSLExportModifier here. - // In the HLSL spec 'export' is only applicable to functions. So for now we ignore. - if (auto declRefType = as<DeclRefType>(type)) { - if (declRefType->getDeclRef().getDecl()->findModifier<PublicModifier>()) + if (declRefType->getDeclRef().getDecl()->findModifier<HLSLExportModifier>()) return true; } return false; @@ -7077,9 +7079,9 @@ struct DeclLoweringVisitor : DeclVisitor<DeclLoweringVisitor, LoweredValInfo> astReqWitnessTable->witnessedType, astReqWitnessTable->baseType); subBuilder->addExportDecoration(irSatisfyingWitnessTable, mangledName.getUnownedSlice()); - if (isPublicType(astReqWitnessTable->witnessedType)) + if (isExportedType(astReqWitnessTable->witnessedType)) { - subBuilder->addPublicDecoration(irSatisfyingWitnessTable); + subBuilder->addHLSLExportDecoration(irSatisfyingWitnessTable); subBuilder->addKeepAliveDecoration(irSatisfyingWitnessTable); } @@ -7219,17 +7221,12 @@ struct DeclLoweringVisitor : DeclVisitor<DeclLoweringVisitor, LoweredValInfo> subBuilder->addPublicDecoration(irWitnessTable); } - // TODO(JS): - // Not clear what to do here around HLSLExportModifier. - // In HLSL it only (currently) applies to functions, so perhaps do nothing is reasonable. - - if (parentDecl->findModifier<PublicModifier>()) + if (parentDecl->findModifier<HLSLExportModifier>()) { - subBuilder->addPublicDecoration(irWitnessTable); + subBuilder->addHLSLExportDecoration(irWitnessTable); subBuilder->addKeepAliveDecoration(irWitnessTable); } - // Make sure that all the entries in the witness table have been filled in, // including any cases where there are sub-witness-tables for conformances Dictionary<WitnessTable*, IRWitnessTable*> mapASTToIRWitnessTable; @@ -10607,7 +10604,9 @@ struct TypeConformanceIRGenContext context->irBuilder = builder; auto witness = lowerSimpleVal(context, typeConformance->getSubtypeWitness()); - builder->addPublicDecoration(witness); + builder->addKeepAliveDecoration(witness); + builder->addHLSLExportDecoration(witness); + if (conformanceIdOverride != -1) { builder->addSequentialIDDecoration(witness, conformanceIdOverride); |
