llvm/llvm/test/tools/dsymutil/X86/DWARFLinkerParallel/odr-uniquing.cpp

/* Compile with:
   clang -g -c  odr-uniquing.cpp -o odr-uniquing/1.o
   cp odr-uniquing/1.o odr-uniquing/2.o
   The aim of these test is to check that all the 'type types' that
   should be uniqued through the ODR really are.

   The resulting object file is linked against itself using a fake
   debug map. The end result is:
    - with ODR uniquing: all types in second and third CUs should point back
   to the types of the first CU(except types from anonymous namespace).
    - without ODR uniquing: all types are re-emited in the second CU.
 */

/* Check by llvm-dwarfdump --verify */
// RUN: dsymutil --linker=parallel -f -oso-prepend-path=%p/../../Inputs/odr-uniquing \
// RUN: -y %p/../dummy-debug-map.map -o - | llvm-dwarfdump --verify - | \
// RUN: FileCheck -check-prefixes=VERIFY %s
// RUN: dsymutil --linker=parallel -f -oso-prepend-path=%p/../../Inputs/odr-uniquing \
// RUN: -y %p/../dummy-debug-map.map -no-odr -o - | llvm-dwarfdump --verify - | \
// RUN: FileCheck -check-prefixes=VERIFY %s

/* Check for llvm-dwarfdump -a output */
// RUN: dsymutil --linker=parallel -f -oso-prepend-path=%p/../../Inputs/odr-uniquing \
// RUN: -y %p/../dummy-debug-map.map -o - | llvm-dwarfdump -v -a - | \
// RUN: FileCheck -check-prefixes=CHECK %s
// RUN: dsymutil --linker=parallel -f -oso-prepend-path=%p/../../Inputs/odr-uniquing \
// RUN: -y %p/../dummy-debug-map.map -no-odr -o - | llvm-dwarfdump -v -a - | \
// RUN: FileCheck -check-prefixes=CHECK-NOODR %s

struct S {
  struct Nested {};
};

namespace N {
class C {};
} // namespace N

union U {
  class C {
  } C;
  struct S {
  } S;
};

typedef S AliasForS;

namespace {
class AnonC {};
} // namespace

// This function is only here to hold objects that refer to the above types.
void foo() {
  AliasForS s;
  S::Nested n;
  N::C nc;
  AnonC ac;
  U u;
}

// VERIFY: Verifying .debug_abbrev...
// VERIFY: Verifying .debug_info Unit Header Chain...
// VERIFY: Verifying .debug_types Unit Header Chain...
// VERIFY: Verifying .apple_names...
// VERIFY: Verifying .apple_types...
// VERIFY: Verifying .apple_namespaces...
// VERIFY: Verifying .apple_objc...
// VERIFY: No errors.

// The first compile unit contains all the types:
// CHECK: .debug_info contents
// CHECK: DW_TAG_compile_unit
// CHECK: DW_AT_language{{.*}} (DW_LANG_C_plus_plus)
// CHECK: DW_AT_name{{.*}}"__artificial_type_unit")
// CHECK: DW_AT_stmt_list{{.*}}(0x[[LINE_TABLE_OFF1:[0-9a-f]*]])

// CHECK:0x[[N_NAMESPACE:[0-9a-f]*]]:{{.*}}DW_TAG_namespace
// CHECK:DW_AT_name{{.*}}"N"

// CHECK:0x[[C_CLASS:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
// CHECK:DW_AT_name{{.*}}"C"
// CHECK:DW_AT_byte_size [DW_FORM_data1] (0x01)
// CHECK-DAG:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK-DAG:DW_AT_decl_line [DW_FORM_data1] (35)

// CHECK:0x[[S_STRUCTURE:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
// CHECK:DW_AT_name{{.*}}"S"
// CHECK-DAG:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK-DAG:DW_AT_decl_line [DW_FORM_data1] (22)

// CHECK:0x[[S_STRUCTURE_NESTED:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
// CHECK:DW_AT_name{{.*}}"Nested"
// CHECK-DAG:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp")
// CHECK-DAG:DW_AT_decl_line [DW_FORM_data1]       (23)

