Coverage Report

Created: 2023-10-30 17:15

/builds/2mk6rsew/0/parcoach/parcoach/src/aSSA/ExtInfo.cpp
Line
Count
Source
1
#include "parcoach/ExtInfo.h"
2
3
#include "Utils.h"
4
5
#include "llvm/IR/Module.h"
6
7
using namespace llvm;
8
9
namespace parcoach {
10
struct FuncModPair {
11
  char const *Name;
12
  const ExtInfo::ModInfo ModInfo;
13
};
14
15
static const FuncModPair FuncModPairs[] = {
16
    // {"func_name", { <nb_params>, <retval_is_pointer>, {
17
    // <param_1_is_modified_pointer, ..., <param_n-1_is_modified_pointer> } } }
18
19
    // MILC HACK
20
    {"myrand", {1, false, {false}}},
21
    {"cmul", {2, false, {true, false}}},
22
    {"cadd", {2, false, {true, false}}},
23
    {"csub", {2, false, {true, false}}},
24
    {"__snprintf_chk", {4, false, {true, false, false, false}}},
25
    {"__strncat_chk", {3, false, {false, false, false}}},
26
27
    /* LLVM intrinsics */
28
    {"llvm.bswap.v4i32", {1, false, {false}}},
29
    {"llvm.bswap.i32", {1, false, {false}}},
30
    {"llvm.fabs.f64", {1, false, {false}}},
31
    {"llvm.fabs.v2f64", {1, false, {false}}},
32
    {"llvm.fabs.f32", {1, false, {false}}},
33
    {"llvm.fabs.f64", {1, false, {false}}},
34
    {"llvm.lifetime.start", {2, false, {false, false}}},
35
    {"llvm.lifetime.end", {2, false, {false, false}}},
36
    {"llvm.lifetime.start.p0", {2, false, {false, false}}},
37
    {"llvm.lifetime.end.p0", {2, false, {false, false}}},
38
    {"llvm.memcpy.p0i8.p0i8.i32",
39
     {5, false, {true, false, false, false, false}}},
40
    {"llvm.memcpy.p0i8.p0i8.i64",
41
     {5, false, {true, false, false, false, false}}},
42
    {"llvm.memcpy.p0.p0.i64", {4, false, {true, false, false, false}}},
43
    {"llvm.memmove.p0i8.p0i8.i32",
44
     {5, false, {true, true, false, false, false}}},
45
    {"llvm.memmove.p0i8.p0i8.i64",
46
     {5, false, {true, true, false, false, false}}},
47
    {"llvm.memmove.p0.p0.i64", {4, false, {true, true, false, false}}},
48
    {"llvm.memset.p0i8.i32", {5, false, {true, false, false, false, false}}},
49
    {"llvm.memset.p0i8.i64", {5, false, {true, false, false, false, false}}},
50
    {"llvm.memset.p0.i64", {4, false, {true, false, false, false}}},
51
    {"llvm.minnum.v2f64", {2, false, {false, false}}},
52
    {"llvm.sqrt.f64", {1, false, {false}}},
53
    {"llvm.stackrestore", {1, false, {false}}},
54
    {"llvm.stacksave", {0, true, {}}},
55
    {"llvm.trap", {0, false, {}}},
56
    {"llvm.va_start", {1, false, {true}}},
57
    {"llvm.va_end", {1, false, {true}}},
58
    {"llvm.x86.sse2.mfence", {0, false, {}}},
59
    {"llvm.prefetch", {4, false, {true, false, false, false}}},
60
61
    /* libc */
62
    {"abort", {0, false, {}}},
63
    {"abs", {1, false, {false}}},
64
    {"acos", {1, false, {false}}},
65
    {"access", {2, false, {false, false}}},
66
    {"asprintf", {3, false, {true, false, false}}},
67
    {"atan", {1, false, {false}}},
68
    {"atanf", {1, false, {false}}},
69
    {"atan2", {2, false, {false, false}}},
70
    {"atof", {1, false, {false}}},
71
    {"atoi", {1, false, {false}}},
72
    {"atol", {1, false, {false}}},
73
    {"asctime", {1, true, {false}}},
74
    {"calloc", {2, true, {false, false}}},
75
    {"ceil", {1, false, {false}}},
76
    {"clock", {0, false, {}}},
77
    {"clock_gettime", {2, false, {false, true}}},
78
    {"close", {1, false, {false}}},
79
    {"ctime", {1, true, {false}}},
80
    {"cos", {1, false, {false}}},
81
    {"cosh", {1, false, {false}}},
82
    {"erfc", {1, false, {false}}},
83
    {"exit", {1, false, {false}}},
84
    {"exp", {1, false, {false}}},
85
    {"fabs", {1, false, {false}}},
86
    {"fabsf", {1, false, {false}}},
87
    {"cabs", {1, false, {false}}},
88
    {"cabsf", {1, false, {false}}},
89
    {"labs", {1, false, {false}}},
90
    {"fclose", {1, false, {true}}},
91
    {"feof", {1, false, {false}}},
92
    {"fflush", {1, false, {false}}},
93
    {"fgetc", {1, false, {false}}},
94
    {"fgets", {3, true, {true, false, false}}},
95
    {"fgetpos", {2, false, {false, true}}},
96
    {"floor", {1, false, {false}}},
97
    {"fmax", {2, false, {false, false}}},
98
    {"fmin", {2, false, {false, false}}},
99
    {"fopen", {2, true, {false, false}}},
100
    {"fprintf", {3, false, {true, false, false}}},
101
    {"fputc", {2, false, {false, true}}},
102
    {"fputs", {2, false, {false, false}}},
103
    {"fread", {4, false, {true, false, false, true}}},
104
    {"free", {1, false, {true}}},
105
    {"freopen", {3, true, {false, false, false}}},
106
    {"fseeko", {3, false, {false, false, false}}},
107
    {"fsetpos", {2, false, {false, false}}},
108
    {"fsync", {1, false, {false}}},
109
    {"fwrite", {4, false, {false, false, false, true}}},
110
    {"getchar", {0, false, {}}},
111
    {"getenv", {1, true, {false}}},
112
    {"gethostname", {2, false, {true, false}}},
113
    {"getopt", {3, false, {false, false, false}}},
114
    {"getopt_long", {5, false, {false, false, false, false, true}}},
115
    {"getpagesize", {0, false, {}}},
116
    {"getrusage", {2, false, {false, true}}},
117
    {"gettimeofday", {2, false, {true, true}}},
118
    {"gmtime", {1, true, {false}}},
119
    {"hypot", {2, false, {false, false}}},
120
    {"ldexp", {2, false, {false, false}}},
121
    {"localtime", {1, true, {false}}},
122
    {"log", {1, false, {false}}},
123
    {"malloc", {1, true, {false}}},
124
    {"memset", {3, true, {true, false, false}}},
125
    {"memcpy", {3, true, {true, false, false}}},
126
    {"memmove", {3, true, {true, false, false}}},
127
    {"mkdir", {2, false, {false, false}}},
128
    {"move_pages", {6, false, {false, false, false, false, true, false}}},
129
    {"numa_num_configured_nodes", {0, false, {}}},
130
    {"pow", {2, false, {false, false}}},
131
    {"printf", {2, false, {false, false}}},
132
    {"vfprintf", {3, false, {true, false, false}}},
133
    {"putchar", {1, false, {false}}},
134
    {"putenv", {1, false, {true}}},
135
    {"puts", {1, false, {false}}},
136
    {"qsort", {4, false, {true, false, false, false}}},
137
    {"rand", {0, false, {}}},
138
    {"random", {0, false, {}}},
139
    {"read", {3, false, {false, true, false}}},
140
    {"realloc", {2, true, {true, false}}},
141
    {"realpath", {2, true, {false, true}}},
142
    {"regcomp", {3, false, {true, false, false}}},
143
    {"regexec", {5, false, {false, false, false, false, false}}},
144
    {"regfree", {1, false, {true}}},
145
    {"rewind", {1, false, {false}}},
146
    {"signal", {2, false, {false}}},
147
    {"sin", {1, false, {false}}},
148
    {"sleep", {1, false, {false}}},
149
    {"snprintf", {4, false, {true, false, false, false}}},
150
    {"sprintf", {3, false, {true, false, false}}},
151
    {"sqrt", {1, false, {false}}},
152
    {"sqrtf", {1, false, {false}}},
153
    {"srand", {1, false, {false}}},
154
    {"srandom", {1, false, {false}}},
155
    {"strcasecmp", {2, false, {false, false}}},
156
    {"strcat", {2, true, {true, false}}},
157
    {"strchr", {2, true, {false, false}}},
158
    {"strcmp", {2, false, {false, false}}},
159
    {"strcpy", {2, true, {true, false}}},
160
    {"strcspn", {2, false, {false, false}}},
161
    {"strftime", {4, false, {true, false, false, false}}},
162
    {"strerror", {1, true, {false}}},
163
    {"strlen", {1, false, {false}}},
164
    {"strncasecmp", {3, false, {false, false, false}}},
165
    {"strncat", {3, true, {true, false, false}}},
166
    {"strncmp", {3, false, {false, false, false}}},
167
    {"strncpy", {3, true, {true, false, false}}},
168
    {"strpbrk", {2, true, {false, false}}},
169
    {"strrchr", {2, true, {false, false}}},
170
    {"strspn", {2, false, {false, false}}},
171
    {"strstr", {2, true, {false, false}}},
172
    {"strtod", {2, false, {false, true}}},
173
    {"strtok", {2, true, {true, false}}},
174
    {"strtol", {3, false, {false, true, false}}},
175
    {"system", {1, false, {false}}},
176
    {"tanh", {1, false, {false}}},
177
    {"time", {1, false, {true}}},
178
    {"tolower", {1, false, {false}}},
179
    {"toupper", {1, false, {false}}},
180
    {"uname", {1, false, {true}}},
181
    {"ungetc", {2, false, {false, false}}},
182
    {"unlink", {1, false, {false}}},
183
    {"vsprintf", {3, false, {true, false, false}}},
184
    {"write", {3, false, {false, false, false}}},
185
    {"_IO_getc", {1, false, {false}}},
186
    {"_IO_putc", {2, false, {false, false}}},
187
    {"__assert_fail", {4, false, {false, false, false, false}}},
188
    {"__ctype_b_loc", {0, true, {}}},
189
    {"__errno_location", {0, true, {}}},
190
    {"__isnan", {1, false, {false}}},
191
    {"__isnanf", {1, false, {false}}},
192
    {"__isoc99_fscanf", {3, false, {true, false, true}}},
193
    {"__isoc99_scanf", {2, false, {false, true}}},
194
    {"__isoc99_sscanf", {3, false, {false, false, true}}},
195
    {"__log_finite", {1, false, {false}}},
196
    {"__strdup", {1, true, {false}}},
197
    {"perror", {4, false, {true, false, false, false}}},
198
199
    {"fopen64", {2, true, {false, false}}},
200
    {"freopen64", {3, true, {false, false, false}}},
201
    {"fseeko64", {3, false, {false, false, false}}},
202
    {"open64", {3, false, {false, false, false}}},
203
    {"lseek64", {3, false, {false, false, false}}},
204
    {"stat64", {2, false, {false, true}}},
205
    {"statfs64", {2, false, {false, true}}},
206
    /* PARCOACH tests */
207
    /* we need a sample variable function which changes its last param */
208
    /* FIXME: it's not clean, find a way to change that. */
209
    {"parcoach_var_mod", {2, false, {false, true}}},
210
211
    /* MPI */
212
    {"MPI_Abort", {2, false, {false, false}}},
213
    {"MPI_Address", {2, false, {false, true}}},
214
    {"MPI_Allgather",
215
     {7, false, {false, false, false, true, false, false, false}}},
216
    {"MPI_Allgatherv",
217
     {8, false, {false, false, false, true, false, false, false, false}}},
218
    {"MPI_Allreduce", {6, false, {false, true, false, false, false, false}}},
219
    {"MPI_Alltoall",
220
     {7, false, {false, false, false, true, false, false, true}}},
221
    {"MPI_Alltoallv",
222
     {9,
223
      false,
224
      {false, false, false, false, true, false, false, false, false}}},
225
    {"MPI_Alloc_mem", {3, false, {false, false, true}}},
226
    {"MPI_Alltoallw",
227
     {9,
228
      false,
229
      {false, false, false, false, true, false, false, false, false}}},
230
    {"MPI_Attr_get", {4, false, {false, false, true, true}}},
231
    {"MPI_Barrier", {1, false, {false}}},
232
    {"MPI_Bcast", {5, false, {true, false, false, false, false}}},
233
    {"MPI_Bsend", {6, false, {false, false, false, false, false, false}}},
234
    {"MPI_Bsend_init",
235
     {7, false, {false, false, false, false, false, false, false}}},
236
    {"MPI_Buffer_attach", {2, false, {false, false}}},
237
    {"MPI_Buffer_detach", {2, false, {true, false}}},
238
    {"MPI_Comm_create", {3, false, {false, false, true}}},
239
    {"MPI_Comm_dup", {2, false, {false, true}}},
240
    {"MPI_Comm_free", {1, false, {true}}},
241
    {"MPI_Comm_group", {2, false, {false, true}}},
242
    {"MPI_Comm_group_incl", {4, false, {false, false, false, true}}},
243
    {"MPI_Comm_rank", {2, false, {false, true}}},
244
    {"MPI_Comm_size", {2, false, {false, true}}},
245
    {"MPI_Comm_split", {4, false, {false, false, false, true}}},
246
    {"MPI_Cart_create", {6, false, {false, false, false, false, false, false}}},
247
    {"MPI_Cart_get", {5, false, {false, false, true, true, true}}},
248
    {"MPI_Cart_shift", {5, false, {false, false, false, false, false}}},
249
    {"MPI_Cart_coords", {4, false, {false, false, false, true}}},
250
    {"MPI_Cart_sub", {3, false, {false, false, true}}},
251
    {"MPI_Comm_create_group", {4, false, {false, false, false, true}}},
252
    {"MPI_Comm_compare", {3, false, {false, false, true}}},
253
    {"MPI_Errhandler_create", {2, false, {false, true}}},
254
    {"MPI_Errhandler_set", {2, false, {false, false}}},
255
    {"MPI_Error_string", {3, false, {false, true, true}}},
256
    {"MPI_Exscan", {6, false, {false, true, false, false, false, false}}},
257
    {"MPI_Get_version", {2, false, {true, true}}},
258
    {"MPI_File_close", {1, false, {true}}},
259
    {"MPI_File_delete", {2, false, {false, false}}},
260
    {"MPI_File_get_info", {2, false, {false, true}}},
261
    {"MPI_File_get_size", {2, false, {false, false}}},
262
    {"MPI_File_open", {5, false, {false, false, false, false, true}}},
263
    {"MPI_File_preallocate", {2, false, {false, false}}},
264
    {"MPI_File_read", {5, false, {false, true, false, false, true}}},
265
    {"MPI_File_read_all", {5, false, {false, true, false, false, true}}},
266
    {"MPI_File_read_at", {6, false, {false, false, true, false, false, true}}},
267
    {"MPI_File_read_at_all",
268
     {6, false, {false, false, true, false, false, true}}},
269
    {"MPI_File_set_view",
270
     {6, false, {false, false, false, false, false, false}}},
271
    {"MPI_File_seek", {3, false, {false, false, false}}},
272
    {"MPI_File_write", {5, false, {false, false, false, false, true}}},
273
    {"MPI_File_write_all", {5, false, {false, false, false, false, true}}},
274
    {"MPI_File_write_at",
275
     {6, false, {false, false, false, false, false, true}}},
276
    {"MPI_File_write_at_all",
277
     {6, false, {false, false, false, false, false, true}}},
278
    {"MPI_Finalize", {0, false, {}}},
279
    {"MPI_Free_mem", {1, false, {true}}},
280
    {"MPI_Gather",
281
     {8, false, {false, false, false, true, false, false, false, false}}},
282
    {"MPI_Gatherv",
283
     {10,
284
      false,
285
      {false, false, false, true, false, false, false, false, false, true}}},
286
    {"MPI_Get_count", {3, false, {false, false, true}}},
287
    {"MPI_Get_processor_name", {2, false, {true, true}}},
288
    {"MPI_Group_free", {1, false, {true}}},
289
    {"MPI_Group_incl", {4, false, {false, false, false, true}}},
290
    {"MPI_Group_range_incl", {4, false, {false, false, false, true}}},
291
    {"MPI_Get",
292
     {8, false, {true, false, false, false, false, false, false, false}}},
293
    {"MPI_Group_excl", {4, false, {false, false, false, true}}},
294
    {"MPI_Group_range_excl", {4, false, {false, false, false, true}}},
295
    {"MPI_Iallgather",
296
     {8, false, {false, false, false, true, false, false, false, false}}},
297
    {"MPI_Iallgatherv",
298
     {9,
299
      false,
300
      {false, false, false, true, false, false, false, false, false}}},
301
    {"MPI_Iallreduce",
302
     {7, false, {false, true, false, false, false, false, false}}},
303
    {"MPI_Ialltoall",
304
     {8, false, {false, false, false, true, false, false, true, false}}},
305
    {"MPI_Ialltoallv",
306
     {10,
307
      false,
308
      {false, false, false, false, true, false, false, false, false, false}}},
309
    {"MPI_Ibarrier", {2, false, {false, false}}},
310
    {"MPI_Ibcast", {6, false, {true, false, false, false, false, false}}},
311
    {"MPI_Ibsend",
312
     {7, false, {false, false, false, false, false, false, false}}},
313
    {"MPI_Iexscan",
314
     {7, false, {false, true, false, false, false, false, false}}},
315
    {"MPI_Igather",
316
     {9,
317
      false,
318
      {false, false, false, true, false, false, false, false, false}}},
319
    {"MPI_Intercomm_create",
320
     {6, false, {false, false, false, false, false, true}}},
321
    {"MPI_Info_create", {1, false, {true}}},
322
    {"MPI_Info_get", {5, false, {false, false, false, true, true}}},
323
    {"MPI_Info_get_nkeys", {2, false, {false, true}}},
324
    {"MPI_Info_get_nthkey", {3, false, {false, false, true}}},
325
    {"MPI_Info_set", {3, false, {true, false, false}}},
326
    {"MPI_Init", {2, false, {false, false}}},
327
    {"MPI_Init_thread", {4, false, {false, false, false, true}}},
328
    {"MPI_Irsend",
329
     {7, false, {false, false, false, false, false, false, false}}},
330
    {"MPI_Iscatter",
331
     {9,
332
      false,
333
      {false, false, false, true, false, false, false, false, false}}},
334
    {"MPI_Iscan", {7, false, {false, true, false, false, false, false, false}}},
335
    {"MPI_Iprobe", {5, false, {false, false, false, true, true}}},
336
    {"MPI_Irecv", {7, false, {true, false, false, false, false, false, true}}},
337
    {"MPI_Ireduce",
338
     {8, false, {false, true, false, false, false, false, false, false}}},
339
    {"MPI_Isend", {7, false, {false, false, false, false, false, false, true}}},
340
    {"MPI_Issend",
341
     {7, false, {false, false, false, false, false, false, true}}},
342
    {"MPI_Op_create", {3, false, {false, false, true}}},
343
    {"MPI_Op_free", {1, false, {true}}},
344
    {"MPI_Probe", {4, false, {false, false, false, true}}},
345
    {"MPI_Put",
346
     {8, false, {false, false, false, false, false, false, false, false}}},
347
    {"MPI_Recv", {7, false, {true, false, false, false, false, false, true}}},
348
    {"MPI_Reduce",
349
     {7, false, {false, true, false, false, false, false, false}}},
350
    {"MPI_Reduce_scatter_block",
351
     {6, false, {false, true, false, false, false, false}}},
352
    {"MPI_Reduce_scatter",
353
     {6, false, {false, true, false, false, false, false}}},
354
    {"MPI_Rsend_init",
355
     {7, false, {false, false, false, false, false, false, false}}},
356
    {"MPI_Request_free", {1, false, {false}}},
357
    {"MPI_Recv_init",
358
     {7, false, {false, false, false, false, false, false, false}}},
359
    {"MPI_Scan", {6, false, {false, true, false, false, false, false}}},
360
    {"MPI_Scatter",
361
     {8, false, {false, false, false, true, false, false, false, false}}},
362
    {"MPI_Scatterv",
363
     {9,
364
      false,
365
      {false, false, false, false, true, false, false, false, false}}},
366
    {"MPI_Send", {6, false, {false, false, false, false, false, false}}},
367
    {"MPI_Sendrecv",
368
     {12,
369
      false,
370
      {false, false, false, false, false, true, false, false, false, false,
371
       false, true}}},
372
    {"MPI_Ssend", {6, false, {false, false, false, false, false, false}}},
373
    {"MPI_Startall", {2, false, {false, false}}},
374
    {"MPI_Start", {1, false, {false}}},
375
    {"MPI_Ssend_init",
376
     {7, false, {false, false, false, false, false, false, false}}},
377
    {"MPI_Send_init",
378
     {7, false, {false, false, false, false, false, false, false}}},
379
    {"MPI_Test", {3, false, {false, false, true}}},
380
    {"MPI_Testall", {4, false, {false, false, true, true}}},
381
    {"MPI_Type_create_subarray",
382
     {7, false, {false, false, false, false, false, false, true}}},
383
    {"MPI_Type_commit", {1, false, {false}}},
384
    {"MPI_Type_contiguous", {3, false, {false, false, true}}},
385
    {"MPI_Type_free", {1, false, {true}}},
386
    {"MPI_Type_struct", {5, false, {false, false, false, false, true}}},
387
    {"MPI_Type_vector", {5, false, {false, false, false, false, true}}},
388
    {"MPI_Type_size", {2, false, {false, true}}},
389
    {"MPI_Testany", {5, false, {false, false, false, false, false}}},
390
    {"MPI_Testsome", {5, false, {false, false, true, true, true}}},
391
    {"MPI_Win_fence", {2, false, {false, false}}},
392
    {"MPI_Win_complete", {1, false, {false}}},
393
    {"MPI_Win_post", {3, false, {false, false, false}}},
394
    {"MPI_Win_wait", {1, false, {false}}},
395
    {"MPI_Win_free", {1, false, {true}}},
396
    {"MPI_Win_lock", {4, false, {false, false, false, false}}},
397
    {"MPI_Win_lock_all", {2, false, {false, false}}},
398
    {"MPI_Win_unlock", {2, false, {false, false}}},
399
    {"MPI_Win_unlock_all", {1, false, {false}}},
400
    {"MPI_Win_flush", {2, false, {false, false}}},
401
    {"MPI_Wait", {2, false, {true, true}}},
402
    {"MPI_Waitall", {3, false, {false, true, true}}},
403
    {"MPI_Waitany", {4, false, {false, false, true, true}}},
404
    {"MPI_Waitsome", {5, false, {false, false, true, true, true}}},
405
    {"MPI_Wtick", {0, false, {}}},
406
    {"MPI_Wtime", {0, false, {}}},
407
    {"MPI_Win_create", {6, false, {false, false, false, false, false, true}}},
408
    {"MPI_Win_allocate", {6, false, {false, false, false, false, false, true}}},
409
    {"MPI_Win_start", {3, false, {false, false, false}}},
410
411
    /* OpenMP */
412
    {"omp_get_num_threads", {0, false, {}}},
413
    {"omp_get_thread_num", {0, false, {}}},
414
    {"__kmpc_fork_call", {4, false, {false, false, false, false}}},
415
    {"__kmpc_barrier", {2, false, {false, false}}},
416
    {"__kmpc_single", {2, false, {false, false}}},
417
    {"__kmpc_end_single", {2, false, {false, false}}},
418
    {"__kmpc_for_static_init_4",
419
     {9,
420
      false,
421
      {false, false, false, false, false, false, false, false, false}}},
422
    {"__kmpc_for_static_fini", {2, false, {false, false}}},
423
    {"__kmpc_global_thread_num", {1, false, {false}}},
424
    {"__kmpc_reduce_nowait",
425
     {7, false, {false, false, false, false, false, false, false}}},
426
    {"__kmpc_end_reduce_nowait", {3, false, {false, false, false}}},
427
    {"omp_get_max_threads", {0, false, {}}},
428
    {"__kmpc_master", {2, false, {true, false}}},
429
    {"__kmpc_end_master", {2, false, {true, false}}},
430
    {"omp_get_wtime", {0, false, {}}},
431
    {"__kmpc_dispatch_init_4",
432
     {7, false, {true, false, false, false, false, false, false}}},
433
    {"__kmpc_dispatch_next_4",
434
     {6, false, {true, false, true, true, true, true}}},
435
    {"__kmpc_critical", {3, false, {true, false, true}}},
436
    {"__kmpc_end_critical", {3, false, {true, false, true}}},
437
438
    /* UPC */
439
    {"upcri_err", {4, false, {true, false, false, false}}},
440
    {"upcri_stack_check", {4, false, {true, false, true, false}}},
441
    {"gasneti_checkinit", {0, false, {}}},
442
    {"_upcr_notify", {2, false, {false, false}}},
443
    {"_upcr_wait", {2, false, {false, false}}},
444
    {"_upcr_startup_pshalloc", {1, false, {true}}},
445
    {"_upcr_all_alloc", {2, false, {false, false}}},
446
    {"_upcr_free", {1, false, {false}}},
447
    {"_upcr_memget_nb", {3, true, {true, false, false}}},
448
    {"_upcr_waitsync", {1, false, {true}}},
449
    {"gasnete_get_bulk", {4, false, {true, false, true, false}}},
450
    {"gasnete_put_bulk", {4, false, {false, true, true, false}}},
451
    {"gasneti_trace_setsourceline", {1, false, {true}}},
452
    {"_upcri_checkvalid_pshared", {4, false, {false, false, true, false}}},
453
    {"gasneti_stat_intval_accumulate", {2, false, {true, false}}},
454
    {"gasneti_dynsprintf",
455
     {7, true, {true, false, false, false, false, false, false}}},
456
    {"gasneti_trace_output", {3, false, {true, true, false}}},
457
    {"gasneti_build_loc_str", {3, false, {false, false, false}}},
458
    {"gasneti_fatalerror", {1, false, {true}}}, // may not be correct
459
    {"gasnete_get_nb_bulk", {4, true, {true, false, true, false}}},
460
    {"gasnete_try_syncnb", {1, false, {false}}},
461
    {"sched_yield", {0, false, {}}},
462
    {"_gasneti_memcheck_one", {1, false, {true}}},
463
    {"gasnetc_AMPoll", {0, false, {}}},
464
    {"gasneti_vis_progressfn", {0, false, {}}},
465
    {"_bupc_dump_shared", {3, false, {false, true, false}}},
466
    {"_upcri_checkvalid_shared", {4, false, {false, false, true, false}}},
467
    {"_gasneti_extern_free", {2, false, {true, true}}},
468
    {"posix_memalign", {3, false, {true, false, false}}},
469
    {"_upcr_alloc", {1, false, {false}}},
470
    {"pthread_mutex_init", {2, false, {true, true}}},
471
    {"upcr_global_exit", {1, false, {false}}},
472
    {"pthread_mutex_destroy", {1, false, {true}}},
473
    {"_upcr_memput_nb", {3, true, {true, false, false}}},
474
    {"_bupc_waitsync_all", {2, false, {true, false}}},
475
    {"_bupc_sem_alloc", {1, true, {false}}},
476
    {"_bupc_sem_postN", {2, false, {true, false}}},
477
    {"_upcr_all_reduceD",
478
     {8, false, {true, false, false, false, false, true, false, false}}},
479
    {"_upcr_all_broadcast", {4, false, {true, false, false, false}}},
480
    //{"", { , , {}} },
481
    //{"", { , , {}} },
482
483
    /* gsl */
484
    {"gsl_integration_qag",
485
     {10,
486
      true,
487
      {false, false, false, false, false, false, false, true, true, true}}},
488
    {"gsl_integration_workspace_alloc", {1, true, {false}}},
489
    {"gsl_integration_workspace_free", {1, false, {true}}},
490
    {"gsl_rng_alloc", {1, true, {false}}},
491
    {"gsl_rng_set", {2, false, {false, false}}},
492
    {"gsl_rng_size", {1, false, {false}}},
493
    {"gsl_rng_state", {1, true, {false}}},
494
    {"gsl_rng_uniform", {1, false, {false}}},
495
496
    /* cblas */
497
    {"cblas_idamax", {3, false, {false, false, false}}},
498
    {"cblas_dgemv",
499
     {12,
500
      false,
501
      {false, false, false, false, false, false, false, false, false, false,
502
       true, false}}},
503
    {"cblas_sscal", {4, false, {false, false, true, false}}},
504
    {"cblas_dscal", {4, false, {false, false, true, false}}},
505
    {"cblas_cscal", {4, false, {false, false, true, false}}},
506
    {"cblas_zscal", {4, false, {false, false, true, false}}},
507
    {"cblas_csscal", {4, false, {false, false, true, false}}},
508
    {"cblas_zdscal", {4, false, {false, false, true, false}}},
509
    {"cblas_saxpy", {6, false, {false, false, false, false, true, false}}},
510
    {"cblas_daxpy", {6, false, {false, false, false, false, true, false}}},
511
    {"cblas_caxpy", {6, false, {false, false, false, false, true, false}}},
512
    {"cblas_zaxpy", {6, false, {false, false, false, false, true, false}}},
513
    {"cblas_sger",
514
     {10,
515
      false,
516
      {false, false, false, false, false, false, false, false, true, false}}},
517
    {"cblas_dger",
518
     {10,
519
      false,
520
      {false, false, false, false, false, false, false, false, true, false}}},
521
    {"cblas_cgerc",
522
     {10,
523
      false,
524
      {false, false, false, false, false, false, false, false, true, false}}},
525
    {"cblas_zgerc",
526
     {10,
527
      false,
528
      {false, false, false, false, false, false, false, false, true, false}}},
529
    {"cblas_cgeru",
530
     {10,
531
      false,
532
      {false, false, false, false, false, false, false, false, true, false}}},
533
    {"cblas_zgeru",
534
     {10,
535
      false,
536
      {false, false, false, false, false, false, false, false, true, false}}},
537
    {"cblas_strsm",
538
     {12,
539
      false,
540
      {false, false, false, false, false, false, false, false, false, false,
541
       true, false}}},
542
    {"cblas_dtrsm",
543
     {12,
544
      false,
545
      {false, false, false, false, false, false, false, false, false, false,
546
       true, false}}},
547
    {"cblas_ctrsm",
548
     {12,
549
      false,
550
      {false, false, false, false, false, false, false, false, false, false,
551
       true, false}}},
552
    {"cblas_ztrsm",
553
     {12,
554
      false,
555
      {false, false, false, false, false, false, false, false, false, false,
556
       true, false}}},
557
    {"cblas_strsv",
558
     {9,
559
      false,
560
      {false, false, false, false, false, false, false, true, false}}},
561
    {"cblas_dtrsv",
562
     {9,
563
      false,
564
      {false, false, false, false, false, false, false, true, false}}},
565
    {"cblas_ctrsv",
566
     {9,
567
      false,
568
      {false, false, false, false, false, false, false, true, false}}},
569
    {"cblas_ztrsv",
570
     {9,
571
      false,
572
      {false, false, false, false, false, false, false, true, false}}},
573
    {"cblas_sgemm",
574
     {14,
575
      false,
576
      {false, false, false, false, false, false, false, false, false, false,
577
       false, false, true, false}}},
578
    {"cblas_dgemm",
579
     {14,
580
      false,
581
      {false, false, false, false, false, false, false, false, false, false,
582
       false, false, true, false}}},
583
    {"cblas_cgemm",
584
     {14,
585
      false,
586
      {false, false, false, false, false, false, false, false, false, false,
587
       false, false, true, false}}},
588
    {"cblas_zgemm",
589
     {14,
590
      false,
591
      {false, false, false, false, false, false, false, false, false, false,
592
       false, false, true, false}}},
593
    {"cblas_dcopy", {5, false, {false, false, false, false, true, false}}},
594
    {"cblas_dasum", {3, false, {false, false, false}}},
595
    {"cblas_dzasum", {3, false, {false, false, false}}},
596
    {"cblas_sasum", {3, false, {false, false, false}}},
597
    {"cblas_scasum", {3, false, {false, false, false}}},
598
    {"cblas_dnrm2", {3, false, {false, false, false}}},
599
    {"cblas_dznrm2", {3, false, {false, false, false}}},
600
    {"cblas_scnrm2", {3, false, {false, false, false}}},
601
    {"cblas_snrm2", {3, false, {false, false, false}}},
602
603
    /* CUDA
604
     * see: http://llvm.org/docs/NVPTXUsage.html#llvm-nvvm-read-ptx-sreg
605
     */
606
    {
607
        "llvm.nvvm.read.ptx.sreg.tid.x",
608
        {0, false, {}},
609
    },
610
    {
611
        "llvm.nvvm.read.ptx.sreg.tid.y",
612
        {0, false, {}},
613
    },
614
    {
615
        "llvm.nvvm.read.ptx.sreg.tid.z",
616
        {0, false, {}},
617
    },
618
    {
619
        "llvm.nvvm.read.ptx.sreg.ctaid.x",
620
        {0, false, {}},
621
    },
622
    {
623
        "llvm.nvvm.read.ptx.sreg.ctaid.y",
624
        {0, false, {}},
625
    },
626
    {
627
        "llvm.nvvm.read.ptx.sreg.ctaid.z",
628
        {0, false, {}},
629
    },
630
    {
631
        "llvm.nvvm.read.ptx.sreg.nctaid.x",
632
        {0, false, {}},
633
    },
634
    {
635
        "llvm.nvvm.read.ptx.sreg.nctaid.y",
636
        {0, false, {}},
637
    },
638
    {
639
        "llvm.nvvm.read.ptx.sreg.nctaid.z",
640
        {0, false, {}},
641
    },
642
    {
643
        "llvm.nvvm.read.ptx.sreg.ntid.x",
644
        {0, false, {}},
645
    },
646
    {
647
        "llvm.nvvm.read.ptx.sreg.ntid.y",
648
        {0, false, {}},
649
    },
650
    {
651
        "llvm.nvvm.read.ptx.sreg.ntid.z",
652
        {0, false, {}},
653
    },
654
    {
655
        "llvm.nvvm.read.ptx.sreg.warpsize",
656
        {0, false, {}},
657
    },
658
    {
659
        "llvm.nvvm.barrier0",
660
        {0, false, {}},
661
    },
662
    {
663
        "llvm.nvvm.fabs.ftz.f",
664
        {1, false, {false}},
665
    },
666
    {
667
        "llvm.nvvm.fabs.f",
668
        {1, false, {false}},
669
    },
670
    {
671
        "llvm.nvvm.fabs.d",
672
        {1, false, {false}},
673
    },
674
    {
675
        "llvm.nvvm.fmax.d",
676
        {2, false, {false, false}},
677
    },
678
    {
679
        "llvm.nvvm.fmax.ftz.f",
680
        {2, false, {false, false}},
681
    },
682
    {
683
        "llvm.nvvm.fmax.f",
684
        {2, false, {false, false}},
685
    },
686
    {
687
        "llvm.nvvm.min.ui",
688
        {2, false, {false, false}},
689
    },
690
    {
691
        "llvm.nvvm.min.i",
692
        {2, false, {false, false}},
693
    },
694
    {
695
        "llvm.nvvm.max.i",
696
        {2, false, {false, false}},
697
    },
698
    {
699
        "llvm.annotation.i1",
700
        {4, false, {false, true, true, false}},
701
    },
702
    {
703
        "llvm.nvvm.fmin.ftz.f",
704
        {2, false, {false, false}},
705
    },
706
    {
707
        "llvm.nvvm.fmin.f",
708
        {2, false, {false, false}},
709
    },
710
    {
711
        "llvm.nvvm.lg2.approx.ftz.f",
712
        {1, false, {false}},
713
    },
714
    {
715
        "llvm.nvvm.lg2.approx.f",
716
        {1, false, {false}},
717
    },
718
    {
719
        "llvm.nvvm.ex2.approx.ftz.f",
720
        {1, false, {false}},
721
    },
722
    {
723
        "llvm.nvvm.ex2.approx.f",
724
        {1, false, {false}},
725
    },
726
    {
727
        "llvm.nvvm.sqrt.f",
728
        {1, false, {false}},
729
    },
730
    {
731
        "llvm.nvvm.sqrt.rn.d",
732
        {1, false, {false}},
733
    },
734
    {
735
        "llvm.nvvm.rsqrt.approx.ftz.f",
736
        {1, false, {false}},
737
    },
738
    {
739
        "llvm.nvvm.rsqrt.approx.f",
740
        {1, false, {false}},
741
    },
742
    {
743
        "llvm.nvvm.floor.ftz.f",
744
        {1, false, {false}},
745
    },
746
    {
747
        "llvm.nvvm.floor.f",
748
        {1, false, {false}},
749
    },
750
    {
751
        "llvm.nvvm.mul24.i",
752
        {2, false, {false, false}},
753
    },
754
    {
755
        "llvm.nvvm.mul.rn.ftz.f",
756
        {2, false, {false, false}},
757
    },
758
    {
759
        "llvm.nvvm.mul.rn.f",
760
        {2, false, {false, false}},
761
    },
762
    {
763
        "llvm.nvvm.d2i.hi",
764
        {1, false, {false}},
765
    },
766
    {
767
        "llvm.nvvm.d2i.lo",
768
        {1, false, {false}},
769
    },
770
    {
771
        "llvm.nvvm.d2i.rn",
772
        {1, false, {false}},
773
    },
774
    {
775
        "llvm.nvvm.mul.rn.d",
776
        {2, false, {false, false}},
777
    },
778
    {
779
        "llvm.nvvm.add.rn.d",
780
        {2, false, {false, false}},
781
    },
782
    {
783
        "llvm.nvvm.add.rn.ftz.f",
784
        {2, false, {false, false}},
785
    },
786
    {
787
        "llvm.nvvm.add.rn.f",
788
        {2, false, {false, false}},
789
    },
790
    {
791
        "llvm.nvvm.fma.rn.d",
792
        {3, false, {false, false, false}},
793
    },
794
    {
795
        "llvm.nvvm.fma.rn.ftz.f",
796
        {3, false, {false, false, false}},
797
    },
798
    {
799
        "llvm.nvvm.fma.rn.f",
800
        {3, false, {false, false, false}},
801
    },
802
    {
803
        "llvm.nvvm.abs.i",
804
        {1, false, {false}},
805
    },
806
    {
807
        "llvm.nvvm.lohi.i2d",
808
        {2, false, {false, false}},
809
    },
810
    {
811
        "llvm.nvvm.clz.ll",
812
        {1, false, {false}},
813
    },
814
    {
815
        "llvm.nvvm.ceil.d",
816
        {1, false, {false}},
817
    },
818
    {
819
        "llvm.nvvm.trunc.ftz.f",
820
        {1, false, {false}},
821
    },
822
    {
823
        "llvm.nvvm.trunc.f",
824
        {1, false, {false}},
825
    },
826
    {
827
        "__nvvm_reflect",
828
        {1, false, {true}},
829
    },
830
    {
831
        "__assertfail",
832
        {5, false, {false, false, false, false, false}},
833
    },
834
    {
835
        "llvm.nvvm.atomic.load.add.f32.p0f32",
836
        {2, false, {true, false}},
837
    },
838
    {
839
        "llvm.nvvm.membar.cta",
840
        {0, false, {}},
841
    },
842
    {
843
        "llvm.nvvm.brev32",
844
        {1, false, {false}},
845
    },
846
    {
847
        "llvm.nvvm.clz.i",
848
        {1, false, {false}},
849
    },
850
    {
851
        "llvm.nvvm.popc.i",
852
        {1, false, {false}},
853
    },
854
855
    /* Functions from NAS */
856
    {"memset_pattern16", {3, false, {false, false, false}}},
857
    {"\01_fopen", {2, true, {false, false}}},
858
    {"initADCpar", {1, false, {true}}},
859
    {"ParseParFile", {2, false, {true, true}}},
860
    {"ShowADCPar", {1, false, {true}}},
861
    {"GenerateADC", {1, false, {false}}},
862
    {"NewAdcViewCntl", {2, true, {true, false}}},
863
    {"PartitionCube", {1, false, {true}}},
864
    {"ComputeGivenGroupbys", {1, false, {true}}},
865
    {"CloseAdcView", {1, false, {true}}},
866
    {"timer_stop", {1, false, {false}}},
867
    {"timer_start", {1, false, {false}}},
868
    {"timer_clear", {1, false, {false}}},
869
    {"timer_read", {1, false, {false}}},
870
    {"c_print_results",
871
     {20, false, {true,  false, false, false, false, false, false,
872
                  false, false, true,  false, true,  true,  true,
873
                  true,  true,  true,  true,  true,  true}}},
874
875
    /* Functions from Coral AMG */
876
    {"\01_strtod", {2, false, {false, true}}},
877
    {"sscanf", {3, false, {false, false, true}}},
878
    {"llvm.objectsize.i64.p0i8", {2, false, {false, false}}},
879
    {"__memcpy_chk", {3, false, {true, false, false}}},
880
    {"\01_clock", {0, false, {}}},
881
    {"__strncpy_chk", {3, true, {true, false, false}}},
882
    {"__sprintf_chk", {3, false, {true, false, false}}},
883
    {"llvm.pow.f64", {2, false, {false, false}}},
884
    {"fscanf", {3, false, {false, false, true}}},
885
886
    /* Functions from MPI-PHYLIP */
887
    {"scanf", {2, false, {false, true}}},
888
    {"putc", {2, false, {false, false}}},
889
    {"getc", {1, false, {false}}},
890
    {"islower", {1, false, {false}}},
891
    {"isdigit", {1, false, {false}}},
892
    {"isalpha", {1, false, {false}}},
893
    {"\01_fputs", {2, false, {false, false}}},
894
    {"\01_freopen", {3, true, {false, false, false}}},
895
    {"__strcpy_chk",
896
     {3, false, {true, false, false}}}, // not sure for this one..
897
    {"__memset_chk",
898
     {4, false, {true, false, false, false}}}, // not sure for this one..
899
    {"uppercase", {1, false, {true}}},
900
    {"isupper", {1, false, {true}}},
901
902
    /* Functions from Gadget2 */
903
    {"\01_fwrite", {4, false, {false, false, false, true}}},
904
    {"\01_strerror", {1, true, {false}}},
905
    {"\01_system", {1, false, {true}}},
906
    {"__strcat_chk", {3, true, {true, true, false}}},
907
    {"__error", {0, false, {}}},
908
    {"__memmove_chk", {4, true, {true, true, false, false}}},
909
910
    /* Functions from IOR */
911
    {"\01_sleep", {1, false, {false}}},
912
    {"\01_putenv", {1, false, {true}}},
913
    {"statvfs", {2, false, {true, true}}},
914
    {"\01_realpath$DARWIN_EXTSN", {2, true, {true, true}}},
915
    {"\01_regcomp", {3, false, {true, true, false}}},
916
    {"\01_open", {2, false, {true, false}}},
917
    {"lseek", {3, false, {false, false, false}}},
918
    {"\01_read", {3, false, {false, true, false}}},
919
    {"\01_write", {3, false, {false, true, false}}},
920
    {"\01_close", {1, false, {false}}},
921
    {"isspace", {1, false, {false}}},
922
    {"\01_getopt", {3, false, {false, true, true}}},
923
    {"\01_fsync", {1, false, {false}}},
924
    {"\01_stat$INODE64", {2, false, {true, true}}},
925
926
    /* Functions from CoMD */
927
    {"__assert_rtn", {4, false, {true, true, false, true}}},
928
929
    /* Functions from miniAMR */
930
    {"__exp10", {1, false, {false}}},
931
932
    /* Functions from Hydro */
933
    {"ComputeQEforRow",
934
     {12,
935
      false,
936
      {false, false, false, false, false, false, false, false, false, false,
937
       false, false}}},
938
939
    /* Functions from HPL */
940
    {"__vsprintf_chk", {5, false, {false, false, false, false, false}}},
941
942
    /* LAPACKE */
943
    {"LAPACKE_dlamch", {1, false, {false}}},
944
    {"LAPACKE_clange", {6, false, {false, false, false, false, false, false}}},
945
    {"LAPACKE_clascl_work",
946
     {10,
947
      false,
948
      {false, false, false, false, false, false, false, false, true, false}}},
949
    {"LAPACKE_claset_work",
950
     {8, false, {false, false, false, false, false, false, true, false}}},
951
    {"LAPACKE_dlange", {6, false, {false, false, false, false, false, false}}},
952
    {"LAPACKE_dlascl_work",
953
     {10,
954
      false,
955
      {false, false, false, false, false, false, false, false, true, false}}},
956
    {"LAPACKE_dlaset_work",
957
     {8, false, {false, false, false, false, false, false, true, false}}},
958
    {"LAPACKE_slamch", {1, false, {false}}},
959
    {"LAPACKE_slange", {6, false, {false, false, false, false, false, false}}},
960
    {"LAPACKE_slascl_work",
961
     {10,
962
      false,
963
      {false, false, false, false, false, false, false, false, true, false}}},
964
    {"LAPACKE_slaset_work",
965
     {8, false, {false, false, false, false, false, false, true, false}}},
966
    {"LAPACKE_zlange", {6, false, {false, false, false, false, false, false}}},
967
    {"LAPACKE_zlascl_work",
968
     {10,
969
      false,
970
      {false, false, false, false, false, false, false, false, true, false}}},
971
    {"LAPACKE_zlaset_work",
972
     {8, false, {false, false, false, false, false, false, true, false}}},
973
974
    {"__muldc3", {2, false, {false, false}}},
975
    {"__mulsc3", {2, false, {false, false}}},
976
977
    {NULL, {0, false, {}}}};
978
979
struct FuncDepPair {
980
  char const *Name;
981
  const ExtInfo::DepInfo DepInfo;
982
};
983
984
// TODO
985
#if 0
986
static const funcDepPair funcDepPairs[] = {
987
    /* LLVM intrinsics */
988
    {"llvm.fabs.f64", {1, {}, {0}}},
989
    {"llvm.fabs.v2f64", {1, {}, {0}}},
990
    {"llvm.lifetime.end", {2, {}, {}}},
991
    {"llvm.lifetime.start", {2, {}, {}}},
992
    {"llvm.memcpy.p0i8.p0i8.i32", {5, {{0, {1, 2}}}, {}}},
993
    {"llvm.memcpy.p0i8.p0i8.i64", {5, {{0, {1, 2}}}, {}}},
994
    {"llvm.memmove.p0i8.p0i8.i32", {5, {{0, {1, 2}}, {1, {2}}}, {}}},
995
    {"llvm.memmove.p0i8.p0i8.i64", {5, {{0, {1, 2}}, {1, {2}}}, {}}},
996
    {"llvm.memset.p0i8.i32", {5, {{0, {1, 2}}}, {}}},
997
    {"llvm.memset.p0i8.i64", {5, {{0, {1, 2}}}, {}}},
998
    {"llvm.minnum.v2f64", {2, {}, {0, 1}}},
999
    {"llvm.trap", {0, {}, {}}},
1000
1001
    /* libc */
1002
    {"abort", {0, {}, {}}},
1003
    {"atof", {1, {}, {0}}},
1004
    {"atoi", {1, {}, {0}}},
1005
    {"calloc", {2, {}, {0, 1}}},
1006
    {"ceil", {1, {}, {0}}},
1007
    {"clock", {0, {}, {}}},
1008
    {"clock_gettime", {2, {{1, {0}}}, {}}},
1009
    {"cos", {1, {}, {0}}},
1010
    {"erfc", {1, {}, {0}}},
1011
    {"exit", {1, {}, {}}},
1012
    {"exp", {1, {}, {0}}},
1013
    {"fabs", {1, {}, {0}}},
1014
    {"fabsf", {1, {}, {0}}},
1015
    {"fclose", {1, {}, {}}},
1016
    {"feof", {1, {}, {}}},
1017
    {"fflush", {1, {}, {}}},
1018
    {"fgets", {3, {{0, {1, 2}}}, {1, 2}}},
1019
    {"floor", {1, {}, {0}}},
1020
    {"fmax", {2, {}, {0, 1}}},
1021
    {"fmin", {2, {}, {0, 1}}},
1022
    {"fopen", {2, {}, {}}},
1023
    {"fprintf", {3, {}, {}}},
1024
    {"fputc", {2, {}, {}}},
1025
    {"fread", {4, {{0, {1, 2, 3}}}, {}}},
1026
    {"free", {1, {}, {}}},
1027
    {"fwrite", {4, {{3, {0, 1, 2}}}, {}}},
1028
    {"gethostname", {2, {{1, {0}}}, {}}},
1029
    {"ldexp", {2, {}, {0, 1}}},
1030
    {"log", {1, {}, {0}}},
1031
    {"malloc", {1, {}, {}}},
1032
    {"mkdir", {2, {}, {}}},
1033
    {"move_pages", {6, {}, {}}},
1034
    {"numa_num_configured_nodes", {0, {}, {}}},
1035
    {"pow", {2, {}, {0, 1}}},
1036
    {"printf", {2, {}, {}}},
1037
    {"putchar", {1, {}, {}}},
1038
    {"puts", {1, {}, {}}},
1039
    {"qsort", {4, {}, {}}},
1040
    {"realloc", {2, {{0, {0, 1}}}, {0, 1}}},
1041
    {"sin", {1, {}, {0}}},
1042
    {"sprintf", {3, {{0, {1, 2}}}, {}}},
1043
    {"sqrt", {1, {}, {0}}},
1044
    {"strcat", {2, {{0, {1}}}, {0, 1}}},
1045
    {"strchr", {2, {}, {0, 1}}},
1046
    {"strcmp", {2, {}, {0, 1}}},
1047
    {"strcpy", {2, {}, {}}},
1048
    {"strcspn", {2, {}, {0, 1}}},
1049
    {"strerror", {1, {}, {}}},
1050
    {"strlen", {1, {}, {0}}},
1051
    {"strncmp", {3, {}, {0, 1, 2}}},
1052
    {"strncpy", {3, {{0, {1, 2}}}, {1, 2}}},
1053
    {"strspn", {2, {}, {0, 1}}},
1054
    {"strtod", {2, {}, {0}}},
1055
    {"strtol", {3, {}, {}}},
1056
    {"system", {1, {}, {}}},
1057
    {"unlink", {1, {}, {}}},
1058
    {"__assert_fail", {4, {}, {}}},
1059
    {"__errno_location", {0, {}, {}}},
1060
    {"__isoc99_fscanf", {3, {{2, {0, 1}}}, {}}},
1061
    {"__isoc99_scanf", {2, {{1, {0}}}, {}}},
1062
    {"__isoc99_sscanf", {3, {{2, {0, 1}}}, {}}},
1063
1064
    /* MPI */
1065
    {"MPI_Abort", {2, {}, {}}},
1066
    {"MPI_Address", {2, {}, {}}},
1067
    {"MPI_Allgather", {7, {}, {}}},
1068
    {"MPI_Allgatherv", {8, {}, {}}},
1069
    {"MPI_Allreduce", {6, {}, {}}},
1070
    {"MPI_Alltoall", {7, {}, {}}},
1071
    {"MPI_Alltoallv", {9, {}, {}}},
1072
    {"MPI_Barrier", {1, {}, {}}},
1073
    {"MPI_Bcast", {5, {}, {}}},
1074
    {"MPI_Comm_create", {3, {}, {}}},
1075
    {"MPI_Comm_group", {2, {}, {}}},
1076
    {"MPI_Comm_group_incl", {4, {}, {}}},
1077
    {"MPI_Comm_rank", {2, {}, {}}},
1078
    {"MPI_Comm_size", {2, {}, {}}},
1079
    {"MPI_Finalize", {0, {}, {}}},
1080
    {"MPI_Gather", {8, {}, {}}},
1081
    {"MPI_Gatherv", {10, {}, {}}},
1082
    {"MPI_Get_count", {3, {}, {}}},
1083
    {"MPI_Group_free", {1, {}, {}}},
1084
    {"MPI_Group_incl", {4, {}, {}}},
1085
    {"MPI_Init", {2, {}, {}}},
1086
    {"MPI_Iprobe", {5, {}, {}}},
1087
    {"MPI_Irecv", {7, {}, {}}},
1088
    {"MPI_Isend", {7, {}, {}}},
1089
    {"MPI_Op_create", {3, {}, {}}},
1090
    {"MPI_Op_free", {1, {}, {}}},
1091
    {"MPI_Probe", {4, {}, {}}},
1092
    {"MPI_Recv", {7, {}, {}}},
1093
    {"MPI_Reduce", {7, {}, {}}},
1094
    {"MPI_Scan", {6, {}, {}}},
1095
    {"MPI_Scatter", {8, {}, {}}},
1096
    {"MPI_Scatterv", {9, {}, {}}},
1097
    {"MPI_Send", {6, {}, {}}},
1098
    {"MPI_Sendrecv", {12, {}, {}}},
1099
    {"MPI_Ssend", {6, {}, {}}},
1100
    {"MPI_Test", {3, {}, {}}},
1101
    {"MPI_Testall", {4, {}, {}}},
1102
    {"MPI_Type_commit", {1, {}, {}}},
1103
    {"MPI_Type_free", {1, {}, {}}},
1104
    {"MPI_Type_struct", {5, {}, {}}},
1105
    {"MPI_Wait", {2, {}, {}}},
1106
    {"MPI_Waitall", {3, {}, {}}},
1107
    {"MPI_Wtime", {0, {}, {}}},
1108
1109
    /* OpenMP */
1110
    {"omp_get_num_threads", {0, {}, {}}},
1111
    {"omp_get_thread_num", {0, {}, {}}},
1112
    {"__kmpc_fork_call", {4, {}, {}}},
1113
    {"__kmpc_barrier", {2, {}, {}}},
1114
    {"__kmpc_single", {2, {}, {}}},
1115
    {"__kmpc_end_single", {2, {}, {}}},
1116
    {"__kmpc_for_static_init_4", {9, {}, {}}},
1117
    {"__kmpc_for_static_fini", {2, {}, {}}},
1118
1119
    /* gsl */
1120
    {"gsl_integration_qag", {10, {}, {}}},
1121
    {"gsl_integration_workspace_alloc", {1, {}, {}}},
1122
    {"gsl_integration_workspace_free", {1, {}, {}}},
1123
    {"gsl_rng_alloc", {1, {}, {}}},
1124
    {"gsl_rng_set", {2, {}, {}}},
1125
    {"gsl_rng_size", {1, {}, {}}},
1126
    {"gsl_rng_state", {1, {}, {}}},
1127
    {"gsl_rng_uniform", {1, {}, {}}},
1128
1129
    {NULL, {0, {}, {}}}};
1130
1131
const ExtInfo::DepInfo *ExtInfo::getExtDepInfo(const llvm::Function *F) const {
1132
  auto I = extDepInfoMap.find(F->getName());
1133
1134
  if (I != extDepInfoMap.end())
1135
    return I->second;
1136
1137
  return nullptr;
1138
}
1139
#endif
1140
1141
1.76k
ExtInfo::ExtInfo(Module &M) {
1142
990k
  for (FuncModPair const *I = FuncModPairs; I->Name != nullptr; ++I) {
1143
989k
    ExtModInfoMap[I->Name] = &I->ModInfo;
1144
989k
  }
1145
1146
  // for (const funcDepPair *i = funcDepPairs; i->name; ++i)
1147
  // extDepInfoMap[i->name] = &i->depInfo;
1148
1149
1.76k
  SmallVector<StringRef> MissingInfo;
1150
1.76k
  MissingInfo.reserve(M.size());
1151
19.8k
  for (Function &F : M) {
1152
19.8k
    if (!F.isDeclaration() || isIntrinsicDbgFunction(&F)) {
1153
3.61k
      continue;
1154
3.61k
    }
1155
1156
16.2k
    if (getExtModInfo(&F) == nullptr) {
1157
2
      MissingInfo.emplace_back(F.getName());
1158
2
    }
1159
16.2k
  }
1160
1.76k
  if (!MissingInfo.empty()) {
1161
1
    errs() << "Parcoach is missing some information about external functions: ";
1162
1
    bool First = true;
1163
2
    for (StringRef Name : MissingInfo) {
1164
2
      if (!First) {
1165
1
        errs() << ", ";
1166
1
      }
1167
2
      First = false;
1168
2
      errs() << Name;
1169
2
    }
1170
1
    errs() << ".\n"
1171
1
           << "The alias analyses may be innaccurate, you may want to add "
1172
1
           << "these functions to ExtInfo.cpp.\n";
1173
1
  }
1174
1.76k
}
1175
1176
1.76k
ExtInfo::~ExtInfo() {}
1177
1178
126k
ExtInfo::ModInfo const *ExtInfo::getExtModInfo(llvm::Function const *F) const {
1179
126k
  auto I = ExtModInfoMap.find(F->getName());
1180
1181
126k
  if (I != ExtModInfoMap.end()) {
1182
126k
    return I->second;
1183
126k
  }
1184
1185
4
  return nullptr;
1186
126k
}
1187
1188
AnalysisKey ExtInfoAnalysis::Key;
1189
std::unique_ptr<ExtInfo>
1190
1.76k
ExtInfoAnalysis::run(Module &M, ModuleAnalysisManager & /*unused*/) {
1191
1.76k
  TimeTraceScope TTS("parcoach::ExtInfo");
1192
1.76k
  return std::make_unique<ExtInfo>(M);
1193
1.76k
}
1194
1195
} // namespace parcoach