summaryrefslogtreecommitdiff
path: root/tools/c-index-test
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2013-12-05 08:19:23 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2013-12-05 08:19:23 +0000
commit48017f1745b0e3529216eb5734ee1d0608faaa2f (patch)
treeaf5daf6df092be2789fafd0dbec96bcb42b32827 /tools/c-index-test
parent7a29d5e7d8710d5c69604d65bb486791c541b870 (diff)
downloadclang-48017f1745b0e3529216eb5734ee1d0608faaa2f.tar.gz
clang-48017f1745b0e3529216eb5734ee1d0608faaa2f.tar.bz2
clang-48017f1745b0e3529216eb5734ee1d0608faaa2f.tar.xz
[c-index-test] Enhance perform_test_reparse_source() to allow remapping a file
at a particular reparsing iteration. Passing '-remap-file-1=from:to' will remap the files in the second iteration. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196486 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/c-index-test')
-rw-r--r--tools/c-index-test/c-index-test.c89
1 files changed, 77 insertions, 12 deletions
diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c
index 980c9b410f..58eb0def3e 100644
--- a/tools/c-index-test/c-index-test.c
+++ b/tools/c-index-test/c-index-test.c
@@ -107,20 +107,25 @@ void free_remapped_files(struct CXUnsavedFile *unsaved_files,
free(unsaved_files);
}
-int parse_remapped_files(int argc, const char **argv, int start_arg,
- struct CXUnsavedFile **unsaved_files,
- int *num_unsaved_files) {
+static int parse_remapped_files_with_opt(const char *opt_name,
+ int argc, const char **argv,
+ int start_arg,
+ struct CXUnsavedFile **unsaved_files,
+ int *num_unsaved_files) {
int i;
int arg;
- int prefix_len = strlen("-remap-file=");
+ int prefix_len = strlen(opt_name);
+ int arg_indices[20];
*unsaved_files = 0;
*num_unsaved_files = 0;
/* Count the number of remapped files. */
for (arg = start_arg; arg < argc; ++arg) {
- if (strncmp(argv[arg], "-remap-file=", prefix_len))
- break;
+ if (strncmp(argv[arg], opt_name, prefix_len))
+ continue;
+ assert(*num_unsaved_files < (int)(sizeof(arg_indices)/sizeof(int)));
+ arg_indices[*num_unsaved_files] = arg;
++*num_unsaved_files;
}
@@ -130,9 +135,9 @@ int parse_remapped_files(int argc, const char **argv, int start_arg,
*unsaved_files
= (struct CXUnsavedFile *)malloc(sizeof(struct CXUnsavedFile) *
*num_unsaved_files);
- for (arg = start_arg, i = 0; i != *num_unsaved_files; ++i, ++arg) {
+ for (i = 0; i != *num_unsaved_files; ++i) {
struct CXUnsavedFile *unsaved = *unsaved_files + i;
- const char *arg_string = argv[arg] + prefix_len;
+ const char *arg_string = argv[arg_indices[i]] + prefix_len;
int filename_len;
char *filename;
char *contents;
@@ -140,7 +145,7 @@ int parse_remapped_files(int argc, const char **argv, int start_arg,
const char *colon = strchr(arg_string, ':');
if (!colon) {
fprintf(stderr,
- "error: -remap-file=from:to argument is missing semicolon\n");
+ "error: %sfrom:to argument is missing semicolon\n", opt_name);
free_remapped_files(*unsaved_files, i);
*unsaved_files = 0;
*num_unsaved_files = 0;
@@ -192,6 +197,48 @@ int parse_remapped_files(int argc, const char **argv, int start_arg,
return 0;
}
+static int parse_remapped_files(int argc, const char **argv, int start_arg,
+ struct CXUnsavedFile **unsaved_files,
+ int *num_unsaved_files) {
+ return parse_remapped_files_with_opt("-remap-file=", argc, argv, start_arg,
+ unsaved_files, num_unsaved_files);
+}
+
+static int parse_remapped_files_with_try(int try_idx,
+ int argc, const char **argv,
+ int start_arg,
+ struct CXUnsavedFile **unsaved_files,
+ int *num_unsaved_files) {
+ struct CXUnsavedFile *unsaved_files_no_try_idx;
+ int num_unsaved_files_no_try_idx;
+ struct CXUnsavedFile *unsaved_files_try_idx;
+ int num_unsaved_files_try_idx;
+ int ret;
+ char opt_name[32];
+
+ ret = parse_remapped_files(argc, argv, start_arg,
+ &unsaved_files_no_try_idx, &num_unsaved_files_no_try_idx);
+ if (ret)
+ return ret;
+
+ sprintf(opt_name, "-remap-file-%d=", try_idx);
+ ret = parse_remapped_files_with_opt(opt_name, argc, argv, start_arg,
+ &unsaved_files_try_idx, &num_unsaved_files_try_idx);
+ if (ret)
+ return ret;
+
+ *num_unsaved_files = num_unsaved_files_no_try_idx + num_unsaved_files_try_idx;
+ *unsaved_files
+ = (struct CXUnsavedFile *)realloc(unsaved_files_no_try_idx,
+ sizeof(struct CXUnsavedFile) *
+ *num_unsaved_files);
+ memcpy(*unsaved_files + num_unsaved_files_no_try_idx,
+ unsaved_files_try_idx, sizeof(struct CXUnsavedFile) *
+ num_unsaved_files_try_idx);
+ free(unsaved_files_try_idx);
+ return 0;
+}
+
static const char *parse_comments_schema(int argc, const char **argv) {
const char *CommentsSchemaArg = "-comments-xml-schema=";
const char *CommentSchemaFile = NULL;
@@ -1415,7 +1462,8 @@ int perform_test_reparse_source(int argc, const char **argv, int trials,
CXTranslationUnit TU;
struct CXUnsavedFile *unsaved_files = 0;
int num_unsaved_files = 0;
- int result;
+ int compiler_arg_idx = 0;
+ int result, i;
int trial;
int remap_after_trial = 0;
char *endptr = 0;
@@ -1428,12 +1476,21 @@ int perform_test_reparse_source(int argc, const char **argv, int trials,
clang_disposeIndex(Idx);
return -1;
}
+
+ for (i = 0; i < argc; ++i) {
+ if (strcmp(argv[i], "--") == 0)
+ break;
+ }
+ if (i < argc)
+ compiler_arg_idx = i+1;
+ if (num_unsaved_files > compiler_arg_idx)
+ compiler_arg_idx = num_unsaved_files;
/* 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. */
TU = clang_parseTranslationUnit(Idx, 0,
- argv + num_unsaved_files,
- argc - num_unsaved_files,
+ argv + compiler_arg_idx,
+ argc - compiler_arg_idx,
0, 0, getDefaultParsingOptions());
if (!TU) {
fprintf(stderr, "Unable to load translation unit!\n");
@@ -1451,6 +1508,14 @@ int perform_test_reparse_source(int argc, const char **argv, int trials,
}
for (trial = 0; trial < trials; ++trial) {
+ free_remapped_files(unsaved_files, num_unsaved_files);
+ if (parse_remapped_files_with_try(trial, argc, argv, 0,
+ &unsaved_files, &num_unsaved_files)) {
+ clang_disposeTranslationUnit(TU);
+ clang_disposeIndex(Idx);
+ return -1;
+ }
+
if (clang_reparseTranslationUnit(TU,
trial >= remap_after_trial ? num_unsaved_files : 0,
trial >= remap_after_trial ? unsaved_files : 0,