File: codegen.test

package info (click to toggle)
llvm-toolchain-14 1%3A14.0.6-16
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,496,368 kB
  • sloc: cpp: 5,593,980; ansic: 986,873; asm: 585,869; python: 184,223; objc: 72,530; lisp: 31,119; f90: 27,793; javascript: 9,780; pascal: 9,762; sh: 9,482; perl: 7,468; ml: 5,432; awk: 3,523; makefile: 2,547; xml: 953; cs: 573; fortran: 567
file content (51 lines) | stat: -rw-r--r-- 2,666 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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).

BOTH: 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* noundef %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