diff --git a/clang/test/Index/record-completion-invocation.c b/clang/test/Index/record-completion-invocation.c --- a/clang/test/Index/record-completion-invocation.c +++ b/clang/test/Index/record-completion-invocation.c @@ -8,4 +8,4 @@ // RUN: env LIBCLANG_DISABLE_CRASH_RECOVERY=1 CINDEXTEST_INVOCATION_EMISSION_PATH=%t not --crash c-index-test -code-completion-at=%s:10:1 "-remap-file=%s,%S/Inputs/record-parsing-invocation-remap.c" %s // RUN: cat %t/libclang-* | FileCheck %s -// CHECK: {"toolchain":"{{.*}}","libclang.operation":"complete","libclang.opts":1,"args":["clang","-fno-spell-checking","{{.*}}record-completion-invocation.c","-Xclang","-detailed-preprocessing-record","-fallow-editor-placeholders"],"invocation-args":["-code-completion-at={{.*}}record-completion-invocation.c:10:1"],"unsaved_file_hashes":[{"name":"{{.*}}record-completion-invocation.c","md5":"aee23773de90e665992b48209351d70e"}]} +// CHECK: {"toolchain":"{{.*}}","libclang.operation":"complete","libclang.opts":1,"args":["{{.*}}c-index-test","-fno-spell-checking","{{.*}}record-completion-invocation.c","-Xclang","-detailed-preprocessing-record","-fallow-editor-placeholders"],"invocation-args":["-code-completion-at={{.*}}record-completion-invocation.c:10:1"],"unsaved_file_hashes":[{"name":"{{.*}}record-completion-invocation.c","md5":"aee23773de90e665992b48209351d70e"}]} diff --git a/clang/test/Index/record-parsing-invocation.c b/clang/test/Index/record-parsing-invocation.c --- a/clang/test/Index/record-parsing-invocation.c +++ b/clang/test/Index/record-parsing-invocation.c @@ -24,5 +24,5 @@ # pragma clang __debug parser_crash #endif -// CHECK: {"toolchain":"{{.*}}","libclang.operation":"parse","libclang.opts":1,"args":["clang","-fno-spell-checking","{{.*}}record-parsing-invocation.c","-Xclang","-detailed-preprocessing-record","-fallow-editor-placeholders"]} -// CHECK-UNSAVED: {"toolchain":"{{.*}}","libclang.operation":"parse","libclang.opts":1,"args":["clang","-fno-spell-checking","{{.*}}record-parsing-invocation.c","-Xclang","-detailed-preprocessing-record","-fallow-editor-placeholders"],"unsaved_file_hashes":[{"name":"{{.*}}record-parsing-invocation.c","md5":"aee23773de90e665992b48209351d70e"}]} +// CHECK: {"toolchain":"{{.*}}","libclang.operation":"parse","libclang.opts":1,"args":["{{.*}}c-index-test","-fno-spell-checking","{{.*}}record-parsing-invocation.c","-Xclang","-detailed-preprocessing-record","-fallow-editor-placeholders"]} +// CHECK-UNSAVED: {"toolchain":"{{.*}}","libclang.operation":"parse","libclang.opts":1,"args":["{{.*}}c-index-test","-fno-spell-checking","{{.*}}record-parsing-invocation.c","-Xclang","-detailed-preprocessing-record","-fallow-editor-placeholders"],"unsaved_file_hashes":[{"name":"{{.*}}record-parsing-invocation.c","md5":"aee23773de90e665992b48209351d70e"}]} diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c --- a/clang/tools/c-index-test/c-index-test.c +++ b/clang/tools/c-index-test/c-index-test.c @@ -1,15 +1,16 @@ /* c-index-test.c */ -#include "clang/Config/config.h" -#include "clang-c/Index.h" -#include "clang-c/CXCompilationDatabase.h" #include "clang-c/BuildSystem.h" +#include "clang-c/CXCompilationDatabase.h" #include "clang-c/Documentation.h" +#include "clang-c/Index.h" +#include "clang/Config/config.h" +#include #include -#include +#include #include +#include #include -#include #ifdef CLANG_HAVE_LIBXML #include @@ -64,6 +65,15 @@ extern char *dirname(char *); #endif +static void PrependArgv0(const char *argv0, int argc, const char **argv, + const char **Out) { + int I; + assert(Out != 0); + Out[0] = argv0; + for (I = 1; I < argc + 1; ++I) + Out[I] = argv[I - 1]; +} + /** Return the default parsing options. */ static unsigned getDefaultParsingOptions() { unsigned options = CXTranslationUnit_DetailedPreprocessingRecord; @@ -1834,7 +1844,7 @@ /* Target information testing. */ /******************************************************************************/ -static int print_target_info(int argc, const char **argv) { +static int print_target_info(const char *argv0, int argc, const char **argv) { CXIndex Idx; CXTranslationUnit TU; CXTargetInfo TargetInfo; @@ -1842,6 +1852,8 @@ const char *FileName; enum CXErrorCode Err; int PointerWidth; + const char **ParseArgv; + int ParseArgc; if (argc == 0) { fprintf(stderr, "No filename specified\n"); @@ -1850,13 +1862,19 @@ FileName = argv[1]; + ParseArgc = argc + 1; + ParseArgv = malloc(sizeof(char *) * ParseArgc); + PrependArgv0(argv0, ParseArgc - 1, argv, ParseArgv); + Idx = clang_createIndex(0, 1); - Err = clang_parseTranslationUnit2(Idx, FileName, argv, argc, NULL, 0, - getDefaultParsingOptions(), &TU); + Err = clang_parseTranslationUnit2FullArgv(Idx, FileName, ParseArgv, ParseArgc, + NULL, 0, getDefaultParsingOptions(), + &TU); if (Err != CXError_Success) { fprintf(stderr, "Couldn't parse translation unit!\n"); describeLibclangFailure(Err); clang_disposeIndex(Idx); + free(ParseArgv); return 1; } @@ -1872,6 +1890,7 @@ clang_TargetInfo_dispose(TargetInfo); clang_disposeTranslationUnit(TU); clang_disposeIndex(Idx); + free(ParseArgv); return 0; } @@ -1956,7 +1975,7 @@ return result; } -int perform_test_load_source(int argc, const char **argv, +int perform_test_load_source(const char *argv0, int argc, const char **argv, const char *filter, CXCursorVisitor Visitor, PostVisitTU PV) { CXIndex Idx; @@ -1969,6 +1988,8 @@ unsigned Repeats = 0; unsigned I; const char *InvocationPath; + const char **ParseArgv; + int ParseArgc; Idx = clang_createIndex(/* excludeDeclsFromPCH */ (!strcmp(filter, "local") || @@ -1994,16 +2015,19 @@ if (getenv("CINDEXTEST_EDITING")) Repeats = 5; - Err = clang_parseTranslationUnit2(Idx, 0, - argv + num_unsaved_files, - argc - num_unsaved_files, - unsaved_files, num_unsaved_files, - getDefaultParsingOptions(), &TU); + ParseArgc = argc - num_unsaved_files + 1; + ParseArgv = malloc(sizeof(char *) * ParseArgc); + PrependArgv0(argv0, ParseArgc - 1, argv + num_unsaved_files, ParseArgv); + + Err = clang_parseTranslationUnit2FullArgv(Idx, 0, ParseArgv, ParseArgc, + unsaved_files, num_unsaved_files, + getDefaultParsingOptions(), &TU); if (Err != CXError_Success) { fprintf(stderr, "Unable to load translation unit!\n"); describeLibclangFailure(Err); free_remapped_files(unsaved_files, num_unsaved_files); clang_disposeIndex(Idx); + free(ParseArgv); return 1; } @@ -2020,6 +2044,7 @@ describeLibclangFailure(Err); free_remapped_files(unsaved_files, num_unsaved_files); clang_disposeIndex(Idx); + free(ParseArgv); return 1; } } @@ -2029,12 +2054,13 @@ CommentSchemaFile); free_remapped_files(unsaved_files, num_unsaved_files); clang_disposeIndex(Idx); + free(ParseArgv); return result; } -int perform_test_reparse_source(int argc, const char **argv, int trials, - const char *filter, CXCursorVisitor Visitor, - PostVisitTU PV) { +int perform_test_reparse_source(const char *argv0, int argc, const char **argv, + int trials, const char *filter, + CXCursorVisitor Visitor, PostVisitTU PV) { CXIndex Idx; CXTranslationUnit TU; struct CXUnsavedFile *unsaved_files = 0; @@ -2045,7 +2071,9 @@ int trial; int remap_after_trial = 0; char *endptr = 0; - + const char **ParseArgv; + int ParseArgc; + Idx = clang_createIndex(/* excludeDeclsFromPCH */ !strcmp(filter, "local") ? 1 : 0, /* displayDiagnostics=*/1); @@ -2063,18 +2091,21 @@ compiler_arg_idx = i+1; if (num_unsaved_files > compiler_arg_idx) compiler_arg_idx = num_unsaved_files; - + + ParseArgc = argc - compiler_arg_idx + 1; + ParseArgv = malloc(sizeof(char *) * ParseArgc); + PrependArgv0(argv0, ParseArgc - 1, argv + compiler_arg_idx, ParseArgv); + /* Load the initial translation unit -- we do this without honoring remapped * files, so that we have a way to test results after changing the source. */ - Err = clang_parseTranslationUnit2(Idx, 0, - argv + compiler_arg_idx, - argc - compiler_arg_idx, - 0, 0, getDefaultParsingOptions(), &TU); + Err = clang_parseTranslationUnit2FullArgv(Idx, 0, ParseArgv, ParseArgc, 0, 0, + getDefaultParsingOptions(), &TU); if (Err != CXError_Success) { fprintf(stderr, "Unable to load translation unit!\n"); describeLibclangFailure(Err); free_remapped_files(unsaved_files, num_unsaved_files); clang_disposeIndex(Idx); + free(ParseArgv); return 1; } @@ -2092,6 +2123,7 @@ &unsaved_files, &num_unsaved_files)) { clang_disposeTranslationUnit(TU); clang_disposeIndex(Idx); + free(ParseArgv); return -1; } @@ -2106,6 +2138,7 @@ clang_disposeTranslationUnit(TU); free_remapped_files(unsaved_files, num_unsaved_files); clang_disposeIndex(Idx); + free(ParseArgv); return -1; } @@ -2117,10 +2150,11 @@ free_remapped_files(unsaved_files, num_unsaved_files); clang_disposeIndex(Idx); + free(ParseArgv); return result; } -static int perform_single_file_parse(const char *filename) { +static int perform_single_file_parse(const char *argv0, const char *filename) { CXIndex Idx; CXTranslationUnit TU; enum CXErrorCode Err; @@ -2129,12 +2163,11 @@ Idx = clang_createIndex(/* excludeDeclsFromPCH */1, /* displayDiagnostics=*/1); - Err = clang_parseTranslationUnit2(Idx, filename, - /*command_line_args=*/NULL, - /*num_command_line_args=*/0, - /*unsaved_files=*/NULL, - /*num_unsaved_files=*/0, - CXTranslationUnit_SingleFileParse, &TU); + Err = clang_parseTranslationUnit2FullArgv( + Idx, filename, /*command_line_args=*/&argv0, + /*num_command_line_args=*/1, + /*unsaved_files=*/NULL, + /*num_unsaved_files=*/0, CXTranslationUnit_SingleFileParse, &TU); if (Err != CXError_Success) { fprintf(stderr, "Unable to load translation unit!\n"); describeLibclangFailure(Err); @@ -2580,6 +2613,8 @@ unsigned I, Repeats = 1; unsigned completionOptions = clang_defaultCodeCompleteOptions(); const char *InvocationPath; + const char **ParseArgv; + int ParseArgc; if (getenv("CINDEXTEST_CODE_COMPLETE_PATTERNS")) completionOptions |= CXCodeComplete_IncludeCodePatterns; @@ -2610,13 +2645,16 @@ if (getenv("CINDEXTEST_EDITING")) Repeats = 5; - Err = clang_parseTranslationUnit2(CIdx, 0, - argv + num_unsaved_files + 2, - argc - num_unsaved_files - 2, - 0, 0, getDefaultParsingOptions(), &TU); + ParseArgc = argc - num_unsaved_files - 1; + ParseArgv = malloc(sizeof(char *) * ParseArgc); + PrependArgv0(argv[0], ParseArgc - 1, argv + num_unsaved_files + 2, ParseArgv); + + Err = clang_parseTranslationUnit2FullArgv(CIdx, 0, ParseArgv, ParseArgc, 0, 0, + getDefaultParsingOptions(), &TU); if (Err != CXError_Success) { fprintf(stderr, "Unable to load translation unit!\n"); describeLibclangFailure(Err); + free(ParseArgv); return 1; } @@ -2627,6 +2665,7 @@ fprintf(stderr, "Unable to reparse translation unit!\n"); describeLibclangFailure(Err); clang_disposeTranslationUnit(TU); + free(ParseArgv); return 1; } @@ -2702,6 +2741,7 @@ free_remapped_files(unsaved_files, num_unsaved_files); + free(ParseArgv); return 0; } @@ -2727,7 +2767,9 @@ unsigned NumLocations = 0, Loc; unsigned Repeats = 1; unsigned I; - + int ParseArgc; + const char **ParseArgv; + /* Count the number of locations. */ while (strstr(argv[NumLocations+1], locations_flag) == argv[NumLocations+1]) ++NumLocations; @@ -2752,18 +2794,21 @@ if (getenv("CINDEXTEST_EDITING")) Repeats = 5; + ParseArgc = argc - num_unsaved_files - 1 - NumLocations; + ParseArgv = malloc(sizeof(char *) * ParseArgc); + PrependArgv0(argv[0], ParseArgc - 1, + argv + num_unsaved_files + 1 + NumLocations, ParseArgv); + /* Parse the translation unit. When we're testing clang_getCursor() after reparsing, don't remap unsaved files until the second parse. */ CIdx = clang_createIndex(1, 1); - Err = clang_parseTranslationUnit2(CIdx, argv[argc - 1], - argv + num_unsaved_files + 1 + NumLocations, - argc - num_unsaved_files - 2 - NumLocations, - unsaved_files, - Repeats > 1? 0 : num_unsaved_files, - getDefaultParsingOptions(), &TU); + Err = clang_parseTranslationUnit2FullArgv( + CIdx, argv[argc - 1], ParseArgv, ParseArgc, unsaved_files, + Repeats > 1 ? 0 : num_unsaved_files, getDefaultParsingOptions(), &TU); if (Err != CXError_Success) { fprintf(stderr, "unable to parse input\n"); describeLibclangFailure(Err); + free(ParseArgv); return -1; } @@ -2777,6 +2822,7 @@ if (Err != CXError_Success) { describeLibclangFailure(Err); clang_disposeTranslationUnit(TU); + free(ParseArgv); return 1; } } @@ -2808,6 +2854,7 @@ clang_disposeIndex(CIdx); free(Locations); free_remapped_files(unsaved_files, num_unsaved_files); + free(ParseArgv); return 0; } @@ -3021,7 +3068,9 @@ unsigned NumLocations = 0, Loc; unsigned Repeats = 1; unsigned I; - + const char **ParseArgv; + int ParseArgc; + /* Count the number of locations. */ while (strstr(argv[NumLocations+1], "-file-refs-at=") == argv[NumLocations+1]) ++NumLocations; @@ -3046,19 +3095,22 @@ if (getenv("CINDEXTEST_EDITING")) Repeats = 5; + ParseArgc = argc - num_unsaved_files - 1 - NumLocations; + ParseArgv = malloc(sizeof(char *) * ParseArgc); + PrependArgv0(argv[0], ParseArgc - 1, + argv + num_unsaved_files + 1 + NumLocations, ParseArgv); + /* Parse the translation unit. When we're testing clang_getCursor() after reparsing, don't remap unsaved files until the second parse. */ CIdx = clang_createIndex(1, 1); - Err = clang_parseTranslationUnit2(CIdx, argv[argc - 1], - argv + num_unsaved_files + 1 + NumLocations, - argc - num_unsaved_files - 2 - NumLocations, - unsaved_files, - Repeats > 1? 0 : num_unsaved_files, - getDefaultParsingOptions(), &TU); + Err = clang_parseTranslationUnit2FullArgv( + CIdx, argv[argc - 1], ParseArgv, ParseArgc, unsaved_files, + Repeats > 1 ? 0 : num_unsaved_files, getDefaultParsingOptions(), &TU); if (Err != CXError_Success) { fprintf(stderr, "unable to parse input\n"); describeLibclangFailure(Err); clang_disposeTranslationUnit(TU); + free(ParseArgv); return -1; } @@ -3072,6 +3124,7 @@ if (Err != CXError_Success) { describeLibclangFailure(Err); clang_disposeTranslationUnit(TU); + free(ParseArgv); return 1; } } @@ -3109,6 +3162,7 @@ clang_disposeIndex(CIdx); free(Locations); free_remapped_files(unsaved_files, num_unsaved_files); + free(ParseArgv); return 0; } @@ -3130,6 +3184,8 @@ unsigned NumFilenames = 0; unsigned Repeats = 1; unsigned I, FI; + const char **ParseArgv; + int ParseArgc; /* Count the number of locations. */ while (strstr(argv[NumFilenames+1], "-file-includes-in=") == argv[NumFilenames+1]) @@ -3152,20 +3208,23 @@ if (getenv("CINDEXTEST_EDITING")) Repeats = 2; + ParseArgc = argc - num_unsaved_files - 1 - NumFilenames; + ParseArgv = malloc(sizeof(char *) * ParseArgc); + PrependArgv0(argv[0], ParseArgc - 1, + argv + num_unsaved_files + 1 + NumFilenames, ParseArgv); + /* Parse the translation unit. When we're testing clang_getCursor() after reparsing, don't remap unsaved files until the second parse. */ CIdx = clang_createIndex(1, 1); - Err = clang_parseTranslationUnit2( - CIdx, argv[argc - 1], - argv + num_unsaved_files + 1 + NumFilenames, - argc - num_unsaved_files - 2 - NumFilenames, - unsaved_files, + Err = clang_parseTranslationUnit2FullArgv( + CIdx, argv[argc - 1], ParseArgv, ParseArgc, unsaved_files, Repeats > 1 ? 0 : num_unsaved_files, getDefaultParsingOptions(), &TU); if (Err != CXError_Success) { fprintf(stderr, "unable to parse input\n"); describeLibclangFailure(Err); clang_disposeTranslationUnit(TU); + free(ParseArgv); return -1; } @@ -3179,6 +3238,7 @@ if (Err != CXError_Success) { describeLibclangFailure(Err); clang_disposeTranslationUnit(TU); + free(ParseArgv); return 1; } } @@ -3209,6 +3269,7 @@ clang_disposeIndex(CIdx); free((void *)Filenames); free_remapped_files(unsaved_files, num_unsaved_files); + free(ParseArgv); return 0; } @@ -4060,6 +4121,8 @@ CXSourceRangeList *skipped_ranges = 0; enum CXErrorCode Err; unsigned i; + const char **ParseArgv; + int ParseArgc; input += strlen("-test-annotate-tokens="); if ((errorCode = parse_file_line_column(input, &filename, &line, &column, @@ -4071,19 +4134,21 @@ return -1; } + ParseArgc = argc - num_unsaved_files - 2; + ParseArgv = malloc(sizeof(char *) * ParseArgc); + PrependArgv0(argv[0], ParseArgc - 1, argv + num_unsaved_files + 2, ParseArgv); + CIdx = clang_createIndex(0, 1); - Err = clang_parseTranslationUnit2(CIdx, argv[argc - 1], - argv + num_unsaved_files + 2, - argc - num_unsaved_files - 3, - unsaved_files, - num_unsaved_files, - getDefaultParsingOptions(), &TU); + Err = clang_parseTranslationUnit2FullArgv( + CIdx, argv[argc - 1], ParseArgv, ParseArgc, unsaved_files, + num_unsaved_files, getDefaultParsingOptions(), &TU); if (Err != CXError_Success) { fprintf(stderr, "unable to parse input\n"); describeLibclangFailure(Err); clang_disposeIndex(CIdx); free(filename); free_remapped_files(unsaved_files, num_unsaved_files); + free(ParseArgv); return -1; } errorCode = 0; @@ -4199,6 +4264,7 @@ clang_disposeIndex(CIdx); free(filename); free_remapped_files(unsaved_files, num_unsaved_files); + free(ParseArgv); return errorCode; } @@ -4454,24 +4520,29 @@ /******************************************************************************/ /* Command line processing. */ /******************************************************************************/ -int write_pch_file(const char *filename, int argc, const char *argv[]) { +int write_pch_file(const char *argv0, const char *filename, int argc, + const char *argv[]) { CXIndex Idx; CXTranslationUnit TU; struct CXUnsavedFile *unsaved_files = 0; int num_unsaved_files = 0; enum CXErrorCode Err; int result = 0; - + const char **ParseArgv; + int ParseArgc; + Idx = clang_createIndex(/* excludeDeclsFromPCH */1, /* displayDiagnostics=*/1); - + if (parse_remapped_files(argc, argv, 0, &unsaved_files, &num_unsaved_files)) { clang_disposeIndex(Idx); return -1; } + ParseArgc = argc - num_unsaved_files + 1; + ParseArgv = malloc(sizeof(char *) * ParseArgc); + PrependArgv0(argv0, ParseArgc - 1, argv + num_unsaved_files, ParseArgv); - Err = clang_parseTranslationUnit2( - Idx, 0, argv + num_unsaved_files, argc - num_unsaved_files, - unsaved_files, num_unsaved_files, + Err = clang_parseTranslationUnit2FullArgv( + Idx, 0, ParseArgv, ParseArgc, unsaved_files, num_unsaved_files, CXTranslationUnit_Incomplete | CXTranslationUnit_DetailedPreprocessingRecord | CXTranslationUnit_ForSerialization, @@ -4482,6 +4553,7 @@ free_remapped_files(unsaved_files, num_unsaved_files); clang_disposeTranslationUnit(TU); clang_disposeIndex(Idx); + free(ParseArgv); return 1; } @@ -4512,6 +4584,7 @@ clang_disposeTranslationUnit(TU); free_remapped_files(unsaved_files, num_unsaved_files); clang_disposeIndex(Idx); + free(ParseArgv); return result; } @@ -4798,8 +4871,8 @@ CXCursorVisitor I = GetVisitor(argv[1] + 25); if (I) { int trials = atoi(argv[2]); - return perform_test_reparse_source(argc - 4, argv + 4, trials, argv[3], I, - NULL); + return perform_test_reparse_source(argv[0], argc - 4, argv + 4, trials, + argv[3], I, NULL); } } else if (argc >= 4 && strncmp(argv[1], "-test-load-source", 17) == 0) { @@ -4810,49 +4883,49 @@ postVisit = PrintMemoryUsage; if (I) - return perform_test_load_source(argc - 3, argv + 3, argv[2], I, + return perform_test_load_source(argv[0], argc - 3, argv + 3, argv[2], I, postVisit); } else if (argc >= 3 && strcmp(argv[1], "-single-file-parse") == 0) - return perform_single_file_parse(argv[2]); + return perform_single_file_parse(argv[0], argv[2]); else if (argc >= 4 && strcmp(argv[1], "-test-file-scan") == 0) return perform_file_scan(argv[2], argv[3], argc >= 5 ? argv[4] : 0); else if (argc > 2 && strstr(argv[1], "-test-annotate-tokens=") == argv[1]) return perform_token_annotation(argc, argv); else if (argc > 2 && strcmp(argv[1], "-test-inclusion-stack-source") == 0) - return perform_test_load_source(argc - 2, argv + 2, "all", NULL, + return perform_test_load_source(argv[0], argc - 2, argv + 2, "all", NULL, PrintInclusionStack); else if (argc > 2 && strcmp(argv[1], "-test-inclusion-stack-tu") == 0) return perform_test_load_tu(argv[2], "all", NULL, NULL, PrintInclusionStack); else if (argc > 2 && strcmp(argv[1], "-test-print-linkage-source") == 0) - return perform_test_load_source(argc - 2, argv + 2, "all", PrintLinkage, - NULL); + return perform_test_load_source(argv[0], argc - 2, argv + 2, "all", + PrintLinkage, NULL); else if (argc > 2 && strcmp(argv[1], "-test-print-visibility") == 0) - return perform_test_load_source(argc - 2, argv + 2, "all", PrintVisibility, - NULL); + return perform_test_load_source(argv[0], argc - 2, argv + 2, "all", + PrintVisibility, NULL); else if (argc > 2 && strcmp(argv[1], "-test-print-type") == 0) - return perform_test_load_source(argc - 2, argv + 2, "all", + return perform_test_load_source(argv[0], argc - 2, argv + 2, "all", PrintType, 0); else if (argc > 2 && strcmp(argv[1], "-test-print-type-size") == 0) - return perform_test_load_source(argc - 2, argv + 2, "all", + return perform_test_load_source(argv[0], argc - 2, argv + 2, "all", PrintTypeSize, 0); else if (argc > 2 && strcmp(argv[1], "-test-print-type-declaration") == 0) - return perform_test_load_source(argc - 2, argv + 2, "all", + return perform_test_load_source(argv[0], argc - 2, argv + 2, "all", PrintTypeDeclaration, 0); else if (argc > 2 && strcmp(argv[1], "-test-print-decl-attributes") == 0) - return perform_test_load_source(argc - 2, argv + 2, "all", + return perform_test_load_source(argv[0], argc - 2, argv + 2, "all", PrintDeclAttributes, 0); else if (argc > 2 && strcmp(argv[1], "-test-print-bitwidth") == 0) - return perform_test_load_source(argc - 2, argv + 2, "all", + return perform_test_load_source(argv[0], argc - 2, argv + 2, "all", PrintBitWidth, 0); else if (argc > 2 && strcmp(argv[1], "-test-print-mangle") == 0) return perform_test_load_tu(argv[2], "all", NULL, PrintMangledName, NULL); else if (argc > 2 && strcmp(argv[1], "-test-print-manglings") == 0) return perform_test_load_tu(argv[2], "all", NULL, PrintManglings, NULL); else if (argc > 2 && strcmp(argv[1], "-test-print-target-info") == 0) - return print_target_info(argc - 2, argv + 2); + return print_target_info(argv[0], argc - 2, argv + 2); else if (argc > 1 && strcmp(argv[1], "-print-usr") == 0) { if (argc > 2) return print_usrs(argv + 2, argv + argc); @@ -4864,7 +4937,7 @@ else if (argc > 2 && strcmp(argv[1], "-print-usr-file") == 0) return print_usrs_file(argv[2]); else if (argc > 2 && strcmp(argv[1], "-write-pch") == 0) - return write_pch_file(argv[2], argc - 3, argv + 3); + return write_pch_file(argv[0], argv[2], argc - 3, argv + 3); else if (argc > 2 && strcmp(argv[1], "-compilation-db") == 0) return perform_test_compilation_db(argv[argc-1], argc - 3, argv + 2); else if (argc == 2 && strcmp(argv[1], "-print-build-session-timestamp") == 0)