diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2022-06-08 10:23:01 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-08 10:23:01 -0400 |
| commit | 8e6e884eca5b33218a8cb2714266fb6ed4548d75 (patch) | |
| tree | a9c8aee79a71450a64e6660da7266b6a45da0264 /source/slang/slang-emit-cpp.cpp | |
| parent | 01d0154ae90f5c587321d39b8fd8f82e2764f360 (diff) | |
Actual global support (#2262)
* #include an absolute path didn't work - because paths were taken to always be relative.
* Use TerminatedUnownedStringSlice for literals in output C++.
* Remove Escape/Unescape functions used in slang-token-reader.cpp
Add target type of 'host-cpp' etc to map to the target types.
* Fix some corner cases around string encoding.
* Added unit test for string escaping.
Fixed some assorted escaping bugs.
* Updated test output.
* Added decode test.
* Stop using hex output, to get around 'greedy' aspect. Use octal instead.
* Added HostHostCallable
Small changes to use ArtifactDesc/Info instead of large switches.
* Fix C++ emit to handle arbitrary function export.
* Add options handling for callable without an output being specified.
* Can compile with COM interface. Added example using com interface.
* Use the IR Ptr type instead of hack in C++ emit for interfaces.
* Fix issue with outputting the COM call when ptr is used.
* Fix crash issue on compilation failure.
* Add support for __global.
* Added `ActualGlobalRate`
Added special handling around globals and COM interfaces.
Tested out in cpu-com-example.
* Fix typo in NodeBase.
* Support for accessing globals by name working.
* Check that actual global initialization is working.
* Refactor the com replacement such that it doesn't need a cache or do anything special with GlobalVar.
* Remove context.
Only create replacement if needed.
* Split out COM host-callable into a unit-test.
* host-callable com testing on C++and llvm.
* Comment around the COM ptr replacement.
* Disable com test on vs 32 bit.
Fix C++ prelude
* Disable 32 bit targets testing com host-callable.
* Use JSON parsing to locate VS version.
* Need platform detection in C++prelude.
* Fix com host callable test for LLVM.
* Work around for not being able to include "targetConditionals.h"
Diffstat (limited to 'source/slang/slang-emit-cpp.cpp')
| -rw-r--r-- | source/slang/slang-emit-cpp.cpp | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/source/slang/slang-emit-cpp.cpp b/source/slang/slang-emit-cpp.cpp index ddc8b24ed..c23135c70 100644 --- a/source/slang/slang-emit-cpp.cpp +++ b/source/slang/slang-emit-cpp.cpp @@ -2547,7 +2547,50 @@ void CPPSourceEmitter::emitPreModuleImpl() } } -/* virtual */void CPPSourceEmitter::emitFuncDecorationsImpl(IRFunc* func) + +void CPPSourceEmitter::emitGlobalInstImpl(IRInst* inst) +{ + if (as<IRGlobalVar>(inst) && inst->findDecoration<IRExternCppDecoration>()) + { + // JS: + // Turns out just doing extern "C" means something different on a variable + // So we need to wrap in extern "C" { } + m_writer->emit("extern \"C\" {\n"); + Super::emitGlobalInstImpl(inst); + m_writer->emit("\n}\n"); + } + else + { + Super::emitGlobalInstImpl(inst); + } +} + +static bool _isExported(IRInst* inst) +{ + for (auto decoration : inst->getDecorations()) + { + const auto op = decoration->getOp(); + if (op == kIROp_PublicDecoration || + op == kIROp_HLSLExportDecoration) + { + return true; + } + } + return false; +} + +void CPPSourceEmitter::emitVarDecorationsImpl(IRInst* inst) +{ + if (as<IRGlobalVar>(inst) && _isExported(inst)) + { + m_writer->emit("SLANG_PRELUDE_SHARED_LIB_EXPORT\n"); + } + + Super::emitVarDecorationsImpl(inst); +} + + +void CPPSourceEmitter::_maybeEmitExportLike(IRInst* inst) { // Specially handle export, as we don't want to emit it multiple times if (getTargetReq()->isWholeProgramRequest()) @@ -2556,7 +2599,7 @@ void CPPSourceEmitter::emitPreModuleImpl() bool isExported = false; // If public/export made it externally visible - for (auto decoration : func->getDecorations()) + for (auto decoration : inst->getDecorations()) { const auto op = decoration->getOp(); if (op == kIROp_ExternCppDecoration) @@ -2581,6 +2624,11 @@ void CPPSourceEmitter::emitPreModuleImpl() m_writer->emit("extern \"C\"\n"); } } +} + +/* virtual */void CPPSourceEmitter::emitFuncDecorationsImpl(IRFunc* func) +{ + _maybeEmitExportLike(func); // Use the default for others Super::emitFuncDecorationsImpl(func); |
