summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan A. Kosarev <ikosarev@accesssoftek.com>2017-09-26 14:22:48 +0000
committerIvan A. Kosarev <ikosarev@accesssoftek.com>2017-09-26 14:22:48 +0000
commitb75a50b1212a4d632d194457eb34dd74277f7535 (patch)
tree2372939b42fc404276b5c94d5854adf2fd6c3870
parent8af2387b91cfcc1ac152f55307b86d76bbd55170 (diff)
downloadbcm5719-llvm-b75a50b1212a4d632d194457eb34dd74277f7535.tar.gz
bcm5719-llvm-b75a50b1212a4d632d194457eb34dd74277f7535.zip
Fix TBAA information for reference accesses
This patch fixes clang to decorate reference accesses as pointers and not as "omnipotent chars". Differential Revision: https://reviews.llvm.org/D38074 llvm-svn: 314209
-rw-r--r--clang/lib/CodeGen/CodeGenTBAA.cpp4
-rw-r--r--clang/test/CodeGen/tbaa-reference.cpp29
2 files changed, 31 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CodeGenTBAA.cpp b/clang/lib/CodeGen/CodeGenTBAA.cpp
index 8a75a552d9f..3ae2956e6ea 100644
--- a/clang/lib/CodeGen/CodeGenTBAA.cpp
+++ b/clang/lib/CodeGen/CodeGenTBAA.cpp
@@ -145,10 +145,10 @@ CodeGenTBAA::getTBAAInfo(QualType QTy) {
if (Ty->isStdByteType())
return MetadataCache[Ty] = getChar();
- // Handle pointers.
+ // Handle pointers and references.
// TODO: Implement C++'s type "similarity" and consider dis-"similar"
// pointers distinct.
- if (Ty->isPointerType())
+ if (Ty->isPointerType() || Ty->isReferenceType())
return MetadataCache[Ty] = createTBAAScalarType("any pointer",
getChar());
diff --git a/clang/test/CodeGen/tbaa-reference.cpp b/clang/test/CodeGen/tbaa-reference.cpp
new file mode 100644
index 00000000000..aae6a82a8f1
--- /dev/null
+++ b/clang/test/CodeGen/tbaa-reference.cpp
@@ -0,0 +1,29 @@
+// RUN: %clang_cc1 -triple x86_64-linux -O1 -disable-llvm-passes %s -emit-llvm -o - | FileCheck %s
+//
+// Check that we generate correct TBAA information for reference accesses.
+
+struct S;
+
+struct B {
+ S &s;
+ B(S &s) : s(s) {}
+ void bar();
+};
+
+void foo(S &s) {
+ B b(s);
+ b.bar();
+}
+
+// CHECK-LABEL: _Z3fooR1S
+// Check initialization of the reference parameter in foo().
+// CHECK: store %struct.S* {{.*}}, %struct.S** {{.*}}, !tbaa [[TAG_pointer:!.*]]
+//
+// CHECK-LABEL: _ZN1BC2ER1S
+// TODO: Check loading of the reference parameter in B::B(S&).
+// Check initialization of B::s in B::B(S&).
+// CHECK: store %struct.S* {{.*}}, %struct.S** {{.*}}, !tbaa [[TAG_pointer]]
+//
+// CHECK-DAG: [[TAG_pointer]] = !{[[TYPE_pointer:!.*]], [[TYPE_pointer]], i64 0}
+// CHECK-DAG: [[TYPE_pointer]] = !{!"any pointer", [[TYPE_char:!.*]], i64 0}
+// CHECK-DAG: [[TYPE_char]] = !{!"omnipotent char", {{!.*}}, i64 0}
OpenPOWER on IntegriCloud