Clang Project

clang_source_code/test/CodeGen/callback_pthread_create.c
1// RUN: %clang_cc1 -O1 %s -S -emit-llvm -o - | FileCheck %s
2// RUN: %clang_cc1 -O1 %s -S -emit-llvm -o - | opt -ipconstprop -S | FileCheck --check-prefix=IPCP %s
3
4// CHECK: declare !callback ![[cid:[0-9]+]] {{.*}}i32 @pthread_create
5// CHECK: ![[cid]] = !{![[cidb:[0-9]+]]}
6// CHECK: ![[cidb]] = !{i64 2, i64 3, i1 false}
7
8// Taken from test/Analysis/retain-release.m
9//{
10struct _opaque_pthread_t {};
11struct _opaque_pthread_attr_t {};
12typedef struct _opaque_pthread_t *__darwin_pthread_t;
13typedef struct _opaque_pthread_attr_t __darwin_pthread_attr_t;
14typedef __darwin_pthread_t pthread_t;
15typedef __darwin_pthread_attr_t pthread_attr_t;
16
17int pthread_create(pthread_t *, const pthread_attr_t *,
18                   void *(*)(void *), void *);
19//}
20
21const int GlobalVar = 0;
22
23static void *callee0(void *payload) {
24// IPCP:      define internal i8* @callee0
25// IPCP:        ret i8* null
26  return payload;
27}
28
29static void *callee1(void *payload) {
30// IPCP:      define internal i8* @callee1
31// IPCP:        ret i8* bitcast (i32* @GlobalVar to i8*)
32  return payload;
33}
34
35void foo() {
36  pthread_t MyFirstThread;
37  pthread_create(&MyFirstThread, 0, callee0, 0);
38
39  pthread_t MySecondThread;
40  pthread_create(&MySecondThread, 0, callee1, (void *)&GlobalVar);
41}
42