Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 32 additions & 29 deletions src/mlir/cxx/mlir/codegen_declarations.cc
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
// cxx
#include <cxx/ast.h>
#include <cxx/control.h>
#include <cxx/external_name_encoder.h>
#include <cxx/symbols.h>
#include <cxx/translation_unit.h>
#include <cxx/types.h>
Expand Down Expand Up @@ -84,16 +85,7 @@ struct Codegen::TemplateParameterVisitor {
};

auto Codegen::declaration(DeclarationAST* ast) -> DeclarationResult {
// if (ast) return visit(DeclarationVisitor{*this}, ast);

// restrict for now to declarations that are not definitions
if (ast_cast<FunctionDefinitionAST>(ast) ||
ast_cast<LinkageSpecificationAST>(ast) ||
ast_cast<SimpleDeclarationAST>(ast) ||
ast_cast<NamespaceDefinitionAST>(ast)) {
return visit(DeclarationVisitor{*this}, ast);
}

if (ast) return visit(DeclarationVisitor{*this}, ast);
return {};
}

Expand Down Expand Up @@ -149,6 +141,11 @@ auto Codegen::lambdaSpecifier(LambdaSpecifierAST* ast)

auto Codegen::DeclarationVisitor::operator()(SimpleDeclarationAST* ast)
-> DeclarationResult {
if (!gen.function_) {
// skip for now, as we only look for local variable declarations
return {};
}

#if false
for (auto node : ListView{ast->attributeList}) {
auto value = gen.attributeSpecifier(node);
Expand Down Expand Up @@ -223,32 +220,39 @@ auto Codegen::DeclarationVisitor::operator()(AsmDeclarationAST* ast)

auto Codegen::DeclarationVisitor::operator()(NamespaceAliasDefinitionAST* ast)
-> DeclarationResult {
#if false
auto nestedNameSpecifierResult =
gen.nestedNameSpecifier(ast->nestedNameSpecifier);

auto unqualifiedIdResult = gen.unqualifiedId(ast->unqualifiedId);
#endif

return {};
}

auto Codegen::DeclarationVisitor::operator()(UsingDeclarationAST* ast)
-> DeclarationResult {
#if false
for (auto node : ListView{ast->usingDeclaratorList}) {
auto value = gen.usingDeclarator(node);
}
#endif

return {};
}

auto Codegen::DeclarationVisitor::operator()(UsingEnumDeclarationAST* ast)
-> DeclarationResult {
#if false
auto enumTypeSpecifierResult = gen.specifier(ast->enumTypeSpecifier);
#endif

return {};
}

auto Codegen::DeclarationVisitor::operator()(UsingDirectiveAST* ast)
-> DeclarationResult {
#if false
for (auto node : ListView{ast->attributeList}) {
auto value = gen.attributeSpecifier(node);
}
Expand All @@ -257,19 +261,23 @@ auto Codegen::DeclarationVisitor::operator()(UsingDirectiveAST* ast)
gen.nestedNameSpecifier(ast->nestedNameSpecifier);

auto unqualifiedIdResult = gen.unqualifiedId(ast->unqualifiedId);
#endif

return {};
}

auto Codegen::DeclarationVisitor::operator()(StaticAssertDeclarationAST* ast)
-> DeclarationResult {
#if false
auto expressionResult = gen.expression(ast->expression);
#endif

return {};
}

auto Codegen::DeclarationVisitor::operator()(AliasDeclarationAST* ast)
-> DeclarationResult {
#if false
for (auto node : ListView{ast->attributeList}) {
auto value = gen.attributeSpecifier(node);
}
Expand All @@ -279,12 +287,14 @@ auto Codegen::DeclarationVisitor::operator()(AliasDeclarationAST* ast)
}

auto typeIdResult = gen.typeId(ast->typeId);
#endif

return {};
}

auto Codegen::DeclarationVisitor::operator()(OpaqueEnumDeclarationAST* ast)
-> DeclarationResult {
#if false
for (auto node : ListView{ast->attributeList}) {
auto value = gen.attributeSpecifier(node);
}
Expand All @@ -297,6 +307,7 @@ auto Codegen::DeclarationVisitor::operator()(OpaqueEnumDeclarationAST* ast)
for (auto node : ListView{ast->typeSpecifierList}) {
auto value = gen.specifier(node);
}
#endif

return {};
}
Expand Down Expand Up @@ -333,15 +344,8 @@ auto Codegen::DeclarationVisitor::operator()(FunctionDefinitionAST* ast)
if (ast->symbol->hasCLinkage()) {
name = to_string(ast->symbol->name());
} else {
// todo: external name mangling

std::ranges::for_each(path | std::views::reverse, [&](auto& part) {
name += "::";
name += part;
});

// generate unique names until we have proper name mangling
name += std::format("_{}", ++gen.count_);
ExternalNameEncoder encoder;
name = encoder.encode(ast->symbol);
}

auto guard = mlir::OpBuilder::InsertionGuard(gen.builder_);
Expand Down Expand Up @@ -379,14 +383,7 @@ auto Codegen::DeclarationVisitor::operator()(FunctionDefinitionAST* ast)
const auto endLoc = gen.getLocation(ast->lastSourceLocation());

if (!gen.builder_.getBlock()->mightHaveTerminator()) {
llvm::SmallVector<mlir::Value> exitBlockArgs;

if (gen.exitValue_) {
exitBlockArgs.push_back(gen.exitValue_.getResult());
}

gen.builder_.create<mlir::cf::BranchOp>(endLoc, exitBlockArgs,
gen.exitBlock_);
gen.builder_.create<mlir::cf::BranchOp>(endLoc, gen.exitBlock_);
}

gen.builder_.setInsertionPointToEnd(gen.exitBlock_);
Expand Down Expand Up @@ -415,33 +412,38 @@ auto Codegen::DeclarationVisitor::operator()(FunctionDefinitionAST* ast)

auto Codegen::DeclarationVisitor::operator()(TemplateDeclarationAST* ast)
-> DeclarationResult {
#if false
for (auto node : ListView{ast->templateParameterList}) {
auto value = gen.templateParameter(node);
}

auto requiresClauseResult = gen.requiresClause(ast->requiresClause);

auto declarationResult = gen.declaration(ast->declaration);
#endif

return {};
}

auto Codegen::DeclarationVisitor::operator()(ConceptDefinitionAST* ast)
-> DeclarationResult {
#if false
auto expressionResult = gen.expression(ast->expression);
#endif

return {};
}

auto Codegen::DeclarationVisitor::operator()(DeductionGuideAST* ast)
-> DeclarationResult {
#if false
auto explicitSpecifierResult = gen.specifier(ast->explicitSpecifier);

auto parameterDeclarationClauseResult =
gen.parameterDeclarationClause(ast->parameterDeclarationClause);

auto templateIdResult = gen.unqualifiedId(ast->templateId);

#endif
return {};
}

Expand Down Expand Up @@ -525,6 +527,7 @@ auto Codegen::DeclarationVisitor::operator()(ModuleImportDeclarationAST* ast)

auto Codegen::DeclarationVisitor::operator()(ParameterDeclarationAST* ast)
-> DeclarationResult {
#if false
for (auto node : ListView{ast->attributeList}) {
auto value = gen.attributeSpecifier(node);
}
Expand All @@ -535,7 +538,7 @@ auto Codegen::DeclarationVisitor::operator()(ParameterDeclarationAST* ast)

auto declaratorResult = gen.declarator(ast->declarator);
auto expressionResult = gen.expression(ast->expression);

#endif
return {};
}

Expand Down
Loading
Loading