forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			53 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| RUN: rm -rf %t
 | |
| REQUIRES: x86-registered-target
 | |
| 
 | |
| RUN: %clang_cc1 -triple=x86_64-linux-gnu -fmodules-codegen -fmodules-debuginfo -x c++ -fmodules -emit-module -fmodule-name=foo %S/Inputs/codegen/foo.modulemap -o %t/foo.pcm
 | |
| 
 | |
| RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - %t/foo.pcm | FileCheck --check-prefix=FOO --check-prefix=BOTH %s
 | |
| RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -debug-info-kind=limited -o - -fmodules -disable-llvm-passes -fmodule-file=%t/foo.pcm %S/Inputs/codegen/use.cpp | FileCheck --check-prefix=BOTH --check-prefix=USE %s
 | |
| 
 | |
| 
 | |
| For want of any better definition, inline asm goes "everywhere" the same as it
 | |
| if it were in a header (with the disadvantage that the inline asm will be
 | |
| included in the program if the module is used, even if the header containing
 | |
| the inline asm is never included - unlike a non-modular build).
 | |
| 
 | |
| This is inconsistent with how namespace scope static variables are handled -
 | |
| where they only appear in the code that includes a header. This functionality
 | |
| was implemented to workaround/support the initialization of iostreams
 | |
| (implemented as a namespace scope static in the header - only to be provided
 | |
| when that specific header is included in the program).
 | |
| 
 | |
| FOO: module asm "narf"
 | |
| USE: module asm "narf"
 | |
| 
 | |
| FOO: $_Z2f1PKcz = comdat any
 | |
| FOO: $_ZN13implicit_dtorD1Ev = comdat any
 | |
| USE: $_Z4instIiEvv = comdat any
 | |
| USE: $_Z10always_inlv = comdat any
 | |
| FOO: $_ZN13implicit_dtorD2Ev = comdat any
 | |
| FOO: define weak_odr void @_Z2f1PKcz(i8* %fmt, ...) #{{[0-9]+}} comdat
 | |
| FOO:   call void @llvm.va_start(i8* %{{[a-zA-Z0-9]*}})
 | |
| 
 | |
| Test that implicit special members are emitted into the FOO module if they're
 | |
| ODR used there, otherwise emit them linkonce_odr as usual in the use.
 | |
| 
 | |
| FIXME: Proactively instantiate any valid implicit special members to emit them into the module object.
 | |
| 
 | |
| FOO: define weak_odr void @_ZN13implicit_dtorD1Ev
 | |
| FOO: define weak_odr void @_Z4instIfEvv
 | |
| FOO: define weak_odr void @_ZN13implicit_dtorD2Ev
 | |
| 
 | |
| USE: define linkonce_odr void @_ZN20uninst_implicit_dtorD1Ev
 | |
| USE: define linkonce_odr void @_Z4instIiEvv
 | |
| USE: define linkonce_odr void @_Z10always_inlv
 | |
| USE: define linkonce_odr void @_ZN20uninst_implicit_dtorD2Ev
 | |
| 
 | |
| Modular debug info puts the definition of a class defined in a module in that
 | |
| module's object. Users of the module only get a declaration.
 | |
| 
 | |
| 'distinct' is used for definition records (the flags field is empty/unspecified)
 | |
| FOO: = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "implicit_dtor"
 | |
| Declarations are non-distinct and include the 'DIFlagFwdDecl' flag.
 | |
| USE: = !DICompositeType(tag: DW_TAG_structure_type, name: "implicit_dtor", {{.*}}, flags: DIFlagFwdDecl
 |