// CHECK:0x[[TYPEDEF_ALIASFORS:[0-9a-f]*]]:{{.*}}DW_TAG_typedef
// CHECK:DW_AT_name{{.*}}"AliasForS"
// CHECK-DAG:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK-DAG:DW_AT_decl_line [DW_FORM_data1] (58)

// CHECK:0x[[U_UNION:[0-9a-f]*]]:{{.*}}DW_TAG_union_type
// CHECK:DW_AT_name{{.*}}"U"
// CHECK-DAG:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK-DAG:DW_AT_decl_line [DW_FORM_data1] (45)

// CHECK:0x[[U_C_CLASS:[0-9a-f]*]]:{{.*}}DW_TAG_class_type
// CHECK:DW_AT_name{{.*}}"C"
// CHECK-DAG:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK-DAG:DW_AT_decl_line [DW_FORM_data1] (46)

// CHECK:0x[[U_C_MEMBER:[0-9a-f]*]]:{{.*}}DW_TAG_member
// CHECK:DW_AT_name{{.*}}"C"
// CHECK-DAG:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK-DAG:DW_AT_decl_line [DW_FORM_data1] (46)

// CHECK:0x[[U_S_MEMBER:[0-9a-f]*]]:{{.*}}DW_TAG_member
// CHECK:DW_AT_name{{.*}}"S"
// CHECK-DAG:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK-DAG:DW_AT_decl_line [DW_FORM_data1] (47)

// CHECK:0x[[U_S_STRUCT:[0-9a-f]*]]:{{.*}}DW_TAG_structure_type
// CHECK:DW_AT_name{{.*}}"S"
// CHECK-DAG:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK-DAG:DW_AT_decl_line [DW_FORM_data1] (47)

// The second compile unit contains subprogram and its variables:
// CHECK:DW_TAG_compile_unit
// CHECK:DW_AT_name{{.*}}"odr-uniquing.cpp"
// CHECK-NEXT: DW_AT_stmt_list{{.*}}(0x[[LINE_TABLE_OFF2:[0-9a-f]*]])

// CHECK:DW_TAG_subprogram
// CHECK:DW_AT_low_pc
// CHECK:DW_AT_high_pc
// CHECK:DW_AT_frame_base
// CHECK:DW_AT_MIPS_linkage_name{{.*}}"_Z3foov"
// CHECK:DW_AT_name{{.*}}"foo"
// CHECK:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK:DW_AT_decl_line [DW_FORM_data1] (74)
// CHECK:DW_AT_external

// CHECK:DW_TAG_variable
// CHECK:DW_AT_name{{.*}}"s"
// CHECK:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK:DW_AT_decl_line [DW_FORM_data1] (75)
// CHECK:DW_AT_type [DW_FORM_ref_addr] (0x{{0*}}[[TYPEDEF_ALIASFORS]] "AliasForS

// CHECK:DW_TAG_variable
// CHECK:DW_AT_name{{.*}}"n"
// CHECK:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK:DW_AT_decl_line [DW_FORM_data1] (76)
// CHECK:DW_AT_type [DW_FORM_ref_addr] (0x{{0*}}[[S_STRUCTURE_NESTED]] "S::Neste

// CHECK:DW_TAG_variable
// CHECK:DW_AT_name{{.*}}"nc"
// CHECK:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK:DW_AT_decl_line [DW_FORM_data1] (77)
// CHECK:DW_AT_type [DW_FORM_ref_addr] (0x{{0*}}[[C_CLASS]] "N::C"

// CHECK:DW_TAG_variable
// CHECK:DW_AT_name{{.*}}"ac"
// CHECK:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK:DW_AT_decl_line [DW_FORM_data1] (78)
// CHECK:DW_AT_type [DW_FORM_ref4]{{.*}} {0x[[ANON_CLASS1:[0-9a-f]*]]} "(anonymous namespace)::AnonC")

