Commit fb01cb0b authored by Nguyen, Thien Minh's avatar Nguyen, Thien Minh
Browse files

Fixes MLIR validation for FuncOp declarations



MLIR validated that *declaration*-only FuncOp must have non-public visibility.
Hence, need to conform our MLIR codegen accordingly.
Fixed the test_kernel test.

Signed-off-by: default avatarThien Nguyen <nguyentm@ornl.gov>
parent 0e931e10
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -539,8 +539,13 @@ antlrcpp::Any qasm3_visitor::visitKernelDeclaration(
  auto savept = builder.saveInsertionPoint();

  builder.setInsertionPointToStart(&m_module.getRegion().getBlocks().front());
  builder.create<mlir::FuncOp>(location, name,
                               function.getType().cast<mlir::FunctionType>());
  
  // Note: MLIR FuncOp **declaration** must have non-public visibility
  // This is validated at MLIR level.
  // https://llvm.discourse.group/t/rfc-symbol-definition-declaration-x-visibility-checks/2140
  auto func_decl = builder.create<mlir::FuncOp>(
      location, name, function.getType().cast<mlir::FunctionType>());
  func_decl.setVisibility(mlir::SymbolTable::Visibility::Private);
  builder.restoreInsertionPoint(savept);

  symbol_table.add_seen_function(name, function);
+4 −3
Original line number Diff line number Diff line
@@ -124,9 +124,10 @@ antlrcpp::Any qasm3_visitor::visitSubroutineDefinition(
  if (context->subroutineBlock()->EXTERN()) {
    std::cout << "Handle extern subroutine: " << subroutine_name << "\n";
    builder.setInsertionPointToStart(&m_module.getRegion().getBlocks().front());
    builder.create<mlir::FuncOp>(get_location(builder, file_name, context),
                                 subroutine_name,
    auto func_decl = builder.create<mlir::FuncOp>(
        get_location(builder, file_name, context), subroutine_name,
        function.getType().cast<mlir::FunctionType>());
    func_decl.setVisibility(mlir::SymbolTable::Visibility::Private);
    builder.restoreInsertionPoint(main_block);
    symbol_table.add_seen_function(subroutine_name, function);
    return 0;