Skip to content

Commit

Permalink
Relax assertion in x86_64 byval argument handling for 32-bit pointers
Browse files Browse the repository at this point in the history
Summary:
Byval argument pair formation assumes that if a type is less than 8 bytes
it must be an integer and not a pointer, which is not true for x32 and NaCl.

Relax the assertion and add a test for a codegen case that triggered it.

Reviewers: jvoung

Subscribers: jfb, cfe-commits

Differential Revision: http://reviews.llvm.org/D10701

llvm-svn: 240600
  • Loading branch information
dschuff committed Jun 24, 2015
1 parent 817ac8f commit 3c6a48d
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 3 deletions.
3 changes: 2 additions & 1 deletion clang/lib/CodeGen/TargetInfo.cpp
Expand Up @@ -2504,7 +2504,8 @@ GetX86_64ByValArgumentPair(llvm::Type *Lo, llvm::Type *Hi,
if (Lo->isFloatTy())
Lo = llvm::Type::getDoubleTy(Lo->getContext());
else {
assert(Lo->isIntegerTy() && "Invalid/unknown lo type");
assert((Lo->isIntegerTy() || Lo->isPointerTy())
&& "Invalid/unknown lo type");
Lo = llvm::Type::getInt64Ty(Lo->getContext());
}
}
Expand Down
17 changes: 15 additions & 2 deletions clang/test/CodeGenCXX/x86_64-arguments-nacl-x32.cpp
@@ -1,5 +1,5 @@
// RUN: %clang_cc1 -triple x86_64-unknown-nacl -emit-llvm -o - %s | FileCheck %s
// RUN: %clang_cc1 -triple=x86_64-unknown-linux-gnux32 -emit-llvm -o - %s | FileCheck %s
// RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-nacl -emit-llvm -o - %s | FileCheck %s
// RUN: %clang_cc1 -std=c++11 -triple=x86_64-unknown-linux-gnux32 -emit-llvm -o - %s | FileCheck %s

struct test_struct {};
typedef int test_struct::* test_struct_mdp;
Expand Down Expand Up @@ -42,3 +42,16 @@ struct struct_with_mfp_too_much {
void f_struct_with_mfp_too_much(struct_with_mfp_too_much a, int x) {
(void)a;
}

/* Struct containing an empty struct */
typedef struct { int* a; test_struct x; double *b; } struct_with_empty;

// CHECK-LABEL: define void @{{.*}}f_pass_struct_with_empty{{.*}}(i64 %x{{.*}}, double* %x
void f_pass_struct_with_empty(struct_with_empty x) {
(void) x;
}

// CHECK-LABEL: define { i64, double* } @{{.*}}f_return_struct_with_empty
struct_with_empty f_return_struct_with_empty() {
return {0, {}, 0};
}

0 comments on commit 3c6a48d

Please sign in to comment.