// CHECK:DW_TAG_variable
// CHECK:DW_AT_name{{.*}}"u"
// CHECK:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK:DW_AT_decl_line [DW_FORM_data1] (79)
// CHECK:DW_AT_type [DW_FORM_ref_addr] (0x{{0*}}[[U_UNION]] "U"

// CHECK:0x[[ANON_NAMESPACE1:[0-9a-f]*]]:{{.*}}DW_TAG_namespace
// CHECK-NEXT:DW_AT_decl_file{{.*}}"{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp"

// CHECK:0x[[ANON_CLASS1]]:{{.*}}DW_TAG_class_type
// CHECK:DW_AT_name{{.*}}"AnonC"
// CHECK:DW_AT_byte_size [DW_FORM_data1] (0x01)
// CHECK:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK:DW_AT_decl_line [DW_FORM_data1] (65)

// The third compile unit contains subprogram and its variables:
// CHECK:DW_TAG_compile_unit
// CHECK:DW_AT_name{{.*}}"odr-uniquing.cpp"
// CHECK-NEXT:DW_AT_stmt_list{{.*}}(0x[[LINE_TABLE_OFF3:[0-9a-f]*]])

// CHECK:DW_TAG_subprogram
// CHECK:DW_AT_low_pc
// CHECK:DW_AT_high_pc
// CHECK:DW_AT_frame_base
// CHECK:DW_AT_MIPS_linkage_name{{.*}}"_Z3foov"
// CHECK:DW_AT_name{{.*}}"foo"
// CHECK:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK:DW_AT_decl_line [DW_FORM_data1] (74)
// CHECK:DW_AT_external

// CHECK:DW_TAG_variable
// CHECK:DW_AT_name{{.*}}"s"
// CHECK:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK:DW_AT_decl_line [DW_FORM_data1] (75)
// CHECK:DW_AT_type [DW_FORM_ref_addr] (0x{{0*}}[[TYPEDEF_ALIASFORS]] "AliasForS

// CHECK:DW_TAG_variable
// CHECK:DW_AT_name{{.*}}"n"
// CHECK:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK:DW_AT_decl_line [DW_FORM_data1] (76)
// CHECK:DW_AT_type [DW_FORM_ref_addr] (0x{{0*}}[[S_STRUCTURE_NESTED]] "S::Neste

// CHECK:DW_TAG_variable
// CHECK:DW_AT_name{{.*}}"nc"
// CHECK:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK:DW_AT_decl_line [DW_FORM_data1] (77)
// CHECK:DW_AT_type [DW_FORM_ref_addr] (0x{{0*}}[[C_CLASS]] "N::C"

// CHECK:DW_TAG_variable
// CHECK:DW_AT_name{{.*}}"ac"
// CHECK:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK:DW_AT_decl_line [DW_FORM_data1] (78)
// CHECK:DW_AT_type [DW_FORM_ref4]{{.*}} {0x[[ANON_CLASS2:[0-9a-f]*]]} "(anonymous namespace)::AnonC")

// CHECK:DW_TAG_variable
// CHECK:DW_AT_name{{.*}}"u"
// CHECK:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK:DW_AT_decl_line [DW_FORM_data1] (79)
// CHECK:DW_AT_type [DW_FORM_ref_addr] (0x{{0*}}[[U_UNION]] "U"

// CHECK:0x[[ANON_NAMESPACE2:[0-9a-f]*]]:{{.*}}DW_TAG_namespace
// CHECK-NEXT:DW_AT_decl_file{{.*}}"{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp"

// CHECK:0x[[ANON_CLASS2]]:{{.*}}DW_TAG_class_type
// CHECK:DW_AT_name{{.*}}"AnonC"
// CHECK:DW_AT_byte_size [DW_FORM_data1] (0x01)
// CHECK:DW_AT_decl_file [DW_FORM_data1] ("{{[\\/]}}tmp{{[\\/]}}odr-uniquing.cpp
// CHECK:DW_AT_decl_line [DW_FORM_data1] (65)

