mirror of
https://github.com/zeek/zeek.git
synced 2025-10-05 08:08:19 +00:00
replace --optimize-only with --optimize-funcs and --optimize-files
This commit is contained in:
parent
aa91f72b34
commit
9069e744f9
8 changed files with 176 additions and 125 deletions
|
@ -6,6 +6,8 @@
|
|||
|
||||
#include "zeek/script_opt/CPP/Compile.h"
|
||||
|
||||
extern std::unordered_set<std::string> files_with_conditionals;
|
||||
|
||||
namespace zeek::detail
|
||||
{
|
||||
|
||||
|
@ -72,29 +74,48 @@ void CPPCompile::Compile(bool report_uncompilable)
|
|||
|
||||
GenProlog();
|
||||
|
||||
unordered_set<string> filenames_reported_as_skipped;
|
||||
|
||||
// Determine which functions we can call directly, and reuse
|
||||
// previously compiled instances of those if present.
|
||||
for ( const auto& func : funcs )
|
||||
for ( auto& func : funcs )
|
||||
{
|
||||
const auto& f = func.Func();
|
||||
|
||||
auto& ofiles = analysis_options.only_files;
|
||||
string fn = func.Body()->GetLocationInfo()->filename;
|
||||
|
||||
if ( ! func.ShouldSkip() && ! ofiles.empty() && files_with_conditionals.count(fn) > 0 )
|
||||
{
|
||||
if ( filenames_reported_as_skipped.count(fn) == 0 )
|
||||
{
|
||||
reporter->Warning(
|
||||
"skipping compilation of files in %s due to presence of conditional code",
|
||||
fn.c_str());
|
||||
filenames_reported_as_skipped.insert(fn);
|
||||
}
|
||||
|
||||
func.SetSkip(true);
|
||||
}
|
||||
|
||||
if ( func.ShouldSkip() )
|
||||
{
|
||||
not_fully_compilable.insert(func.Func()->Name());
|
||||
not_fully_compilable.insert(f->Name());
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( func.Func()->Flavor() != FUNC_FLAVOR_FUNCTION )
|
||||
// Can't be called directly.
|
||||
continue;
|
||||
|
||||
const char* reason;
|
||||
if ( IsCompilable(func, &reason) )
|
||||
compilable_funcs.insert(BodyName(func));
|
||||
{
|
||||
if ( f->Flavor() == FUNC_FLAVOR_FUNCTION )
|
||||
// Note this as a callable compiled function.
|
||||
compilable_funcs.insert(BodyName(func));
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( reason && report_uncompilable )
|
||||
fprintf(stderr, "%s cannot be compiled to C++ due to %s\n", func.Func()->Name(),
|
||||
reason);
|
||||
not_fully_compilable.insert(func.Func()->Name());
|
||||
fprintf(stderr, "%s cannot be compiled to C++ due to %s\n", f->Name(), reason);
|
||||
not_fully_compilable.insert(f->Name());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -105,7 +126,6 @@ void CPPCompile::Compile(bool report_uncompilable)
|
|||
types.AddKey(tp, pfs.HashType(t));
|
||||
}
|
||||
|
||||
// ### This doesn't work for -O add-C++
|
||||
Emit("TypePtr types__CPP[%s];", Fmt(static_cast<int>(types.DistinctKeys().size())));
|
||||
|
||||
NL();
|
||||
|
|
|
@ -162,17 +162,7 @@ about associated expressions/statements, making them hard to puzzle out.
|
|||
This could be fixed, but would add execution overhead in passing around
|
||||
the necessary strings / `Location` objects.
|
||||
|
||||
* Subtle bugs can arise when compiling code that uses `@if` conditional
|
||||
compilation. The compiled code will not directly use the wrong instance
|
||||
of a script body (one that differs due to the `@if` conditional having a
|
||||
different resolution at compile time versus later run-time). However, if
|
||||
compiled code itself calls a function that has conditional code, the
|
||||
compiled code will always call the version of the function present during
|
||||
compilation, rather than the run-time version. This problem can be fixed
|
||||
at the cost of making all function calls more expensive (perhaps a measure
|
||||
that requires an explicit flag to activate); or, when possible, by modifying
|
||||
the conditional code to check the condition at run-time rather than at
|
||||
compile-time.
|
||||
* To avoid subtle bugs, the compiler will refrain from compiling script elements (functions, hooks, event handlers) that include conditional code. In addition, when using `--optimize-files` it will not compile any functions appearing in a source file that includes conditional code (even if it's not in a function body).
|
||||
|
||||
* Code compiled with `-O gen-standalone-C++` will not execute any global
|
||||
statements when invoked using the "stand-in" script. The right fix for
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue