LCOV - code coverage report
Current view: top level - gcc/rust/resolve - rust-default-resolver.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 99.6 % 281 280
Test Date: 2026-10-03 16:17:38 Functions: 100.0 % 60 60
Legend: Lines:     hit not hit

            Line data    Source code
       1              : // Copyright (C) 2020-2026 Free Software Foundation, Inc.
       2              : 
       3              : // This file is part of GCC.
       4              : 
       5              : // GCC is free software; you can redistribute it and/or modify it under
       6              : // the terms of the GNU General Public License as published by the Free
       7              : // Software Foundation; either version 3, or (at your option) any later
       8              : // version.
       9              : 
      10              : // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      11              : // WARRANTY; without even the implied warranty of MERCHANTABILITY or
      12              : // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      13              : // for more details.
      14              : 
      15              : // You should have received a copy of the GNU General Public License
      16              : // along with GCC; see the file COPYING3.  If not see
      17              : // <http://www.gnu.org/licenses/>.
      18              : 
      19              : #include "rust-default-resolver.h"
      20              : #include "optional.h"
      21              : #include "rust-ast-full.h"
      22              : #include "rust-ast-visitor.h"
      23              : #include "rust-ast.h"
      24              : #include "rust-attribute-values.h"
      25              : #include "rust-item.h"
      26              : #include "rust-path.h"
      27              : 
      28              : namespace Rust {
      29              : namespace Resolver2_0 {
      30              : 
      31              : void
      32        32869 : DefaultResolver::visit (AST::Crate &crate)
      33              : {
      34              :   // Guard against infinite recursion: `extern crate self;` resolves to the
      35              :   // current crate, causing visit(AST::Crate) to call itself infinitely.
      36        32869 :   if (!visited_crates.insert (crate.get_node_id ()).second)
      37            0 :     return;
      38              : 
      39        65738 :   auto inner_fn = [this, &crate] () {
      40        32869 :     maybe_prelude_import ();
      41        32869 :     AST::DefaultASTVisitor::visit (crate);
      42        65736 :   };
      43              : 
      44        32869 :   auto &mappings = Analysis::Mappings::get ();
      45              : 
      46        32869 :   auto crate_num = mappings.lookup_crate_num (crate.get_node_id ());
      47        32869 :   rust_assert (crate_num.has_value ());
      48        32869 :   auto crate_name = mappings.get_crate_name (*crate_num);
      49        32869 :   rust_assert (crate_name.has_value ());
      50              : 
      51        65738 :   ctx.canonical_ctx.scope_crate (crate.get_node_id (), *crate_name, inner_fn);
      52              : }
      53              : 
      54              : void
      55      1346564 : DefaultResolver::visit (AST::BlockExpr &expr)
      56              : {
      57              :   // extracting the lambda from the `scoped` call otherwise the code looks like
      58              :   // a hot turd thanks to our .clang-format
      59              : 
      60      1346564 :   auto inner_fn = [this, &expr] () { AST::DefaultASTVisitor::visit (expr); };
      61              : 
      62      1346564 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_fn);
      63      1346559 : }
      64              : 
      65              : void
      66        27662 : DefaultResolver::visit (AST::Module &module)
      67              : {
      68        55324 :   auto item_fn_1 = [this, &module] () {
      69        27662 :     maybe_prelude_import ();
      70        27662 :     AST::DefaultASTVisitor::visit (module);
      71        55324 :   };
      72              : 
      73        55324 :   auto item_fn_2 = [this, &module, &item_fn_1] () {
      74        27662 :     ctx.canonical_ctx.scope (module.get_node_id (), module.get_name (),
      75              :                              std::move (item_fn_1));
      76        55324 :   };
      77              : 
      78        55324 :   ctx.scoped (Rib::Kind::Module, module.get_node_id (), item_fn_2,
      79        55324 :               module.get_name ());
      80        27662 : }
      81              : 
      82              : void
      83      1008511 : DefaultResolver::visit (AST::Function &function)
      84              : {
      85      1008511 :   auto def_fn_1
      86      1008511 :     = [this, &function] () { AST::DefaultASTVisitor::visit (function); };
      87              : 
      88      2017022 :   auto def_fn_2 = [this, &function, &def_fn_1] () {
      89      1008511 :     ctx.canonical_ctx.scope (function.get_node_id (),
      90      1008511 :                              function.get_function_name (),
      91              :                              std::move (def_fn_1));
      92      2017020 :   };
      93              : 
      94      1008511 :   ctx.scoped (Rib::Kind::Function, function.get_node_id (), def_fn_2);
      95      1008509 : }
      96              : 
      97              : void
      98         5131 : DefaultResolver::visit (AST::LoopExpr &expr)
      99              : {
     100         5131 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
     101        15392 :               [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
     102         5130 : }
     103              : 
     104              : void
     105         8051 : DefaultResolver::visit (AST::WhileLoopExpr &expr)
     106              : {
     107         8051 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
     108        24153 :               [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
     109         8051 : }
     110              : 
     111              : void
     112         1762 : DefaultResolver::visit (AST::WhileLetLoopExpr &expr)
     113              : {
     114         1762 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
     115         5286 :               [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
     116         1762 : }
     117              : void
     118         7588 : DefaultResolver::visit (AST::ForLoopExpr &expr)
     119              : {
     120         7588 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
     121        22764 :               [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
     122         7588 : }
     123              : 
     124              : void
     125         7106 : DefaultResolver::visit_if_let_patterns (AST::IfLetExpr &expr)
     126              : {
     127         7106 :   visit (expr.get_pattern ());
     128         7106 : }
     129              : 
     130              : void
     131         7106 : DefaultResolver::visit (AST::IfLetExpr &expr)
     132              : {
     133        14212 :   auto inner_vis = [this, &expr] () {
     134         7106 :     visit_if_let_patterns (expr);
     135         7106 :     visit (expr.get_if_block ());
     136        14212 :   };
     137              : 
     138         7106 :   visit_outer_attrs (expr);
     139              : 
     140         7106 :   visit (expr.get_value_expr ());
     141              : 
     142         7106 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_vis);
     143         7106 : }
     144              : 
     145              : void
     146         2529 : DefaultResolver::visit (AST::IfLetExprConseqElse &expr)
     147              : {
     148         2529 :   DefaultResolver::visit (static_cast<AST::IfLetExpr &> (expr));
     149         2529 :   visit (expr.get_else_block ());
     150         2529 : }
     151              : 
     152              : void
     153        38625 : DefaultResolver::visit (AST::Trait &trait)
     154              : {
     155        38625 :   visit_outer_attrs (trait);
     156        38625 :   visit (trait.get_visibility ());
     157        38625 :   visit_inner_attrs (trait);
     158              : 
     159        77250 :   auto inner_fn_1 = [this, &trait] () {
     160        93166 :     for (auto &item : trait.get_trait_items ())
     161        54541 :       visit (item);
     162        77250 :   };
     163              : 
     164        77250 :   auto inner_fn_2 = [this, &trait, &inner_fn_1] () {
     165        38625 :     visit (trait.get_implicit_self ());
     166        48495 :     for (auto &generic : trait.get_generic_params ())
     167         9870 :       visit (generic);
     168        38625 :     if (trait.has_where_clause ())
     169           56 :       visit (trait.get_where_clause ());
     170        49003 :     for (auto &bound : trait.get_type_param_bounds ())
     171        10378 :       visit (bound);
     172              : 
     173        38625 :     ctx.scoped (Rib::Kind::TraitOrImpl, trait.get_node_id (), inner_fn_1);
     174        77250 :   };
     175              : 
     176        77250 :   auto inner_fn_3 = [this, &trait, &inner_fn_2] () {
     177        38625 :     ctx.canonical_ctx.scope (trait.get_node_id (), trait.get_identifier (),
     178              :                              std::move (inner_fn_2));
     179        77250 :   };
     180              : 
     181        77250 :   ctx.scoped (Rib::Kind::Generics, trait.get_node_id (), inner_fn_3,
     182        77250 :               trait.get_identifier () /* FIXME: Is that valid?*/);
     183        38625 : }
     184              : 
     185              : static bool
     186        29368 : is_lang_impl (std::vector<AST::Attribute> &outer_attrs)
     187              : {
     188        33060 :   for (auto &attr : outer_attrs)
     189         6975 :     if (attr.get_path ().as_string () == Values::Attributes::LANG)
     190        29368 :       return true;
     191              : 
     192              :   return false;
     193              : }
     194              : 
     195              : void
     196        29368 : DefaultResolver::visit (AST::InherentImpl &impl)
     197              : {
     198        29368 :   visit_outer_attrs (impl);
     199        29368 :   visit (impl.get_visibility ());
     200        29368 :   visit_inner_attrs (impl);
     201              : 
     202        58736 :   auto inner_fn_1 = [this, &impl] () {
     203       212706 :     for (auto &item : impl.get_impl_items ())
     204       183338 :       visit (item);
     205        58736 :   };
     206              : 
     207        58736 :   auto inner_fn_2 = [this, &impl, &inner_fn_1] () {
     208        29368 :     maybe_insert_big_self (impl);
     209        53956 :     for (auto &generic : impl.get_generic_params ())
     210        24588 :       visit (generic);
     211        29368 :     if (impl.has_where_clause ())
     212          221 :       visit (impl.get_where_clause ());
     213        29368 :     visit_impl_type (impl.get_type ());
     214              : 
     215        29368 :     ctx.scoped (Rib::Kind::TraitOrImpl, impl.get_node_id (), inner_fn_1);
     216        58736 :   };
     217              : 
     218        58736 :   auto inner_fn_3 = [this, &impl, &inner_fn_2] () {
     219        29368 :     ctx.canonical_ctx.scope_impl (impl, std::move (inner_fn_2));
     220        58736 :   };
     221              : 
     222        29368 :   ctx.scoped (Rib::Kind::Generics, impl.get_node_id (), inner_fn_3);
     223              : 
     224        29368 :   if (is_lang_impl (impl.get_outer_attrs ()))
     225              :     {
     226         3283 :       if (impl.get_type ().get_type_kind () == AST::Type::Kind::TypePath)
     227              :         {
     228         1491 :           auto type = static_cast<AST::TypePath &> (impl.get_type ());
     229         1491 :           auto type_name = type.as_string ();
     230              : 
     231         4473 :           ctx.types.insert_lang_prelude (type_name, impl.get_node_id ());
     232         1491 :         }
     233              :     }
     234        29368 : }
     235              : 
     236              : void
     237       502919 : DefaultResolver::visit (AST::TraitImpl &impl)
     238              : {
     239       502919 :   visit_outer_attrs (impl);
     240       502919 :   visit (impl.get_visibility ());
     241       502919 :   visit_inner_attrs (impl);
     242              : 
     243      1005838 :   auto inner_fn_1 = [this, &impl] () {
     244      1211946 :     for (auto &item : impl.get_impl_items ())
     245       709027 :       visit (item);
     246      1005838 :   };
     247              : 
     248      1005838 :   auto inner_fn_2 = [this, &impl, &inner_fn_1] () {
     249       502919 :     maybe_insert_big_self (impl);
     250       973432 :     for (auto &generic : impl.get_generic_params ())
     251       470513 :       visit (generic);
     252       502919 :     if (impl.has_where_clause ())
     253        26418 :       visit (impl.get_where_clause ());
     254       502919 :     visit_impl_type (impl.get_type ());
     255       502919 :     visit (impl.get_trait_path ());
     256              : 
     257       502919 :     ctx.scoped (Rib::Kind::TraitOrImpl, impl.get_node_id (), inner_fn_1);
     258      1005838 :   };
     259              : 
     260      1005838 :   auto inner_fn_3 = [this, &impl, &inner_fn_2] () {
     261       502919 :     ctx.canonical_ctx.scope_impl (impl, std::move (inner_fn_2));
     262      1005838 :   };
     263              : 
     264       502919 :   ctx.scoped (Rib::Kind::Generics, impl.get_node_id (), inner_fn_3);
     265       502919 : }
     266              : 
     267              : void
     268        54453 : DefaultResolver::visit (AST::StructStruct &type)
     269              : {
     270        54453 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     271              : 
     272       108906 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     273        54453 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_struct_name (),
     274              :                              std::move (inner_fn_1));
     275       108906 :   };
     276              : 
     277        54453 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     278       163359 :               inner_fn_2, type.get_struct_name ());
     279        54453 : }
     280              : 
     281              : void
     282        13909 : DefaultResolver::visit (AST::TupleStruct &type)
     283              : {
     284        13909 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     285              : 
     286        27818 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     287        13909 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_struct_name (),
     288              :                              std::move (inner_fn_1));
     289        27818 :   };
     290              : 
     291        13909 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     292        41727 :               inner_fn_2, type.get_struct_name ());
     293        13909 : }
     294              : 
     295              : void
     296         7693 : DefaultResolver::visit (AST::EnumItem &item)
     297              : {
     298         7693 :   auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     299              : 
     300         7693 :   ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     301              :                            inner_fn);
     302         7693 : }
     303              : 
     304              : void
     305         5636 : DefaultResolver::visit (AST::EnumItemTuple &item)
     306              : {
     307         5636 :   auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     308              : 
     309         5636 :   ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     310              :                            inner_fn);
     311         5636 : }
     312              : 
     313              : void
     314          655 : DefaultResolver::visit (AST::EnumItemStruct &item)
     315              : {
     316          655 :   auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     317              : 
     318          655 :   ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     319              :                            inner_fn);
     320          655 : }
     321              : 
     322              : void
     323         2232 : DefaultResolver::visit (AST::EnumItemDiscriminant &item)
     324              : {
     325         2232 :   auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     326              : 
     327         2232 :   ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     328              :                            inner_fn);
     329         2232 : }
     330              : 
     331              : void
     332         6468 : DefaultResolver::visit (AST::Enum &type)
     333              : {
     334         6468 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     335              : 
     336        12936 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     337         6468 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_identifier (),
     338              :                              std::move (inner_fn_1));
     339        12936 :   };
     340              : 
     341        12936 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     342        19404 :               inner_fn_2, type.get_identifier ());
     343         6468 : }
     344              : 
     345              : void
     346          843 : DefaultResolver::visit (AST::Union &type)
     347              : {
     348          843 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     349              : 
     350         1686 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     351          843 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_identifier (),
     352              :                              std::move (inner_fn_1));
     353         1686 :   };
     354              : 
     355         1686 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     356         2529 :               inner_fn_2, type.get_identifier ());
     357          843 : }
     358              : 
     359              : void
     360       189745 : DefaultResolver::visit (AST::TypeAlias &type)
     361              : {
     362       189745 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     363              : 
     364       379490 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     365       189745 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_new_type_name (),
     366              :                              std::move (inner_fn_1));
     367       379490 :   };
     368              : 
     369       379490 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     370       569235 :               inner_fn_2, type.get_new_type_name ());
     371       189745 : }
     372              : 
     373              : void
     374        23028 : DefaultResolver::visit_closure_params (AST::ClosureExpr &expr)
     375              : {
     376        50283 :   for (auto &param : expr.get_params ())
     377        27255 :     visit (param);
     378        23028 : }
     379              : 
     380              : void
     381        23028 : DefaultResolver::visit (AST::ClosureExpr &expr)
     382              : {
     383        46056 :   auto expr_fn = [this, &expr] () {
     384        23028 :     visit_closure_params (expr);
     385        23028 :     visit (expr.get_definition_expr ());
     386        46056 :   };
     387              : 
     388        23028 :   visit_outer_attrs (expr);
     389              : 
     390        23028 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), expr_fn);
     391        23028 : }
     392              : 
     393              : void
     394        22776 : DefaultResolver::visit (AST::ClosureExprInner &expr)
     395              : {
     396        22776 :   if (expr.is_marked_for_strip ())
     397              :     return;
     398              : 
     399        22776 :   visit (static_cast<AST::ClosureExpr &> (expr));
     400              : }
     401              : 
     402              : void
     403          252 : DefaultResolver::visit (AST::ClosureExprInnerTyped &expr)
     404              : {
     405          252 :   if (expr.is_marked_for_strip ())
     406              :     return;
     407              : 
     408          252 :   visit (static_cast<AST::ClosureExpr &> (expr));
     409          252 :   visit (expr.get_return_type ());
     410              : }
     411              : 
     412              : void
     413       320081 : DefaultResolver::visit (AST::MatchExpr &expr)
     414              : {
     415       320081 :   if (expr.is_marked_for_strip ())
     416              :     return;
     417              : 
     418       320081 :   AST::DefaultASTVisitor::visit (expr);
     419              : }
     420              : 
     421              : void
     422      3316841 : DefaultResolver::visit (AST::MatchCase &cas)
     423              : {
     424      3316841 :   auto vis = [this, &cas] () { AST::DefaultASTVisitor::visit (cas); };
     425              : 
     426      3316841 :   ctx.scoped (Rib::Kind::Normal, cas.get_node_id (), vis);
     427      3316840 : }
     428              : 
     429              : void
     430        54117 : DefaultResolver::visit (AST::ConstantItem &item)
     431              : {
     432        54117 :   auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     433              : 
     434       108234 :   auto expr_vis_2 = [this, &item, &expr_vis_1] () {
     435        54117 :     ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     436              :                              std::move (expr_vis_1));
     437       108234 :   };
     438              : 
     439              :   // FIXME: Why do we need a Rib here?
     440        54117 :   ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis_2);
     441        54117 : }
     442              : 
     443              : void
     444         2933 : DefaultResolver::visit (AST::StaticItem &item)
     445              : {
     446         2933 :   auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     447              : 
     448         5866 :   auto expr_vis_2 = [this, &item, &expr_vis_1] () {
     449         2933 :     ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     450              :                              std::move (expr_vis_1));
     451         5866 :   };
     452              : 
     453              :   // FIXME: Why do we need a Rib here?
     454         2933 :   ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis_2);
     455         2933 : }
     456              : 
     457              : void
     458       608645 : DefaultResolver::visit (AST::TypeParam &param)
     459              : {
     460      1217290 :   auto param_ban_vis = [this, &param] () {
     461       608645 :     visit_outer_attrs (param);
     462       608645 :     if (param.has_type ())
     463         4964 :       visit (param.get_type ());
     464      1217290 :   };
     465              : 
     466       608645 :   ctx.scoped (Rib::Kind::ForwardTypeParamBan, param.get_node_id (),
     467      1217290 :               param_ban_vis);
     468              : 
     469       777940 :   for (auto &bound : param.get_type_param_bounds ())
     470       169295 :     visit (bound);
     471       608645 : }
     472              : 
     473              : void
     474          195 : DefaultResolver::visit_extern_crate (AST::ExternCrate &extern_crate,
     475              :                                      AST::Crate &crate, CrateNum num)
     476              : {
     477              :   // We do *NOT* visit the crate because loaded crates are resolved
     478              :   // independently.
     479          195 : }
     480              : 
     481              : void
     482          375 : DefaultResolver::visit (AST::ExternCrate &crate)
     483              : {
     484          375 :   auto &mappings = Analysis::Mappings::get ();
     485          375 :   tl::optional<CrateNum> num_opt;
     486          375 :   if (crate.get_referenced_crate () == "self")
     487            6 :     num_opt = mappings.get_current_crate ();
     488              :   else
     489          369 :     num_opt = mappings.lookup_crate_name (crate.get_referenced_crate ());
     490              : 
     491          375 :   if (!num_opt)
     492              :     {
     493            9 :       rust_error_at (crate.get_locus (), "unknown crate %qs",
     494            9 :                      crate.get_referenced_crate ().c_str ());
     495            9 :       return;
     496              :     }
     497              : 
     498          366 :   CrateNum num = *num_opt;
     499              : 
     500          366 :   AST::Crate &referenced_crate = mappings.get_ast_crate (num);
     501              : 
     502          366 :   auto sub_visitor_1
     503          366 :     = [&, this] () { visit_extern_crate (crate, referenced_crate, num); };
     504              : 
     505          732 :   auto sub_visitor_2 = [&] () {
     506          366 :     ctx.canonical_ctx.scope_crate (referenced_crate.get_node_id (),
     507          366 :                                    crate.get_referenced_crate () == "self"
     508            6 :                                      ? mappings.get_current_crate_name ()
     509              :                                      : crate.get_referenced_crate (),
     510              :                                    std::move (sub_visitor_1));
     511          732 :   };
     512              : 
     513          366 :   if (crate.has_as_clause ())
     514          108 :     ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
     515          162 :                 sub_visitor_2, crate.get_as_clause ());
     516              :   else
     517          312 :     ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
     518          936 :                 sub_visitor_2, crate.get_referenced_crate ());
     519              : }
     520              : 
     521              : } // namespace Resolver2_0
     522              : } // namespace Rust
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.