// CHECK:.debug_aranges contents

// CHECK:debug_line[0x[[LINE_TABLE_OFF1]]]

// CHECK:debug_line[0x[[LINE_TABLE_OFF2]]]

// CHECK:debug_line[0x[[LINE_TABLE_OFF3]]]

// CHECK:.debug_str contents:
// CHECK:0x00000000: ""
// CHECK:0x00000001: "clang version 3.8.0 (trunk 244290) (llvm/trunk 244270)"
// CHECK:0x00000038: "odr-uniquing.cpp"
// CHECK:0x00000049: "/tmp"
// CHECK:0x0000004e: "_Z3foov"
// CHECK:0x00000056: "foo"
// CHECK:0x0000005a: "s"
// CHECK:0x0000005c: "n"
// CHECK:0x0000005e: "nc"
// CHECK:0x00000061: "ac"
// CHECK:0x00000064: "u"
// CHECK:0x00000066: "AnonC"
// CHECK:0x0000006c: "(anonymous namespace)"
// CHECK:0x00000082: "llvm DWARFLinkerParallel library version "
// CHECK:0x000000ac: "__artificial_type_unit"
// CHECK:0x000000c3: ""
// CHECK:0x000000c4: "AliasForS"
// CHECK:0x000000ce: "C"
// CHECK:0x000000d0: "N"
// CHECK:0x000000d2: "Nested"
// CHECK:0x000000d9: "S"
// CHECK:0x000000db: "U"


// CHECK:.apple_names
// CHECK: Bucket count: 2
// CHECK: String: {{.*}} "foo"
// CHECK: String: {{.*}} "_Z3foov"

// CHECK:.apple_types
// CHECK: Bucket count: 6
// CHECK: String: {{.*}} "AnonC"
// CHECK: String: {{.*}} "Nested"
// CHECK: String: {{.*}} "S"
// CHECK: String: {{.*}} "C"
// CHECK: String: {{.*}} "U"
// CHECK: String: {{.*}} "AliasForS"

// CHECK:.apple_namespaces
// CHECK: Bucket count: 2
// CHECK: String: {{.*}} "(anonymous namespace)"
// CHECK: String: {{.*}} "N"

// CHECK:.apple_objc
// CHECK:Bucket count: 1

// CHECK-NOODR: .debug_info contents

// CHECK-NOODR: DW_TAG_compile_unit
// CHECK-NOODR: DW_AT_name{{.*}}"odr-uniquing.cpp"
// CHECK-NOODR-NEXT: DW_AT_stmt_list{{.*}}(0x[[LINE_TABLE_OFF1:[0-9a-f]*]])
// CHECK-NOODR: DW_AT_low_pc{{.*}}(0x{{0*}}[[LOW_PC1:[0-9a-f]*]])
// CHECK-NOODR-NEXT: DW_AT_high_pc{{.*}}(0x{{0*}}[[HIGH_PC1:[0-9a-f]*]])

// CHECK-NOODR: DW_TAG_structure_type
// CHECK-NOODR-NEXT: DW_AT_name{{.*}}"S"

// CHECK-NOODR: DW_TAG_structure_type
// CHECK-NOODR-NEXT: DW_AT_name{{.*}}"Nested"

// CHECK-NOODR: DW_TAG_namespace
// CHECK-NOODR-NEXT: DW_AT_name{{.*}}"N"

// CHECK-NOODR: DW_TAG_class_type
// CHECK-NOODR-NEXT: DW_AT_name{{.*}}"C"

// CHECK-NOODR: DW_TAG_union_type
// CHECK-NOODR-NEXT: DW_AT_name{{.*}}"U"

// CHECK-NOODR: DW_TAG_member
// CHECK-NOODR-NEXT: DW_AT_name{{.*}}"C"

// CHECK-NOODR: DW_TAG_class_type
// CHECK-NOODR-NEXT: DW_AT_name{{.*}}"C"

// CHECK-NOODR: DW_TAG_member
// CHECK-NOODR-NEXT: DW_AT_name{{.*}}"S"

