forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			91 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s
 | |
| namespace foo {
 | |
| 
 | |
| // CHECK-NOT: @a = global
 | |
| extern "C" int a;
 | |
| 
 | |
| // CHECK-NOT: @_ZN3foo1bE = global
 | |
| extern int b;
 | |
| 
 | |
| // CHECK: @_ZN3foo1cE = {{(dso_local )?}}global
 | |
| int c = 5;
 | |
| 
 | |
| // CHECK-NOT: @_ZN3foo1dE
 | |
| extern "C" struct d;
 | |
| 
 | |
| // CHECK-NOT: should_not_appear
 | |
| extern "C++" int should_not_appear;
 | |
| 
 | |
| // CHECK: @_ZN3foo10extern_cxxE = {{(dso_local )?}}global
 | |
| extern "C++" int extern_cxx = 0;
 | |
| 
 | |
| }
 | |
| 
 | |
| // CHECK-NOT: @global_a = {{(dso_local )?}}global
 | |
| extern "C" int global_a;
 | |
| 
 | |
| // CHECK: @global_b = {{(dso_local )?}}global
 | |
| extern "C" int global_b = 0;
 | |
| 
 | |
| // CHECK-NOT: should_not_appear
 | |
| extern "C++" int should_not_appear;
 | |
| 
 | |
| // CHECK: @extern_cxx = {{(dso_local )?}}global
 | |
| extern "C++" int extern_cxx = 0;
 | |
| 
 | |
| namespace test1 {
 | |
|   namespace {
 | |
|     struct X {};
 | |
|   }
 | |
|   extern "C" {
 | |
|     // CHECK: @test1_b = {{(dso_local )?}}global
 | |
|     X test1_b = X();
 | |
|   }
 | |
|   void *use = &test1_b;
 | |
|   // CHECK: @_ZN5test13useE = {{(dso_local )?}}global
 | |
| }
 | |
| 
 | |
| namespace test2 {
 | |
|   namespace {
 | |
|     struct X {};
 | |
|   }
 | |
| 
 | |
|   // CHECK: @test2_b = {{(dso_local )?}}global
 | |
|   extern "C" X test2_b;
 | |
|   X test2_b;
 | |
| }
 | |
| 
 | |
| extern "C" {
 | |
|   static int unused_var;
 | |
|   static int unused_fn() { return 0; }
 | |
| 
 | |
|   __attribute__((used)) static int internal_var;
 | |
|   __attribute__((used)) static int internal_fn() { return 0; }
 | |
| 
 | |
|   __attribute__((used)) static int duplicate_internal_var;
 | |
|   __attribute__((used)) static int duplicate_internal_fn() { return 0; }
 | |
| 
 | |
|   namespace N {
 | |
|     __attribute__((used)) static int duplicate_internal_var;
 | |
|     __attribute__((used)) static int duplicate_internal_fn() { return 0; }
 | |
|   }
 | |
| 
 | |
|   // CHECK: @llvm.used = appending global {{.*}} @internal_var {{.*}} @internal_fn 
 | |
| 
 | |
|   // CHECK-NOT: @unused
 | |
|   // CHECK-NOT: @duplicate_internal
 | |
|   // CHECK: @internal_var = internal alias i32, i32* @_ZL12internal_var
 | |
|   // CHECK-NOT: @unused
 | |
|   // CHECK-NOT: @duplicate_internal
 | |
|   // CHECK: @internal_fn = internal alias i32 (), i32 ()* @_ZL11internal_fnv
 | |
|   // CHECK-NOT: @unused
 | |
|   // CHECK-NOT: @duplicate_internal
 | |
| }
 | |
| 
 | |
| namespace PR19411 {
 | |
|   struct A { void f(); };
 | |
|   extern "C" void A::f() { void g(); g(); }
 | |
|   // CHECK-LABEL: @_ZN7PR194111A1fEv(
 | |
|   // CHECK: call {{.*}}void @g()
 | |
| }
 |