forked from OSchip/llvm-project
[CodeGen] Fix generation of TBAA info for array-to-pointer conversions
Resolves: Fatal error: Offset not zero at the point of scalar access. http://llvm.org/PR34992 Differential Revision: https://reviews.llvm.org/D39083 llvm-svn: 316211
This commit is contained in:
parent
3d34d877cb
commit
f761d0e514
|
@ -3072,8 +3072,6 @@ Address CodeGenFunction::EmitArrayToPointerDecay(const Expr *E,
|
|||
// Expressions of array type can't be bitfields or vector elements.
|
||||
LValue LV = EmitLValue(E);
|
||||
Address Addr = LV.getAddress();
|
||||
if (BaseInfo) *BaseInfo = LV.getBaseInfo();
|
||||
if (TBAAInfo) *TBAAInfo = LV.getTBAAInfo();
|
||||
|
||||
// If the array type was an incomplete type, we need to make sure
|
||||
// the decay ends up being the right type.
|
||||
|
@ -3088,7 +3086,15 @@ Address CodeGenFunction::EmitArrayToPointerDecay(const Expr *E,
|
|||
Addr = Builder.CreateStructGEP(Addr, 0, CharUnits::Zero(), "arraydecay");
|
||||
}
|
||||
|
||||
// The result of this decay conversion points to an array element within the
|
||||
// base lvalue. However, since TBAA currently does not support representing
|
||||
// accesses to elements of member arrays, we conservatively represent accesses
|
||||
// to the pointee object as if it had no any base lvalue specified.
|
||||
// TODO: Support TBAA for member arrays.
|
||||
QualType EltType = E->getType()->castAsArrayTypeUnsafe()->getElementType();
|
||||
if (BaseInfo) *BaseInfo = LV.getBaseInfo();
|
||||
if (TBAAInfo) *TBAAInfo = CGM.getTBAAAccessInfo(EltType);
|
||||
|
||||
return Builder.CreateElementBitCast(Addr, ConvertTypeForMem(EltType));
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
// RUN: %clang_cc1 -triple x86_64-linux -O1 -disable-llvm-passes %s \
|
||||
// RUN: -emit-llvm -o - | FileCheck %s
|
||||
//
|
||||
// Check that we generate correct TBAA information for accesses to array
|
||||
// elements.
|
||||
|
||||
struct A { int i; };
|
||||
struct B { A a[1]; };
|
||||
|
||||
int foo(B *b) {
|
||||
// CHECK-LABEL: _Z3fooP1B
|
||||
// CHECK: load i32, {{.*}}, !tbaa [[TAG_A_i:!.*]]
|
||||
return b->a->i;
|
||||
}
|
||||
|
||||
// CHECK-DAG: [[TAG_A_i]] = !{[[TYPE_A:!.*]], [[TYPE_int:!.*]], i64 0}
|
||||
// CHECK-DAG: [[TYPE_A]] = !{!"_ZTS1A", !{{.*}}, i64 0}
|
||||
// CHECK-DAG: [[TYPE_int]] = !{!"int", !{{.*}}, i64 0}
|
Loading…
Reference in New Issue