}
// Process the compiler options into options suitable for passing to the
-// preprocessor and the real compiler. The preprocessor options don't include
-// -E; this is added later. Returns true on success, otherwise false.
+// preprocessor and the real compiler. preprocessor_args does't include -E;
+// this is added later. extra_args_to_hash are the arguments that are not
+// included in preprocessor_args but that should be included in the hash.
+//
+// Returns true on success, otherwise false.
bool
cc_process_args(struct args* args,
struct args** preprocessor_args,
+ struct args** extra_args_to_hash,
struct args** compiler_args)
{
bool found_c_opt = false;
*preprocessor_args = args_copy(common_args);
args_extend(*preprocessor_args, cpp_args);
+ if (extra_args_to_hash) {
+ *extra_args_to_hash = compiler_only_args;
+ }
+
out:
args_free(expanded_args);
args_free(common_args);
// Arguments (except -E) to send to the preprocessor.
struct args* preprocessor_args;
+ // Arguments not sent to the preprocessor but that should be part of the
+ // hash.
+ struct args* extra_args_to_hash;
// Arguments to send to the real compiler.
struct args* compiler_args;
MTR_BEGIN("main", "process_args");
- if (!cc_process_args(orig_args, &preprocessor_args, &compiler_args)) {
+ if (!cc_process_args(
+ orig_args, &preprocessor_args, &extra_args_to_hash, &compiler_args)) {
failed();
}
MTR_END("main", "process_args");
struct hash* direct_hash = hash_copy(common_hash);
init_hash_debug(direct_hash, output_obj, 'd', "DIRECT MODE", debug_text_file);
+ struct args* args_to_hash = args_copy(preprocessor_args);
+ args_extend(args_to_hash, extra_args_to_hash);
+
bool put_result_in_manifest = false;
struct digest* result_name = NULL;
struct digest* result_name_from_manifest = NULL;
if (g_config.direct_mode()) {
cc_log("Trying direct lookup");
MTR_BEGIN("hash", "direct_hash");
- result_name = calculate_result_name(preprocessor_args, direct_hash, 1);
+ result_name = calculate_result_name(args_to_hash, direct_hash, 1);
MTR_END("hash", "direct_hash");
if (result_name) {
update_cached_result_globals(result_name);
cpp_hash, output_obj, 'p', "PREPROCESSOR MODE", debug_text_file);
MTR_BEGIN("hash", "cpp_hash");
- result_name = calculate_result_name(preprocessor_args, cpp_hash, 0);
+ result_name = calculate_result_name(args_to_hash, cpp_hash, 0);
MTR_END("hash", "cpp_hash");
if (!result_name) {
fatal("internal error: calculate_result_name returned NULL for cpp");
struct args *preprocessed, *compiler;
create_file("foo.c", "");
- CHECK(!cc_process_args(orig, &preprocessed, &compiler));
+ CHECK(!cc_process_args(orig, &preprocessed, NULL, &compiler));
CHECK_INT_EQ(1, stats_get_pending(STATS_PREPROCESSING));
args_free(orig);
struct args *preprocessed, *compiler;
create_file("foo.c", "");
- CHECK(!cc_process_args(orig, &preprocessed, &compiler));
+ CHECK(!cc_process_args(orig, &preprocessed, NULL, &compiler));
CHECK_INT_EQ(1, stats_get_pending(STATS_UNSUPPORTED_OPTION));
args_free(orig);
struct args *act_cpp = NULL, *act_cc = NULL;
create_file("foo.c", "");
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
create_file("foo.c", "");
g_config.set_run_second_cpp(false);
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
create_file("foo.c", "");
g_config.set_run_second_cpp(true);
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
struct args *act_cpp = NULL, *act_cc = NULL;
create_file("foo.c", "");
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
orig = args_init_from_string(arg_string);
free(arg_string);
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_STR_EQ(act_cpp->argv[1], "--sysroot=./foo/bar");
args_free(orig);
orig = args_init_from_string(arg_string);
free(arg_string);
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_STR_EQ(act_cpp->argv[1], "--sysroot");
CHECK_STR_EQ(act_cpp->argv[2], "./foo");
struct args *act_cpp = NULL, *act_cc = NULL;
create_file("foo.c", "");
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
struct args *act_cpp = NULL, *act_cc = NULL;
create_file("foo.c", "");
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
struct args *act_cpp = NULL, *act_cc = NULL;
create_file("foo.c", "");
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
struct args *act_cpp = NULL, *act_cc = NULL;
create_file("foo.c", "");
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
struct args *act_cpp = NULL, *act_cc = NULL;
create_file("foo.c", "");
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
struct args *act_cpp = NULL, *act_cc = NULL;
create_file("foo.c", "");
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
struct args *act_cpp = NULL, *act_cc = NULL;
create_file("foo.c", "");
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
args_add(exp_cc, "-c");
free(s);
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
create_file("foo.c", "");
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
orig = args_init_from_string(arg_string);
free(arg_string);
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_STR_EQ("./foo", act_cpp->argv[2]);
args_free(orig);
orig = args_init_from_string(arg_string);
free(arg_string);
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_STR_EQ("-isystem./foo", act_cpp->argv[1]);
free(cwd);
orig = args_init_from_string(arg_string);
free(arg_string);
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_STR_EQ("-I./foo", act_cpp->argv[1]);
free(cwd);
struct args* act_cc = NULL;
create_file("foo.c", "");
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
struct args* act_cc = NULL;
create_file("foo.c", "");
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, NULL, &act_cc));
CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
struct args* orig = args_init_from_string(
"cc -Wa,foo foo.c -g -c -DX -Werror -Xlinker fie -Xlinker,fum -Wno-error");
struct args* exp_cpp = args_init_from_string("cc -g -DX");
+ struct args* exp_extra = args_init_from_string(
+ " -Wa,foo -Werror -Xlinker fie -Xlinker,fum -Wno-error");
struct args* exp_cc = args_init_from_string(
"cc -g -Wa,foo -Werror -Xlinker fie -Xlinker,fum -Wno-error -DX -c");
struct args* act_cpp = NULL;
+ struct args* act_extra = NULL;
struct args* act_cc = NULL;
create_file("foo.c", "");
- CHECK(cc_process_args(orig, &act_cpp, &act_cc));
+ CHECK(cc_process_args(orig, &act_cpp, &act_extra, &act_cc));
CHECK_ARGS_EQ_FREE12(exp_cpp, act_cpp);
+ CHECK_ARGS_EQ_FREE12(exp_extra, act_extra);
CHECK_ARGS_EQ_FREE12(exp_cc, act_cc);
args_free(orig);