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