From 65c2e7f1ccc6cdb5daec343c7e32b4a9dc463ae4 Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 12 Apr 2022 15:23:53 -0700 Subject: Support `[DllImport]` (#2181) * Support `[DllImport]` * Fix. * Fix. * Fix array type emit in cpp. * Fix. * Fix. * Fix Co-authored-by: Yong He --- source/slang/slang-emit-c-like.cpp | 40 +++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) (limited to 'source/slang/slang-emit-c-like.cpp') diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp index edadcef48..562a532cd 100644 --- a/source/slang/slang-emit-c-like.cpp +++ b/source/slang/slang-emit-c-like.cpp @@ -159,6 +159,14 @@ void CLikeSourceEmitter::emitDeclarator(DeclaratorInfo* declarator) } break; + case DeclaratorInfo::Flavor::Ref: + { + auto refDeclarator = (RefDeclaratorInfo*)declarator; + m_writer->emit("&"); + emitDeclarator(refDeclarator->next); + } + break; + case DeclaratorInfo::Flavor::LiteralSizedArray: { auto arrayDeclarator = (LiteralSizedArrayDeclaratorInfo*)declarator; @@ -180,8 +188,6 @@ void CLikeSourceEmitter::emitDeclarator(DeclaratorInfo* declarator) emitDeclarator(attributedDeclarator->next); } break; - - default: SLANG_DIAGNOSE_UNEXPECTED(getSink(), SourceLoc(), "unknown declarator flavor"); break; @@ -214,6 +220,8 @@ void CLikeSourceEmitter::emitSimpleType(IRType* type) case kIROp_FloatType: return UnownedStringSlice("float"); case kIROp_DoubleType: return UnownedStringSlice("double"); + + case kIROp_CharType: return UnownedStringSlice("uint8_t"); default: return UnownedStringSlice(); } } @@ -324,7 +332,6 @@ void CLikeSourceEmitter::_emitType(IRType* type, DeclaratorInfo* declarator) } break; } - } void CLikeSourceEmitter::emitWitnessTable(IRWitnessTable* witnessTable) @@ -3305,8 +3312,14 @@ void CLikeSourceEmitter::ensureInstOperandsRec(ComputeEmitActionsContext* ctx, I UInt operandCount = inst->operandCount; auto requiredLevel = EmitAction::Definition; - if (inst->getOp() == kIROp_InterfaceType) + switch (inst->getOp()) + { + case kIROp_InterfaceType: requiredLevel = EmitAction::ForwardDeclaration; + break; + default: + break; + } for(UInt ii = 0; ii < operandCount; ++ii) { @@ -3404,6 +3417,23 @@ void CLikeSourceEmitter::computeEmitActions(IRModule* module, List& } } +void CLikeSourceEmitter::emitForwardDeclaration(IRInst* inst) +{ + switch (inst->getOp()) + { + case kIROp_Func: + emitFuncDecl(cast(inst)); + break; + case kIROp_StructType: + m_writer->emit("struct "); + m_writer->emit(getName(inst)); + m_writer->emit(";\n"); + break; + default: + SLANG_UNREACHABLE("emit forward declaration"); + } +} + void CLikeSourceEmitter::executeEmitActions(List const& actions) { for(auto action : actions) @@ -3411,7 +3441,7 @@ void CLikeSourceEmitter::executeEmitActions(List const& actions) switch(action.level) { case EmitAction::Level::ForwardDeclaration: - emitFuncDecl(cast(action.inst)); + emitForwardDeclaration(action.inst); break; case EmitAction::Level::Definition: -- cgit v1.2.3