1// CHECK:        -:    0:Source:{{.*}}Inputs/instrprof-dlopen-dlclose-main.c
2// CHECK-NEXT:        -:    0:Graph:instrprof-dlopen-dlclose-main.gcno
3// CHECK-NEXT:        -:    0:Data:instrprof-dlopen-dlclose-main.gcda
4// CHECK-NEXT:        -:    0:Runs:1
5// CHECK-NEXT:        -:    0:Programs:1
6// CHECK-NEXT:        -:    1:#include <dlfcn.h>
7// CHECK-NEXT:        -:    2:#include <stdio.h>
8// CHECK-NEXT:        -:    3:#include <stdlib.h>
9// CHECK-NEXT:        -:    4:
10// CHECK-NEXT:        1:    5:int main(int argc, char *argv[]) {
11// CHECK-NEXT:        1:    6:  dlerror();
12// CHECK-NEXT:        1:    7:  void *f1_handle = dlopen("func.shared", RTLD_LAZY | RTLD_GLOBAL);
13// CHECK-NEXT:        1:    8:  if (f1_handle == NULL) {
14// CHECK-NEXT:    #####:    9:    fprintf(stderr, "unable to open 'func.shared': %s\n", dlerror());
15// CHECK-NEXT:    #####:   10:    return EXIT_FAILURE;
16// CHECK-NEXT:        -:   11:  }
17// CHECK-NEXT:        -:   12:
18// CHECK-NEXT:        1:   13:  void (*func)(void) = (void (*)(void))dlsym(f1_handle, "func");
19// CHECK-NEXT:        1:   14:  if (func == NULL) {
20// CHECK-NEXT:    #####:   15:    fprintf(stderr, "unable to lookup symbol 'func': %s\n", dlerror());
21// CHECK-NEXT:    #####:   16:    return EXIT_FAILURE;
22// CHECK-NEXT:        -:   17:  }
23// CHECK-NEXT:        -:   18:
24// CHECK-NEXT:        1:   19:  dlerror();
25// CHECK-NEXT:        1:   20:  void *f2_handle = dlopen("func2.shared", RTLD_LAZY | RTLD_GLOBAL);
26// CHECK-NEXT:        1:   21:  if (f2_handle == NULL) {
27// CHECK-NEXT:    #####:   22:    fprintf(stderr, "unable to open 'func2.shared': %s\n", dlerror());
28// CHECK-NEXT:    #####:   23:    return EXIT_FAILURE;
29// CHECK-NEXT:        -:   24:  }
30// CHECK-NEXT:        -:   25:
31// CHECK-NEXT:        1:   26:  void (*func2)(void) = (void (*)(void))dlsym(f2_handle, "func2");
32// CHECK-NEXT:        1:   27:  if (func2 == NULL) {
33// CHECK-NEXT:    #####:   28:    fprintf(stderr, "unable to lookup symbol 'func2': %s\n", dlerror());
34// CHECK-NEXT:    #####:   29:    return EXIT_FAILURE;
35// CHECK-NEXT:        -:   30:  }
36// CHECK-NEXT:        1:   31:  func2();
37// CHECK-NEXT:        -:   32:
38// CHECK-NEXT:        -:   33:#ifdef USE_LIB3
39// CHECK-NEXT:        -:   34:  void *f3_handle = dlopen("func3.shared", RTLD_LAZY | RTLD_GLOBAL);
40// CHECK-NEXT:        -:   35:  if (f3_handle == NULL) {
41// CHECK-NEXT:        -:   36:    fprintf(stderr, "unable to open 'func3.shared': %s\n", dlerror());
42// CHECK-NEXT:        -:   37:    return EXIT_FAILURE;
43// CHECK-NEXT:        -:   38:  }
44// CHECK-NEXT:        -:   39:
45// CHECK-NEXT:        -:   40:  void (*func3)(void) = (void (*)(void))dlsym(f3_handle, "func3");
46// CHECK-NEXT:        -:   41:  if (func3 == NULL) {
47// CHECK-NEXT:        -:   42:    fprintf(stderr, "unable to lookup symbol 'func3': %s\n", dlerror());
48// CHECK-NEXT:        -:   43:    return EXIT_FAILURE;
49// CHECK-NEXT:        -:   44:  }
50// CHECK-NEXT:        -:   45:  func3();
51// CHECK-NEXT:        -:   46:#endif
52// CHECK-NEXT:        -:   47:
53// CHECK-NEXT:        1:   48:  dlerror();
54// CHECK-NEXT:        1:   49:  void (*gcov_flush1)() = (void (*)())dlsym(f1_handle, "__gcov_flush");
55// CHECK-NEXT:        1:   50:  if (gcov_flush1 == NULL) {
56// CHECK-NEXT:    #####:   51:    fprintf(stderr, "unable to find __gcov_flush in func.shared': %s\n", dlerror());
57// CHECK-NEXT:    #####:   52:    return EXIT_FAILURE;
58// CHECK-NEXT:        -:   53:  }
59// CHECK-NEXT:        -:   54:
60// CHECK-NEXT:        1:   55:  dlerror();
61// CHECK-NEXT:        1:   56:  void (*gcov_flush2)() = (void (*)())dlsym(f2_handle, "__gcov_flush");
62// CHECK-NEXT:        1:   57:  if (gcov_flush2 == NULL) {
63// CHECK-NEXT:    #####:   58:    fprintf(stderr, "unable to find __gcov_flush in func2.shared': %s\n", dlerror());
64// CHECK-NEXT:    #####:   59:    return EXIT_FAILURE;
65// CHECK-NEXT:        -:   60:  }
66// CHECK-NEXT:        -:   61:
67// CHECK-NEXT:        1:   62:  if (gcov_flush1 == gcov_flush2) {
68// CHECK-NEXT:    #####:   63:    fprintf(stderr, "Same __gcov_flush found in func.shared and func2.shared\n");
69// CHECK-NEXT:    #####:   64:    return EXIT_FAILURE;
70// CHECK-NEXT:        -:   65:  }
71// CHECK-NEXT:        -:   66:
72// CHECK-NEXT:        1:   67:  dlerror();
73// CHECK-NEXT:        1:   68:  if (dlclose(f2_handle) != 0) {
74// CHECK-NEXT:    #####:   69:    fprintf(stderr, "unable to close 'func2.shared': %s\n", dlerror());
75// CHECK-NEXT:    #####:   70:    return EXIT_FAILURE;
76// CHECK-NEXT:        -:   71:  }
77// CHECK-NEXT:        -:   72:
78// CHECK-NEXT:        1:   73:  func();
79// CHECK-NEXT:        -:   74:
80// CHECK-NEXT:        1:   75:  int g1 = 0;
81// CHECK-NEXT:        1:   76:  int g2 = 0;
82// CHECK-NEXT:        1:   77:  int n = 10;
83// CHECK-NEXT:        -:   78:
84// CHECK-NEXT:        1:   79:  if (n % 5 == 0)
85// CHECK-NEXT:        1:   80:    g1++;
86// CHECK-NEXT:        -:   81:  else
87// CHECK-NEXT:    #####:   82:    g2++;
88// CHECK-NEXT:        -:   83:
89// CHECK-NEXT:        1:   84:  return EXIT_SUCCESS;
90// CHECK-NEXT:        1:   85:}
91// CHECK-NEXT:        -:   86:
92