summaryrefslogtreecommitdiffstats
path: root/llvm/test/tools
diff options
context:
space:
mode:
authorAdrian Prantl <aprantl@apple.com>2018-08-30 21:21:16 +0000
committerAdrian Prantl <aprantl@apple.com>2018-08-30 21:21:16 +0000
commitbdffea12d0be98efbf6d6ec4dcba3267b8aa7dec (patch)
treed1ac2486e33f385cc3a609444639aacc4c776ae7 /llvm/test/tools
parenta1f57030c624f39d9e97008635e1d9efe67962bd (diff)
downloadbcm5719-llvm-bdffea12d0be98efbf6d6ec4dcba3267b8aa7dec.tar.gz
bcm5719-llvm-bdffea12d0be98efbf6d6ec4dcba3267b8aa7dec.zip
dsymutil: Avoid pruning non-type forward declarations inside DW_TAG_module
forward declarations. Especially with template instantiations, there are legitimate reasons why for declarations might be emitted into a DW_TAG_module skeleton / forward-declaration sub-tree, that are not forward declarations in the sense of that there is a more complete definition over in a .pcm file. The example in the testcase is a constant DW_TAG_member of a DW_TAG_class template instatiation. rdar://problem/43623196 llvm-svn: 341123
Diffstat (limited to 'llvm/test/tools')
-rw-r--r--llvm/test/tools/dsymutil/Inputs/modules-pruning/1.obin0 -> 2984 bytes
-rw-r--r--llvm/test/tools/dsymutil/Inputs/modules-pruning/Outer.pcmbin0 -> 20988 bytes
-rw-r--r--llvm/test/tools/dsymutil/X86/modules-pruning.cpp59
3 files changed, 59 insertions, 0 deletions
diff --git a/llvm/test/tools/dsymutil/Inputs/modules-pruning/1.o b/llvm/test/tools/dsymutil/Inputs/modules-pruning/1.o
new file mode 100644
index 00000000000..89cb1b467ed
--- /dev/null
+++ b/llvm/test/tools/dsymutil/Inputs/modules-pruning/1.o
Binary files differ
diff --git a/llvm/test/tools/dsymutil/Inputs/modules-pruning/Outer.pcm b/llvm/test/tools/dsymutil/Inputs/modules-pruning/Outer.pcm
new file mode 100644
index 00000000000..657a024a686
--- /dev/null
+++ b/llvm/test/tools/dsymutil/Inputs/modules-pruning/Outer.pcm
Binary files differ
diff --git a/llvm/test/tools/dsymutil/X86/modules-pruning.cpp b/llvm/test/tools/dsymutil/X86/modules-pruning.cpp
new file mode 100644
index 00000000000..7f331f183f0
--- /dev/null
+++ b/llvm/test/tools/dsymutil/X86/modules-pruning.cpp
@@ -0,0 +1,59 @@
+// RUN: dsymutil -f -oso-prepend-path=%p/../Inputs/modules-pruning \
+// RUN: -y %p/dummy-debug-map.map -o - \
+// RUN: | llvm-dwarfdump --name isRef -p - | FileCheck %s
+
+/* Compile with:
+ cat >modules.modulemap <<EOF
+ module Outer {
+ module Template {
+ header "template.h"
+ export *
+ }
+ }
+EOF
+ clang++ -D TEMPLATE_H -E -o template.h modules-pruning.cpp
+ clang++ -c -fcxx-modules -fmodules -fmodule-map-file=modules.modulemap \
+ -g -gmodules -fmodules-cache-path=. \
+ -Xclang -fdisable-module-hash modules-pruning.cpp -o 1.o
+*/
+
+// CHECK: DW_TAG_compile_unit
+// CHECK: DW_TAG_module
+// CHECK: DW_TAG_module
+// CHECK: DW_TAG_class
+// CHECK: DW_TAG_member
+// CHECK: DW_AT_name ("isRef")
+// CHECK: DW_AT_declaration (true)
+// CHECK: DW_AT_const_value (1)
+// CHECK-NOT: DW_TAG
+
+#ifdef TEMPLATE_H
+
+namespace M {
+struct false_type {
+ static const bool value = false;
+};
+struct true_type {
+ static const bool value = true;
+};
+
+template <class T> struct is_reference : false_type {};
+template <class T> struct is_reference<T&> : true_type {};
+
+template<class T>
+class Template {
+public:
+ static const bool isRef = is_reference<T>::value;
+ Template() {}
+};
+}
+#else
+
+#include "template.h"
+
+void foo() {
+ M::Template<bool&> TB1;
+ TB1.isRef;
+}
+
+#endif
OpenPOWER on IntegriCloud