147 lines · plain
1/* Compile with:2 cat >modules.modulemap <<EOF3 module Foo {4 header "Foo.h"5 export *6 }7 module Bar {8 header "Bar.h"9 export *10 }11EOF12 clang -D BAR_H -E -o Bar.h modules.m13 clang -D FOO_H -E -o Foo.h modules.m14 clang -D ODR_VIOLATION_C -E -o odr_violation.c modules.m15 clang -c -fmodules -fmodule-map-file=modules.modulemap \16 -g -gmodules -fmodules-cache-path=. \17 -Xclang -fdisable-module-hash modules.m -o 1.o18 clang -c -g odr_violation.c -o 2.o19*/20 21// RUN: dsymutil -f -oso-prepend-path=%p/../Inputs/modules \22// RUN: -y %p/dummy-debug-map.map -o - \23// RUN: | llvm-dwarfdump -v --debug-info - | FileCheck %s24 25// RUN: dsymutil -f -oso-prepend-path=%p/../Inputs/modules -y \26// RUN: %p/dummy-debug-map.map -o %t 2>&1 | FileCheck --check-prefix=WARN %s27 28// WARN-NOT: warning: hash mismatch29 30// ---------------------------------------------------------------------31#ifdef BAR_H32// ---------------------------------------------------------------------33// CHECK: DW_TAG_compile_unit34// CHECK-NOT: DW_AT_GNU_dwo_id35// CHECK-NOT: DW_TAG36// CHECK: DW_TAG_module37// CHECK-NEXT: DW_AT_name{{.*}}"Bar"38// CHECK: 0x0[[BAR:.*]]: DW_TAG_structure_type39// CHECK-NOT: DW_TAG40// CHECK: DW_AT_name {{.*}}"Bar"41// CHECK-NOT: DW_TAG42// CHECK: DW_TAG_member43// CHECK: DW_AT_name {{.*}}"value"44// CHECK: DW_TAG_structure_type45// CHECK-NOT: DW_TAG46// CHECK: DW_AT_name {{.*}}"PruneMeNot"47 48struct Bar {49 int value;50};51 52struct PruneMeNot;53 54#else55// ---------------------------------------------------------------------56#ifdef FOO_H57// ---------------------------------------------------------------------58// CHECK: DW_TAG_compile_unit59// CHECK-NOT: DW_AT_GNU_dwo_id60// CHECK-NOT: DW_TAG61// CHECK: 0x0[[FOO:.*]]: DW_TAG_module62// CHECK-NEXT: DW_AT_name{{.*}}"Foo"63// CHECK-NOT: DW_TAG64// CHECK: 0x0[[BARTD:.*]]: DW_TAG_typedef65// CHECK-NOT: DW_TAG66// CHECK: DW_AT_type [DW_FORM_ref_addr] (0x{{0*}}[[BAR]]67// CHECK: DW_TAG_structure_type68// CHECK-NEXT: DW_AT_name{{.*}}"S"69// CHECK-NOT: DW_TAG70// CHECK: 0x0[[INTERFACE:.*]]: DW_TAG_structure_type71// CHECK-NEXT: DW_AT_name{{.*}}"Foo"72 73@import Bar;74typedef struct Bar Bar;75struct S {};76 77@interface Foo {78 int ivar;79}80@end81 82#else83// ---------------------------------------------------------------------84#ifdef ODR_VIOLATION_C85// ---------------------------------------------------------------------86 87struct Bar {88 int i;89};90typedef struct Bar Bar;91Bar odr_violation = { 42 };92 93// ---------------------------------------------------------------------94#else95// ---------------------------------------------------------------------96 97// CHECK: DW_TAG_compile_unit98// CHECK-NOT: DW_AT_GNU_dwo_id99// CHECK: DW_AT_low_pc100// CHECK-NOT: DW_TAG_module101// CHECK-NOT: DW_TAG_typedef102//103// CHECK: DW_TAG_imported_declaration104// CHECK-NOT: DW_TAG105// CHECK: DW_AT_import [DW_FORM_ref_addr] (0x{{0*}}[[FOO]]106//107// CHECK: DW_TAG_subprogram108// CHECK: DW_AT_name {{.*}}"main"109//110// CHECK: DW_TAG_variable111// CHECK-NOT: DW_TAG112// CHECK: DW_AT_name{{.*}}"bar"113// CHECK-NOT: DW_TAG114// CHECK: DW_AT_type [DW_FORM_ref_addr] (0x{{0*}}[[BARTD]]115// CHECK: DW_TAG_variable116// CHECK-NOT: DW_TAG117// CHECK: DW_AT_name{{.*}}"foo"118// CHECK-NOT: DW_TAG119// CHECK: DW_AT_type {{.*}}{0x{{0*}}[[PTR:.*]]}120//121// CHECK: 0x{{0*}}[[PTR]]: DW_TAG_pointer_type122// CHECK-NEXT: DW_AT_type [DW_FORM_ref_addr] (0x{{0*}}[[INTERFACE]]123extern int odr_violation;124 125@import Foo;126int main(int argc, char **argv) {127 Bar bar;128 Foo *foo = 0;129 bar.value = odr_violation;130 return bar.value;131}132#endif133#endif134#endif135 136// CHECK: DW_TAG_compile_unit137// CHECK-NOT: DW_AT_GNU_dwo_id138// CHECK: DW_AT_name {{.*}}"odr_violation.c"139// CHECK: DW_TAG_variable140// CHECK: DW_AT_name {{.*}}"odr_violation"141// CHECK: DW_AT_type [DW_FORM_ref4] ({{.*}}{0x{{0*}}[[BAR2:.*]]}142// CHECK: 0x{{0*}}[[BAR2]]: DW_TAG_typedef143// CHECK: DW_AT_type [DW_FORM_ref4] ({{.*}}{0x{{0*}}[[BAR3:.*]]}144// CHECK: DW_AT_name {{.*}}"Bar"145// CHECK: 0x{{0*}}[[BAR3]]: DW_TAG_structure_type146// CHECK-NEXT: DW_AT_name {{.*}}"Bar"147