diff options
Diffstat (limited to 'source/slang/slang-emit-cpp.cpp')
| -rw-r--r-- | source/slang/slang-emit-cpp.cpp | 167 |
1 files changed, 26 insertions, 141 deletions
diff --git a/source/slang/slang-emit-cpp.cpp b/source/slang/slang-emit-cpp.cpp index b71feafc1..c949075fb 100644 --- a/source/slang/slang-emit-cpp.cpp +++ b/source/slang/slang-emit-cpp.cpp @@ -1467,24 +1467,6 @@ UnownedStringSlice CPPSourceEmitter::_getFuncName(const HLSLIntrinsic* specOp) return m_slicePool.getSlice(handle); } -UnownedStringSlice CPPSourceEmitter::_getWitnessTableWrapperFuncName(IRFunc* func) -{ - StringSlicePool::Handle handle = StringSlicePool::kNullHandle; - if (m_witnessTableWrapperFuncNameMap.TryGetValue(func, handle)) - { - return m_slicePool.getSlice(handle); - } - - StringBuilder builder; - builder << getName(func) << "_wtwrapper"; - - handle = m_slicePool.add(builder); - m_witnessTableWrapperFuncNameMap.Add(func, handle); - - SLANG_ASSERT(handle != StringSlicePool::kNullHandle); - return m_slicePool.getSlice(handle); -} - SlangResult CPPSourceEmitter::calcFuncName(const HLSLIntrinsic* specOp, StringBuilder& outBuilder) { typedef HLSLIntrinsic::Op Op; @@ -1629,122 +1611,6 @@ void CPPSourceEmitter::emitWitnessTable(IRWitnessTable* witnessTable) pendingWitnessTableDefinitions.add(witnessTable); } -void CPPSourceEmitter::_emitWitnessTableWrappers() -{ - for (auto witnessTable : pendingWitnessTableDefinitions) - { - auto interfaceType = cast<IRInterfaceType>(witnessTable->getOperand(0)); - for (auto child : witnessTable->getChildren()) - { - if (auto entry = as<IRWitnessTableEntry>(child)) - { - if (auto funcVal = as<IRFunc>(entry->getSatisfyingVal())) - { - IRInst* requirementVal = nullptr; - for (UInt i = 0; i < interfaceType->getOperandCount(); i++) - { - if (auto reqEntry = as<IRInterfaceRequirementEntry>(interfaceType->getOperand(i))) - { - if (reqEntry->getRequirementKey() == entry->getRequirementKey()) - { - requirementVal = reqEntry->getRequirementVal(); - break; - } - } - } - SLANG_ASSERT(requirementVal != nullptr); - IRFuncType* requirementFuncType = cast<IRFuncType>(requirementVal); - emitType(funcVal->getResultType()); - m_writer->emit(" "); - m_writer->emit(_getWitnessTableWrapperFuncName(funcVal)); - m_writer->emit("("); - // Emit parameter list. - { - bool isFirst = true; - SLANG_ASSERT(funcVal->getParamCount() == requirementFuncType->getParamCount()); - auto pp = funcVal->getParams().begin(); - for (UInt i = 0; i < requirementFuncType->getParamCount(); ++i, ++pp) - { - auto paramType = requirementFuncType->getParamType(i); - - if (as<IRTypeType>(paramType)) - continue; - - if (isFirst) - isFirst = false; - else - m_writer->emit(","); - emitParamType(paramType, getName(*pp)); - } - } - m_writer->emit(")\n{\n"); - m_writer->indent(); - m_writer->emit("return "); - m_writer->emit(getName(funcVal)); - m_writer->emit("("); - // Emit argument list. - { - bool isFirst = true; - UInt paramIndex = 0; - for (auto defParamIter = funcVal->getParams().begin(); - defParamIter!=funcVal->getParams().end(); - ++defParamIter, ++paramIndex) - { - auto param = *defParamIter; - auto reqParamType = requirementFuncType->getParamType(paramIndex); - if (as<IRTypeType>(param->getFullType())) - continue; - - if (isFirst) - isFirst = false; - else - m_writer->emit(", "); - - // If the implementation expects a concrete type - // (either in the form of a pointer for `out`/`inout` parameters, - // or in the form a a value for `in` parameters, while - // the interface exposes a raw pointer type (void*), - // we need to cast the raw pointer type to the appropriate - // concerete type. (void*->Concrete* / void*->Concrete&). - if (reqParamType->op == kIROp_RawPointerType && - param->getDataType()->op != kIROp_RawPointerType) - { - if (as<IRPtrTypeBase>(param->getFullType())) - { - // The implementation function expects a pointer to the - // concrete type. This is the case for inout/out parameters. - m_writer->emit("static_cast<"); - emitType(param->getFullType()); - m_writer->emit(">("); - m_writer->emit(getName(param)); - m_writer->emit(")"); - } - else - { - // The implementation function expects just a value of the - // concrete type. We need to insert a dereference in this case. - m_writer->emit("*static_cast<"); - emitType(param->getFullType()); - m_writer->emit("*>("); - m_writer->emit(getName(param)); - m_writer->emit(")"); - } - } - else - { - m_writer->emit(getName(param)); - } - } - } - m_writer->emit(");\n"); - m_writer->dedent(); - m_writer->emit("}\n"); - } - } - } - } -} - void CPPSourceEmitter::_emitWitnessTableDefinitions() { for (auto witnessTable : pendingWitnessTableDefinitions) @@ -1767,7 +1633,7 @@ void CPPSourceEmitter::_emitWitnessTableDefinitions() else isFirstEntry = false; - m_writer->emit(_getWitnessTableWrapperFuncName(funcVal)); + m_writer->emit(getName(funcVal)); } else if (auto witnessTableVal = as<IRWitnessTable>(entry->getSatisfyingVal())) { @@ -1778,9 +1644,18 @@ void CPPSourceEmitter::_emitWitnessTableDefinitions() m_writer->emit("&"); m_writer->emit(getName(witnessTableVal)); } + else if (entry->getSatisfyingVal() && + isPointerOfType(entry->getSatisfyingVal()->getDataType(), kIROp_RTTIType)) + { + if (!isFirstEntry) + m_writer->emit(",\n"); + else + isFirstEntry = false; + emitInstExpr(entry->getSatisfyingVal(), getInfo(EmitOp::General)); + } else { - // TODO: handle other witness table entry types. + SLANG_UNEXPECTED("unknown witnesstable entry type"); } } m_writer->dedent(); @@ -1857,6 +1732,12 @@ void CPPSourceEmitter::_maybeEmitWitnessTableTypeDefinition( m_writer->emit(getName(entry->getRequirementKey())); m_writer->emit(";\n"); } + else if (isPointerOfType(entry->getRequirementVal(), kIROp_RTTIType)) + { + m_writer->emit("TypeInfo* "); + m_writer->emit(getName(entry->getRequirementKey())); + m_writer->emit(";\n"); + } } m_writer->dedent(); m_writer->emit("};\n"); @@ -2336,6 +2217,15 @@ bool CPPSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOut m_writer->emit("->typeSize)"); return true; } + case kIROp_BitCast: + { + m_writer->emit("(("); + emitType(inst->getDataType()); + m_writer->emit(")("); + emitOperand(inst->getOperand(0), getInfo(EmitOp::General)); + m_writer->emit("))"); + return true; + } } } @@ -2668,11 +2558,6 @@ void CPPSourceEmitter::emitModuleImpl(IRModule* module) emitGlobalInst(action.inst); } } - - // Emit wrapper functions for each witness table entry. - // These wrapper functions takes an abstract type parameter (void*) - // in the place of `this` parameter. - _emitWitnessTableWrappers(); } // Emit all witness table definitions. |
