1 | RUN: rm -rf %t |
2 | REQUIRES: x86-registered-target |
3 | |
4 | 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 |
5 | |
6 | 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 |
7 | 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 |
8 | |
9 | |
10 | For want of any better definition, inline asm goes "everywhere" the same as it |
11 | if it were in a header (with the disadvantage that the inline asm will be |
12 | included in the program if the module is used, even if the header containing |
13 | the inline asm is never included - unlike a non-modular build). |
14 | |
15 | This is inconsistent with how namespace scope static variables are handled - |
16 | where they only appear in the code that includes a header. This functionality |
17 | was implemented to workaround/support the initialization of iostreams |
18 | (implemented as a namespace scope static in the header - only to be provided |
19 | when that specific header is included in the program). |
20 | |
21 | FOO: module asm "narf" |
22 | USE: module asm "narf" |
23 | |
24 | FOO: $_Z2f1PKcz = comdat any |
25 | FOO: $_ZN13implicit_dtorD1Ev = comdat any |
26 | USE: $_Z4instIiEvv = comdat any |
27 | USE: $_Z10always_inlv = comdat any |
28 | FOO: $_ZN13implicit_dtorD2Ev = comdat any |
29 | FOO: define weak_odr void @_Z2f1PKcz(i8* %fmt, ...) #{{[0-9]+}} comdat |
30 | FOO: call void @llvm.va_start(i8* %{{[a-zA-Z0-9]*}}) |
31 | |
32 | Test that implicit special members are emitted into the FOO module if they're |
33 | ODR used there, otherwise emit them linkonce_odr as usual in the use. |
34 | |
35 | FIXME: Proactively instantiate any valid implicit special members to emit them into the module object. |
36 | |
37 | FOO: define weak_odr void @_ZN13implicit_dtorD1Ev |
38 | FOO: define weak_odr void @_Z4instIfEvv |
39 | FOO: define weak_odr void @_ZN13implicit_dtorD2Ev |
40 | |
41 | USE: define linkonce_odr void @_ZN20uninst_implicit_dtorD1Ev |
42 | USE: define linkonce_odr void @_Z4instIiEvv |
43 | USE: define linkonce_odr void @_Z10always_inlv |
44 | USE: define linkonce_odr void @_ZN20uninst_implicit_dtorD2Ev |
45 | |
46 | Modular debug info puts the definition of a class defined in a module in that |
47 | module's object. Users of the module only get a declaration. |
48 | |
49 | 'distinct' is used for definition records (the flags field is empty/unspecified) |
50 | FOO: = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "implicit_dtor" |
51 | Declarations are non-distinct and include the 'DIFlagFwdDecl' flag. |
52 | USE: = !DICompositeType(tag: DW_TAG_structure_type, name: "implicit_dtor", {{.*}}, flags: DIFlagFwdDecl |
53 | |