|
|
|
@ -3613,50 +3613,86 @@ static void edit_params(aflcc_state_t *aflcc, u32 argc, char **argv,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Main entry point */
|
|
|
|
|
int main(int argc, char **argv, char **envp) {
|
|
|
|
|
|
|
|
|
|
aflcc_state_t *aflcc = malloc(sizeof(aflcc_state_t));
|
|
|
|
|
aflcc_state_init(aflcc, (u8 *)argv[0]);
|
|
|
|
|
|
|
|
|
|
check_environment_vars(envp);
|
|
|
|
|
|
|
|
|
|
find_built_deps(aflcc);
|
|
|
|
|
|
|
|
|
|
compiler_mode_by_callname(aflcc);
|
|
|
|
|
compiler_mode_by_environ(aflcc);
|
|
|
|
|
compiler_mode_by_cmdline(aflcc, argc, argv);
|
|
|
|
|
|
|
|
|
|
instrument_mode_by_environ(aflcc);
|
|
|
|
|
|
|
|
|
|
mode_final_checkout(aflcc, argc, argv);
|
|
|
|
|
|
|
|
|
|
process_params(aflcc, 1, argc, argv);
|
|
|
|
|
|
|
|
|
|
maybe_usage(aflcc, argc, argv);
|
|
|
|
|
classDiagram
|
|
|
|
|
class AFLCCMain {
|
|
|
|
|
+main(argc, argv, envp)
|
|
|
|
|
+initializeState()
|
|
|
|
|
+checkEnvironmentVariables()
|
|
|
|
|
+findDependencies()
|
|
|
|
|
+determineCompilerMode()
|
|
|
|
|
+determineInstrumentationMode()
|
|
|
|
|
+finalizeMode()
|
|
|
|
|
+processParameters()
|
|
|
|
|
+maybeShowUsage()
|
|
|
|
|
+notifyMode()
|
|
|
|
|
+debugArguments()
|
|
|
|
|
+editParameters()
|
|
|
|
|
+executeCompiler()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mode_notification(aflcc);
|
|
|
|
|
class AFLCCState {
|
|
|
|
|
-cc_params: char**
|
|
|
|
|
-cc_par_cnt: u32
|
|
|
|
|
-passthrough: u8
|
|
|
|
|
-debug: u8
|
|
|
|
|
+aflcc_state_init(state, prog_name)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (aflcc->debug) debugf_args(argc, argv);
|
|
|
|
|
class EnvironmentChecker {
|
|
|
|
|
+check_environment_vars(envp)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
edit_params(aflcc, argc, argv, envp);
|
|
|
|
|
class DependencyFinder {
|
|
|
|
|
+find_built_deps(aflcc)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (aflcc->debug)
|
|
|
|
|
debugf_args((s32)aflcc->cc_par_cnt, (char **)aflcc->cc_params);
|
|
|
|
|
class CompilerModeHandler {
|
|
|
|
|
+compiler_mode_by_callname(aflcc)
|
|
|
|
|
+compiler_mode_by_environ(aflcc)
|
|
|
|
|
+compiler_mode_by_cmdline(aflcc, argc, argv)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (aflcc->passthrough) {
|
|
|
|
|
class InstrumentationModeHandler {
|
|
|
|
|
+instrument_mode_by_environ(aflcc)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
argv[0] = aflcc->cc_params[0];
|
|
|
|
|
execvp(aflcc->cc_params[0], (char **)argv);
|
|
|
|
|
class ModeFinalizer {
|
|
|
|
|
+mode_final_checkout(aflcc, argc, argv)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
class ParameterProcessor {
|
|
|
|
|
+process_params(aflcc, start_idx, argc, argv)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
execvp(aflcc->cc_params[0], (char **)aflcc->cc_params);
|
|
|
|
|
class UsageNotifier {
|
|
|
|
|
+maybe_usage(aflcc, argc, argv)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
class ModeNotifier {
|
|
|
|
|
+mode_notification(aflcc)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FATAL("Oops, failed to execute '%s' - check your PATH", aflcc->cc_params[0]);
|
|
|
|
|
class Debugger {
|
|
|
|
|
+debugf_args(argc, argv)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
class ParameterEditor {
|
|
|
|
|
+edit_params(aflcc, argc, argv, envp)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
class Executor {
|
|
|
|
|
+execute_compiler(aflcc, argv)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AFLCCMain --> AFLCCState : 使用
|
|
|
|
|
AFLCCMain --> EnvironmentChecker : 使用
|
|
|
|
|
AFLCCMain --> DependencyFinder : 使用
|
|
|
|
|
AFLCCMain --> CompilerModeHandler : 使用
|
|
|
|
|
AFLCCMain --> InstrumentationModeHandler : 使用
|
|
|
|
|
AFLCCMain --> ModeFinalizer : 使用
|
|
|
|
|
AFLCCMain --> ParameterProcessor : 使用
|
|
|
|
|
AFLCCMain --> UsageNotifier : 使用
|
|
|
|
|
AFLCCMain --> ModeNotifier : 使用
|
|
|
|
|
AFLCCMain --> Debugger : 使用
|
|
|
|
|
AFLCCMain --> ParameterEditor : 使用
|
|
|
|
|
AFLCCMain --> Executor : 使用
|