From 8e6e884eca5b33218a8cb2714266fb6ed4548d75 Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Wed, 8 Jun 2022 10:23:01 -0400 Subject: 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" --- source/slang/slang-emit-cpp.cpp | 52 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) (limited to 'source/slang/slang-emit-cpp.cpp') 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(inst) && inst->findDecoration()) + { + // 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(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); -- cgit v1.2.3