
Summary: This is needed to avoid conflicts in mangled names for codeview types in anonymous namespaces. In CodeView, types refer to each other typically through forward declarations, which contain mangled names. These names have to be unique, otherwise the debugger will look up the mangled name and find the wrong definition. Furthermore, ThinLTO will deduplicate the types, and debug info verification can fail when the types have the wrong sizes. This is PR38608. Fixes PR38609. Reviewers: majnemer, inglorion, hans Subscribers: mehdi_amini, aprantl, JDevlieghere, dexonsmith, cfe-commits Differential Revision: https://reviews.llvm.org/D50877 llvm-svn: 340079
68 lines
1.9 KiB
C++
68 lines
1.9 KiB
C++
// RUN: %clang_cc1 -triple i686-unknown-windows-msvc -fdeclspec -emit-llvm %s -o - | FileCheck %s
|
|
// RUN: %clang_cc1 -triple x86_64-unknown-windows-msvc -fdeclspec -emit-llvm %s -o - | FileCheck %s -check-prefix CHECK-64
|
|
|
|
void __attribute__((__swiftcall__)) f() {}
|
|
// CHECK-DAG: @"?f@@YSXXZ"
|
|
// CHECK-64-DAG: @"?f@@YSXXZ"
|
|
|
|
void (__attribute__((__swiftcall__)) *p)();
|
|
// CHECK-DAG: @"?p@@3P6SXXZA"
|
|
// CHECK-64-DAG: @"?p@@3P6SXXZEA
|
|
|
|
namespace {
|
|
void __attribute__((__swiftcall__)) __attribute__((__used__)) f() { }
|
|
}
|
|
// CHECK-DAG: @"?f@?A0x{{[^@]*}}@@YSXXZ"
|
|
// CHECK-64-DAG: @"?f@?A0x{{[^@]*}}@@YSXXZ"
|
|
|
|
namespace n {
|
|
void __attribute__((__swiftcall__)) f() {}
|
|
}
|
|
// CHECK-DAG: @"?f@n@@YSXXZ"
|
|
// CHECK-64-DAG: @"?f@n@@YSXXZ"
|
|
|
|
struct __declspec(dllexport) S {
|
|
S(const S &) = delete;
|
|
S & operator=(const S &) = delete;
|
|
void __attribute__((__swiftcall__)) m() { }
|
|
};
|
|
// CHECK-DAG: @"?m@S@@QASXXZ"
|
|
// CHECK-64-DAG: @"?m@S@@QEASXXZ"
|
|
|
|
void f(void (__attribute__((__swiftcall__))())) {}
|
|
// CHECK-DAG: @"?f@@YAXP6SXXZ@Z"
|
|
// CHECK-64-DAG: @"?f@@YAXP6SXXZ@Z"
|
|
|
|
void __attribute__((__preserve_most__)) g() {}
|
|
// CHECK-DAG: @"?g@@YUXXZ"
|
|
// CHECK-64-DAG: @"?g@@YUXXZ"
|
|
|
|
void (__attribute__((__preserve_most__)) *q)();
|
|
// CHECK-DAG: @"?q@@3P6UXXZA"
|
|
// CHECK-64-DAG: @"?q@@3P6UXXZEA"
|
|
|
|
namespace {
|
|
void __attribute__((__preserve_most__)) __attribute__((__used__)) g() {}
|
|
}
|
|
// CHECK-DAG: @"?g@?A0x{{[^@]*}}@@YUXXZ"
|
|
// CHECK-64-DAG: @"?g@?A0x{{[^@]*}}@@YUXXZ"
|
|
|
|
namespace n {
|
|
void __attribute__((__preserve_most__)) g() {}
|
|
}
|
|
// CHECK-DAG: @"?g@n@@YUXXZ"
|
|
// CHECK-64-DAG: @"?g@n@@YUXXZ"
|
|
|
|
struct __declspec(dllexport) T {
|
|
T(const T &) = delete;
|
|
T & operator=(const T &) = delete;
|
|
void __attribute__((__preserve_most__)) m() {}
|
|
};
|
|
// CHECK-DAG: @"?m@T@@QAUXXZ"
|
|
// CHECK-64-DAG: @"?m@T@@QEAUXXZ"
|
|
|
|
void g(void (__attribute__((__preserve_most__))())) {}
|
|
// CHECK-DAG: @"?g@@YAXP6UXXZ@Z"
|
|
// CHECK-64-DAG: @"?g@@YAXP6UXXZ@Z"
|
|
|