// CHECK-NOODR: DW_TAG_structure_type
// CHECK-NOODR-NEXT: DW_AT_name{{.*}}"S"

// CHECK-NOODR: DW_TAG_subprogram
// CHECK-NOODR-NEXT: DW_AT_low_pc
// CHECK-NOODR-NEXT: DW_AT_high_pc
// CHECK-NOODR: DW_AT_MIPS_linkage_name{{.*}}"_Z3foov"
// CHECK-NOODR-NEXT: DW_AT_name{{.*}}"foo"

// CHECK-NOODR: DW_TAG_variable
// CHECK-NOODR: DW_AT_name{{.*}}"s"
// CHECK-NOODR: DW_AT_type{{.*}}"AliasForS"

// CHECK-NOODR: DW_TAG_variable
// CHECK-NOODR: DW_AT_name{{.*}}"n"
// CHECK-NOODR: DW_AT_type{{.*}}"S::Nested"

// CHECK-NOODR: DW_TAG_variable
// CHECK-NOODR: DW_AT_name{{.*}}"nc"
// CHECK-NOODR: DW_AT_type{{.*}}"N::C"

// CHECK-NOODR: DW_TAG_variable
// CHECK-NOODR: DW_AT_name{{.*}}"ac"
// CHECK-NOODR: DW_AT_type{{.*}}"(anonymous namespace)::AnonC"

// CHECK-NOODR: DW_TAG_variable
// CHECK-NOODR: DW_AT_name{{.*}}"u"
// CHECK-NOODR: DW_AT_type{{.*}}"U"

// CHECK-NOODR: DW_TAG_typedef
// CHECK-NOODR: DW_AT_type{{.*}}"S"
// CHECK-NOODR: DW_AT_name{{.*}}"AliasForS"

// CHECK-NOODR: DW_TAG_namespace

// CHECK-NOODR: DW_TAG_class_type
// CHECK-NOODR: DW_AT_name{{.*}}"AnonC"

// CHECK-NOODR: DW_TAG_compile_unit
// CHECK-NOODR: DW_AT_name{{.*}}"odr-uniquing.cpp"
// CHECK-NOODR-NEXT: DW_AT_stmt_list{{.*}}(0x[[LINE_TABLE_OFF2:[0-9a-f]*]])
// CHECK-NOODR: DW_AT_low_pc
// CHECK-NOODR: DW_AT_high_pc

// CHECK-NOODR: DW_TAG_structure_type
// CHECK-NOODR: DW_AT_name{{.*}}"S"

// CHECK-NOODR: DW_TAG_structure_type
// CHECK-NOODR: DW_AT_name{{.*}}"Nested"

// CHECK-NOODR: DW_TAG_namespace
// CHECK-NOODR: DW_AT_name{{.*}}"N"

// CHECK-NOODR: DW_TAG_class_type
// CHECK-NOODR: DW_AT_name{{.*}}"C"

// CHECK-NOODR: DW_TAG_union_type
// CHECK-NOODR: DW_AT_name{{.*}}"U"

// CHECK-NOODR: DW_TAG_member
// CHECK-NOODR: DW_AT_name{{.*}}"C"
// CHECK-NOODR: DW_AT_type{{.*}}"U::C"

// CHECK-NOODR: DW_TAG_class_type
// CHECK-NOODR: DW_AT_name{{.*}}"C"

// CHECK-NOODR: DW_TAG_member
// CHECK-NOODR: DW_AT_name{{.*}}"S"
// CHECK-NOODR: DW_AT_type{{.*}}"U::S"

// CHECK-NOODR: DW_TAG_structure_type
// CHECK-NOODR: DW_AT_name{{.*}}"S"

// CHECK-NOODR: DW_TAG_subprogram
// CHECK-NOODR: DW_AT_low_pc
// CHECK-NOODR: DW_AT_high_pc
// CHECK-NOODR: DW_AT_MIPS_linkage_name{{.*}}"_Z3foov"
// CHECK-NOODR: DW_AT_name{{.*}}"foo"

