summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2019-07-22 17:03:10 -0400
committerGitHub <noreply@github.com>2019-07-22 17:03:10 -0400
commitade2c39fa3675504ed135ef8abe7b53cfd06ee84 (patch)
treec856fb605908b990d0fec7afeece08497319fcfe
parentd2243107e582e2388b549d663f0931a742b6f353 (diff)
Use C++ template types in code generation (#1000)
* WIP: Adding support for C/C++ compilation to slang API. * Removed BackEndType in test harness -> use SlangPassThrough to identify backends Only require stage for targets that require it. Detection of all different backends. * Windows/Unix create temporary filename. * WIP: Output CPU binaries. * Added a pass-through c/c++ test. * Compile C++/C and store in temporary file. * Read the binary back into memory. * Set debug info and optimization flags for C/C++. Make the CPPCompiler debug/optimization levels match slangs. * Handling of include paths and math precision. * Dumping c++/c source and exe/shared library. * Put hex dump into own util. * End to end pass through c compilation test. * WIP: Simple execute test working on Linux/Unix. * Fix typo on linux. * WIP: To compile slang to cpp shared library. Report backend compiler errors. * Compiles slang -> cpp and loads as shared library. * Fix problem on c-cross-compile test because prelude is now included with <> quotes. * Run slang generated cpp code - using hard coded data. * Added cpp-execute-simple, and test output. * Fix warning that broke win32 build. * Fix compilation problem on osx. * When C++ output use template types. * Require C++14 if using partial specialization for matrix/vector types. * Merge of master + add c-cross-compile.slang.expected * Remove c-cross-compile.slang.expected
-rw-r--r--source/core/slang-gcc-compiler-util.cpp3
-rw-r--r--source/slang/slang-emit-cpp.cpp68
2 files changed, 48 insertions, 23 deletions
diff --git a/source/core/slang-gcc-compiler-util.cpp b/source/core/slang-gcc-compiler-util.cpp
index 69d68e608..0a53bcac8 100644
--- a/source/core/slang-gcc-compiler-util.cpp
+++ b/source/core/slang-gcc-compiler-util.cpp
@@ -369,7 +369,8 @@ static SlangResult _parseGCCFamilyLine(const UnownedStringSlice& line, LineParse
if (options.sourceType == SourceType::CPP)
{
- cmdLine.addArg("-std=c++11");
+ // Need C++14 for partial specialization
+ cmdLine.addArg("-std=c++14");
}
// Use shared libraries
diff --git a/source/slang/slang-emit-cpp.cpp b/source/slang/slang-emit-cpp.cpp
index d039715e3..2ec087eef 100644
--- a/source/slang/slang-emit-cpp.cpp
+++ b/source/slang/slang-emit-cpp.cpp
@@ -209,6 +209,12 @@ CPPSourceEmitter::IntrinsicOp CPPSourceEmitter::getOperationByName(const Unowned
void CPPSourceEmitter::emitTypeDefinition(IRType* inType)
{
+ if (m_target == CodeGenTarget::CPPSource)
+ {
+ // All types are templates in C++
+ return;
+ }
+
IRType* type = _cloneType(inType);
if (m_typeEmittedMap.TryGetValue(type))
{
@@ -362,17 +368,26 @@ StringSlicePool::Handle CPPSourceEmitter::_calcTypeName(IRType* type)
auto vecCount = int(GetIntVal(vecType->getElementCount()));
const IROp elemType = vecType->getElementType()->op;
- StringBuilder builder;
- builder << "Vec";
- UnownedStringSlice postFix = _getCTypeVecPostFix(elemType);
-
- builder << postFix;
- if (postFix.size() > 1)
+ if (m_target == CodeGenTarget::CPPSource)
{
- builder << "_";
+ StringBuilder builder;
+ builder << "Vector<" << getBuiltinTypeName(elemType) << ", " << vecCount << ">";
+ return m_slicePool.add(builder);
+ }
+ else
+ {
+ StringBuilder builder;
+ builder << "Vec";
+ UnownedStringSlice postFix = _getCTypeVecPostFix(elemType);
+
+ builder << postFix;
+ if (postFix.size() > 1)
+ {
+ builder << "_";
+ }
+ builder << vecCount;
+ return m_slicePool.add(builder);
}
- builder << vecCount;
- return m_slicePool.add(builder);
}
case kIROp_MatrixType:
{
@@ -382,22 +397,31 @@ StringSlicePool::Handle CPPSourceEmitter::_calcTypeName(IRType* type)
const auto rowCount = int(GetIntVal(matType->getRowCount()));
const auto colCount = int(GetIntVal(matType->getColumnCount()));
- // Make sure there is the vector name too
- _getTypeName(_getVecType(elementType, colCount));
-
- StringBuilder builder;
-
- builder << "Mat";
- const UnownedStringSlice postFix = _getCTypeVecPostFix(_getCType(elementType->op));
- builder << postFix;
- if (postFix.size() > 1)
+ if (m_target == CodeGenTarget::CPPSource)
{
- builder << "_";
+ StringBuilder builder;
+ builder << "Matrix<" << getBuiltinTypeName(elementType->op) << ", " << rowCount << ", " << colCount << ">";
+ return m_slicePool.add(builder);
}
- builder << rowCount;
- builder << colCount;
+ else
+ {
+ // Make sure there is the vector name too
+ _getTypeName(_getVecType(elementType, colCount));
- return m_slicePool.add(builder);
+ StringBuilder builder;
+
+ builder << "Mat";
+ const UnownedStringSlice postFix = _getCTypeVecPostFix(_getCType(elementType->op));
+ builder << postFix;
+ if (postFix.size() > 1)
+ {
+ builder << "_";
+ }
+ builder << rowCount;
+ builder << colCount;
+
+ return m_slicePool.add(builder);
+ }
}
case kIROp_HLSLRWStructuredBufferType:
{