From 7e369dc304fee399dc4d238fe6efc2d70cd5bf26 Mon Sep 17 00:00:00 2001 From: xlauko Date: Wed, 24 Apr 2024 13:19:13 +0200 Subject: [PATCH] cg: Resurrect record decl emition. --- include/vast/CodeGen/DefaultDeclVisitor.hpp | 20 ++++++++++++++++++++ lib/vast/CodeGen/DefaultDeclVisitor.cpp | 20 +++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/include/vast/CodeGen/DefaultDeclVisitor.hpp b/include/vast/CodeGen/DefaultDeclVisitor.hpp index d84c3758b6..23395c699a 100644 --- a/include/vast/CodeGen/DefaultDeclVisitor.hpp +++ b/include/vast/CodeGen/DefaultDeclVisitor.hpp @@ -9,6 +9,7 @@ VAST_RELAX_WARNINGS VAST_UNRELAX_WARNINGS #include "vast/CodeGen/CodeGenVisitorBase.hpp" +#include "vast/CodeGen/CodeGenMembers.hpp" namespace vast::cg { @@ -41,6 +42,25 @@ namespace vast::cg { operation VisitCXXRecordDecl(const clang::CXXRecordDecl *decl); operation VisitAccessSpecDecl(const clang::AccessSpecDecl *decl); operation VisitFieldDecl(const clang::FieldDecl *decl) ; + + operation mk_incomplete_decl(const clang::RecordDecl *decl); + + template< typename RecordDeclOp > + operation mk_record_decl(const clang::RecordDecl *decl) { + auto field_builder = [&] (auto &/* bld */, auto /* loc */) { + auto gen = mk_scoped_generator< members_generator >( + self.scope, bld, self + ); + + gen.emit(decl); + }; + + return bld.compose< RecordDeclOp >() + .bind(self.location(decl)) + .bind(self.symbol(decl)) + .bind(field_builder) + .freeze(); + } }; } // namespace vast::cg \ No newline at end of file diff --git a/lib/vast/CodeGen/DefaultDeclVisitor.cpp b/lib/vast/CodeGen/DefaultDeclVisitor.cpp index f15f0f85ea..a665a72685 100644 --- a/lib/vast/CodeGen/DefaultDeclVisitor.cpp +++ b/lib/vast/CodeGen/DefaultDeclVisitor.cpp @@ -344,7 +344,15 @@ namespace vast::cg } operation default_decl_visitor::VisitRecordDecl(const clang::RecordDecl *decl) { - return {}; + if (!decl->isCompleteDefinition()) { + return mk_incomplete_decl(decl); + } + + if (decl->isUnion()) { + return mk_record_decl< hl::UnionDeclOp >(decl); + } else { + return mk_record_decl< hl::StructDeclOp >(decl); + } } operation default_decl_visitor::VisitCXXRecordDecl(const clang::CXXRecordDecl *decl) { @@ -358,4 +366,14 @@ namespace vast::cg operation default_decl_visitor::VisitFieldDecl(const clang::FieldDecl *decl) { return {}; } + + operation default_decl_visitor::mk_incomplete_decl(const clang::RecordDecl *decl) { + return declare([&] { + return bld.compose< hl::TypeDeclOp >() + .bind(self.location(decl)) + .bind(self.symbol(decl)) + .freeze(); + }); + } + } // namespace vast::hl