// CHECK-NOODR: DW_TAG_variable
// CHECK-NOODR: DW_AT_name{{.*}}"s"
// CHECK-NOODR: DW_AT_type{{.*}}"AliasForS"

// CHECK-NOODR: DW_TAG_variable
// CHECK-NOODR: DW_AT_name{{.*}}"n"
// CHECK-NOODR: DW_AT_type{{.*}}"S::Nested"

// CHECK-NOODR: DW_TAG_variable
// CHECK-NOODR: DW_AT_name{{.*}}"nc"
// CHECK-NOODR: DW_AT_type{{.*}} "N::C"

// CHECK-NOODR: DW_TAG_variable
// CHECK-NOODR: DW_AT_name{{.*}}"ac"
// CHECK-NOODR: DW_AT_type{{.*}}"(anonymous namespace)::AnonC"

// CHECK-NOODR: DW_TAG_variable
// CHECK-NOODR: DW_AT_name{{.*}}"u"
// CHECK-NOODR: DW_AT_type{{.*}}"U"

// CHECK-NOODR: DW_TAG_typedef
// CHECK-NOODR: DW_AT_type{{.*}}"S"
// CHECK-NOODR: DW_AT_name{{.*}}"AliasForS"

// CHECK-NOODR: DW_TAG_namespace

// CHECK-NOODR: DW_TAG_class_type
// CHECK-NOODR: DW_AT_name{{.*}}"AnonC"

// CHECK-NOODR:.debug_aranges contents

// CHECK-NOODR:debug_line[0x[[LINE_TABLE_OFF1]]]

// CHECK-NOODR:debug_line[0x[[LINE_TABLE_OFF2]]]

// CHECK-NOODR:.debug_str contents:
// CHECK-NOODR:0x00000000: ""
// CHECK-NOODR:0x00000001: "clang version 3.8.0 (trunk 244290) (llvm/trunk 244270)"
// CHECK-NOODR:0x00000038: "odr-uniquing.cpp"
// CHECK-NOODR:0x00000049: "/tmp"
// CHECK-NOODR:0x0000004e: "S"
// CHECK-NOODR:0x00000050: "Nested"
// CHECK-NOODR:0x00000057: "N"
// CHECK-NOODR:0x00000059: "C"
// CHECK-NOODR:0x0000005b: "U"
// CHECK-NOODR:0x0000005d: "_Z3foov"
// CHECK-NOODR:0x00000065: "foo"
// CHECK-NOODR:0x00000069: "s"
// CHECK-NOODR:0x0000006b: "n"
// CHECK-NOODR:0x0000006d: "nc"
// CHECK-NOODR:0x00000070: "ac"
// CHECK-NOODR:0x00000073: "u"
// CHECK-NOODR:0x00000075: "AliasForS"
// CHECK-NOODR:0x0000007f: "AnonC"
// CHECK-NOODR:0x00000085: "(anonymous namespace)"

// CHECK-NOODR: .apple_names
// CHECK-NOODR: Bucket count: 2
// CHECK-NOODR: String: {{.*}} "foo"
// CHECK-NOODR: String: {{.*}} "_Z3foov"

// CHECK-NOODR: .apple_types
// CHECK-NOODR: Bucket count: 6
// CHECK-NOODR: String: {{.*}} "AnonC"
// CHECK-NOODR: String: {{.*}} "Nested"
// CHECK-NOODR: String: {{.*}} "S"
// CHECK-NOODR: String: {{.*}} "C"
// CHECK-NOODR: String: {{.*}} "U"
// CHECK-NOODR: String: {{.*}} "AliasForS"

// CHECK-NOODR: .apple_namespaces
// CHECK-NOODR: Bucket count: 2
// CHECK-NOODR: String: {{.*}} "(anonymous namespace)"
// CHECK-NOODR: String: {{.*}} "N"

// CHECK-NOODR: .apple_objc
// CHECK-NOODR:Bucket count: 1