mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-11 18:36:55 +00:00
[OPENMP50]Fix size calculation for array shaping expression in the
codegen. Need to include the size of the pointee type when trying to calculate the total size of the array shaping expression.
This commit is contained in:
parent
09834f9761
commit
e094dd5adc
@ -10203,7 +10203,8 @@ def warn_nested_declare_variant
|
||||
"nested context ignored">,
|
||||
InGroup<SourceUsesOpenMP>;
|
||||
def err_omp_non_pointer_type_array_shaping_base : Error<
|
||||
"expected pointer type expression as a base of an array shaping operation">;
|
||||
"expected expression with a pointer to a complete type as a base of an array "
|
||||
"shaping operation">;
|
||||
} // end of OpenMP category
|
||||
|
||||
let CategoryName = "Related Result Type Issue" in {
|
||||
|
@ -5374,7 +5374,7 @@ std::pair<llvm::Value *, Address> CGOpenMPRuntime::emitDependClause(
|
||||
llvm::Value *Size;
|
||||
QualType Ty = E->getType();
|
||||
if (OASE) {
|
||||
Size = llvm::ConstantInt::get(CGF.SizeTy,/*V=*/1);
|
||||
Size = CGF.getTypeSize(OASE->getBase()->getType()->getPointeeType());
|
||||
for (const Expr *SE : OASE->getDimensions()) {
|
||||
llvm::Value *Sz = CGF.EmitScalarExpr(SE);
|
||||
Sz = CGF.EmitScalarConversion(Sz, SE->getType(),
|
||||
|
@ -4817,10 +4817,13 @@ ExprResult Sema::ActOnOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
|
||||
if (!BaseTy->isPointerType() && Base->isTypeDependent())
|
||||
return OMPArrayShapingExpr::Create(Context, Context.DependentTy, Base,
|
||||
LParenLoc, RParenLoc, Dims, Brackets);
|
||||
if (!BaseTy->isPointerType())
|
||||
if (!BaseTy->isPointerType() ||
|
||||
(!Base->isTypeDependent() &&
|
||||
BaseTy->getPointeeType()->isIncompleteType()))
|
||||
return ExprError(Diag(Base->getExprLoc(),
|
||||
diag::err_omp_non_pointer_type_array_shaping_base)
|
||||
<< Base->getSourceRange());
|
||||
|
||||
SmallVector<Expr *, 4> NewDims;
|
||||
bool ErrorFound = false;
|
||||
for (Expr *Dim : Dims) {
|
||||
|
@ -21,7 +21,7 @@ void foo() {}
|
||||
template <class T>
|
||||
T tmain(T argc) {
|
||||
static T a;
|
||||
void *argv;
|
||||
int *argv;
|
||||
#pragma omp depobj(a) depend(in:argv, ([3][*(int*)argv][4])argv)
|
||||
#pragma omp depobj(argc) destroy
|
||||
#pragma omp depobj(argc) update(inout)
|
||||
@ -99,12 +99,12 @@ int main(int argc, char **argv) {
|
||||
// CHECK: store i64 8, i64* [[SZ_ADDR]],
|
||||
// CHECK: [[FLAGS_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 2
|
||||
// CHECK: store i8 1, i8* [[FLAGS_ADDR]],
|
||||
// CHECK: [[SHAPE_ADDR:%.+]] = load i8*, i8** [[ARGV_ADDR:%.+]],
|
||||
// CHECK: [[SZ1:%.+]] = mul nuw i64 3, %{{.+}}
|
||||
// CHECK: [[SHAPE_ADDR:%.+]] = load i32*, i32** [[ARGV_ADDR:%.+]],
|
||||
// CHECK: [[SZ1:%.+]] = mul nuw i64 12, %{{.+}}
|
||||
// CHECK: [[SZ:%.+]] = mul nuw i64 [[SZ1]], 4
|
||||
// CHECK: [[BASE_ADDR:%.+]] = getelementptr inbounds [3 x %struct.kmp_depend_info], [3 x %struct.kmp_depend_info]* [[DEP_ADDR]], i{{.+}} 0, i{{.+}} 2
|
||||
// CHECK: [[ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 0
|
||||
// CHECK: [[SHAPE:%.+]] = ptrtoint i8* [[SHAPE_ADDR]] to i64
|
||||
// CHECK: [[SHAPE:%.+]] = ptrtoint i32* [[SHAPE_ADDR]] to i64
|
||||
// CHECK: store i64 [[SHAPE]], i64* [[ADDR]],
|
||||
// CHECK: [[SZ_ADDR:%.+]] = getelementptr inbounds %struct.kmp_depend_info, %struct.kmp_depend_info* [[BASE_ADDR]], i{{.+}} 0, i{{.+}} 1
|
||||
// CHECK: store i64 [[SZ]], i64* [[SZ_ADDR]],
|
||||
|
@ -58,7 +58,7 @@ int main() {
|
||||
// CHECK: store i8 1, i8* [[FLAGS_ADDR]],
|
||||
// CHECK: [[A:%.+]] = load i32, i32* [[A_ADDR]],
|
||||
// CHECK: [[A_CAST:%.+]] = sext i32 [[A]] to i64
|
||||
// CHECK: [[SZ1:%.+]] = mul nuw i64 3, [[A_CAST]]
|
||||
// CHECK: [[SZ1:%.+]] = mul nuw i64 24, [[A_CAST]]
|
||||
// CHECK: [[A:%.+]] = load i32, i32* [[A_ADDR]],
|
||||
// CHECK: [[A_CAST:%.+]] = sext i32 [[A]] to i64
|
||||
// CHECK: [[SZ:%.+]] = mul nuw i64 [[SZ1]], [[A_CAST]]
|
||||
|
@ -67,8 +67,8 @@ int main(int argc, char **argv, char *env[]) {
|
||||
#pragma omp task depend(in : ([]) // omp45-error {{expected body of lambda expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error 2 {{expected expression}}
|
||||
#pragma omp task depend(in : ([])a // omp45-error {{expected body of lambda expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected expression}}
|
||||
#pragma omp task depend(in : ([])a) // omp45-error {{expected body of lambda expression}} omp50-error {{expected expression}}
|
||||
#pragma omp task depend(in : ([a])a) // omp45-error {{expected body of lambda expression}} omp50-error {{expected pointer type expression as a base of an array shaping operation}}
|
||||
#pragma omp task depend(in : ([a])argc) // omp45-error {{expected body of lambda expression}} omp50-error {{expected pointer type expression as a base of an array shaping operation}}
|
||||
#pragma omp task depend(in : ([a])a) // omp45-error {{expected body of lambda expression}} omp50-error {{expected expression with a pointer to a complete type as a base of an array shaping operation}}
|
||||
#pragma omp task depend(in : ([a])argc) // omp45-error {{expected body of lambda expression}} omp50-error {{expected expression with a pointer to a complete type as a base of an array shaping operation}}
|
||||
#pragma omp task depend(in : ([-1][0])argv) // omp45-error {{expected variable name or 'this' in lambda capture list}} omp45-error {{expected ')'}} omp45-note {{to match this '('}} omp50-error {{array shaping dimension is evaluated to a non-positive value -1}} omp50-error {{array shaping dimension is evaluated to a non-positive value 0}}
|
||||
foo();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user