xref: /openbsd-src/gnu/llvm/clang/tools/c-arcmt-test/c-arcmt-test.c (revision e5dd70708596ae51455a0ffa086a00c5b29f8583)
1*e5dd7070Spatrick /* c-arcmt-test.c */
2*e5dd7070Spatrick 
3*e5dd7070Spatrick #include "clang-c/Index.h"
4*e5dd7070Spatrick #include <stdlib.h>
5*e5dd7070Spatrick #include <stdio.h>
6*e5dd7070Spatrick #include <string.h>
7*e5dd7070Spatrick #if defined(_WIN32)
8*e5dd7070Spatrick #include <io.h>
9*e5dd7070Spatrick #include <fcntl.h>
10*e5dd7070Spatrick #endif
11*e5dd7070Spatrick 
print_remappings(const char * path)12*e5dd7070Spatrick static int print_remappings(const char *path) {
13*e5dd7070Spatrick   CXRemapping remap;
14*e5dd7070Spatrick   unsigned i, N;
15*e5dd7070Spatrick   CXString origFname;
16*e5dd7070Spatrick   CXString transFname;
17*e5dd7070Spatrick 
18*e5dd7070Spatrick   remap = clang_getRemappings(path);
19*e5dd7070Spatrick   if (!remap)
20*e5dd7070Spatrick     return 1;
21*e5dd7070Spatrick 
22*e5dd7070Spatrick   N = clang_remap_getNumFiles(remap);
23*e5dd7070Spatrick   for (i = 0; i != N; ++i) {
24*e5dd7070Spatrick     clang_remap_getFilenames(remap, i, &origFname, &transFname);
25*e5dd7070Spatrick 
26*e5dd7070Spatrick     fprintf(stdout, "%s\n", clang_getCString(origFname));
27*e5dd7070Spatrick     fprintf(stdout, "%s\n", clang_getCString(transFname));
28*e5dd7070Spatrick 
29*e5dd7070Spatrick     clang_disposeString(origFname);
30*e5dd7070Spatrick     clang_disposeString(transFname);
31*e5dd7070Spatrick   }
32*e5dd7070Spatrick 
33*e5dd7070Spatrick   clang_remap_dispose(remap);
34*e5dd7070Spatrick   return 0;
35*e5dd7070Spatrick }
36*e5dd7070Spatrick 
print_remappings_filelist(const char ** files,unsigned numFiles)37*e5dd7070Spatrick static int print_remappings_filelist(const char **files, unsigned numFiles) {
38*e5dd7070Spatrick   CXRemapping remap;
39*e5dd7070Spatrick   unsigned i, N;
40*e5dd7070Spatrick   CXString origFname;
41*e5dd7070Spatrick   CXString transFname;
42*e5dd7070Spatrick 
43*e5dd7070Spatrick   remap = clang_getRemappingsFromFileList(files, numFiles);
44*e5dd7070Spatrick   if (!remap)
45*e5dd7070Spatrick     return 1;
46*e5dd7070Spatrick 
47*e5dd7070Spatrick   N = clang_remap_getNumFiles(remap);
48*e5dd7070Spatrick   for (i = 0; i != N; ++i) {
49*e5dd7070Spatrick     clang_remap_getFilenames(remap, i, &origFname, &transFname);
50*e5dd7070Spatrick 
51*e5dd7070Spatrick     fprintf(stdout, "%s\n", clang_getCString(origFname));
52*e5dd7070Spatrick     fprintf(stdout, "%s\n", clang_getCString(transFname));
53*e5dd7070Spatrick 
54*e5dd7070Spatrick     clang_disposeString(origFname);
55*e5dd7070Spatrick     clang_disposeString(transFname);
56*e5dd7070Spatrick   }
57*e5dd7070Spatrick 
58*e5dd7070Spatrick   clang_remap_dispose(remap);
59*e5dd7070Spatrick   return 0;
60*e5dd7070Spatrick }
61*e5dd7070Spatrick 
62*e5dd7070Spatrick /******************************************************************************/
63*e5dd7070Spatrick /* Command line processing.                                                   */
64*e5dd7070Spatrick /******************************************************************************/
65*e5dd7070Spatrick 
print_usage(void)66*e5dd7070Spatrick static void print_usage(void) {
67*e5dd7070Spatrick   fprintf(stderr,
68*e5dd7070Spatrick     "usage: c-arcmt-test -mt-migrate-directory <path>\n"
69*e5dd7070Spatrick     "       c-arcmt-test <remap-file-path1> <remap-file-path2> ...\n\n\n");
70*e5dd7070Spatrick }
71*e5dd7070Spatrick 
72*e5dd7070Spatrick /***/
73*e5dd7070Spatrick 
carcmttest_main(int argc,const char ** argv)74*e5dd7070Spatrick int carcmttest_main(int argc, const char **argv) {
75*e5dd7070Spatrick   clang_enableStackTraces();
76*e5dd7070Spatrick   if (argc == 3 && strncmp(argv[1], "-mt-migrate-directory", 21) == 0)
77*e5dd7070Spatrick     return print_remappings(argv[2]);
78*e5dd7070Spatrick 
79*e5dd7070Spatrick   if (argc > 1)
80*e5dd7070Spatrick     return print_remappings_filelist(argv+1, argc-1);
81*e5dd7070Spatrick 
82*e5dd7070Spatrick   print_usage();
83*e5dd7070Spatrick   return 1;
84*e5dd7070Spatrick }
85*e5dd7070Spatrick 
86*e5dd7070Spatrick /***/
87*e5dd7070Spatrick 
88*e5dd7070Spatrick /* We intentionally run in a separate thread to ensure we at least minimal
89*e5dd7070Spatrick  * testing of a multithreaded environment (for example, having a reduced stack
90*e5dd7070Spatrick  * size). */
91*e5dd7070Spatrick 
92*e5dd7070Spatrick typedef struct thread_info {
93*e5dd7070Spatrick   int argc;
94*e5dd7070Spatrick   const char **argv;
95*e5dd7070Spatrick   int result;
96*e5dd7070Spatrick } thread_info;
thread_runner(void * client_data_v)97*e5dd7070Spatrick void thread_runner(void *client_data_v) {
98*e5dd7070Spatrick   thread_info *client_data = client_data_v;
99*e5dd7070Spatrick   client_data->result = carcmttest_main(client_data->argc, client_data->argv);
100*e5dd7070Spatrick }
101*e5dd7070Spatrick 
flush_atexit(void)102*e5dd7070Spatrick static void flush_atexit(void) {
103*e5dd7070Spatrick   /* stdout, and surprisingly even stderr, are not always flushed on process
104*e5dd7070Spatrick    * and thread exit, particularly when the system is under heavy load. */
105*e5dd7070Spatrick   fflush(stdout);
106*e5dd7070Spatrick   fflush(stderr);
107*e5dd7070Spatrick }
108*e5dd7070Spatrick 
main(int argc,const char ** argv)109*e5dd7070Spatrick int main(int argc, const char **argv) {
110*e5dd7070Spatrick   thread_info client_data;
111*e5dd7070Spatrick 
112*e5dd7070Spatrick   atexit(flush_atexit);
113*e5dd7070Spatrick 
114*e5dd7070Spatrick #if defined(_WIN32)
115*e5dd7070Spatrick   if (getenv("LIBCLANG_LOGGING") == NULL)
116*e5dd7070Spatrick     putenv("LIBCLANG_LOGGING=1");
117*e5dd7070Spatrick   _setmode( _fileno(stdout), _O_BINARY );
118*e5dd7070Spatrick #else
119*e5dd7070Spatrick   setenv("LIBCLANG_LOGGING", "1", /*overwrite=*/0);
120*e5dd7070Spatrick #endif
121*e5dd7070Spatrick 
122*e5dd7070Spatrick   if (getenv("CINDEXTEST_NOTHREADS"))
123*e5dd7070Spatrick     return carcmttest_main(argc, argv);
124*e5dd7070Spatrick 
125*e5dd7070Spatrick   client_data.argc = argc;
126*e5dd7070Spatrick   client_data.argv = argv;
127*e5dd7070Spatrick   clang_executeOnThread(thread_runner, &client_data, 0);
128*e5dd7070Spatrick   return client_data.result;
129*e5dd7070Spatrick }
130