ilya-biryukov created this revision.
ilya-biryukov added reviewers: thakis, ioeric.
Herald added a reviewer: EricWF.
Herald added subscribers: llvm-commits, arphaman.
Herald added a project: clang.

Specifically, the version of libc++ that lives alongside the c-index-test
binary. After r348365 driver relies on a correct value of argv[0] to find
libc++ and 'c-index-test' did not pass proper argv[0] when calling the
driver.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D57532

Files:
  clang/test/Index/record-completion-invocation.c
  clang/test/Index/record-parsing-invocation.c
  clang/tools/c-index-test/c-index-test.c

Index: clang/tools/c-index-test/c-index-test.c
===================================================================
--- clang/tools/c-index-test/c-index-test.c
+++ 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 <assert.h>
 #include <ctype.h>
-#include <stdlib.h>
+#include <memory.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
-#include <assert.h>
 
 #ifdef CLANG_HAVE_LIBXML
 #include <libxml/parser.h>
@@ -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)
Index: clang/test/Index/record-parsing-invocation.c
===================================================================
--- clang/test/Index/record-parsing-invocation.c
+++ 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"}]}
Index: clang/test/Index/record-completion-invocation.c
===================================================================
--- clang/test/Index/record-completion-invocation.c
+++ 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"}]}
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to