forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[x32/NaCl] Check if method pointers straddle an eightbyte to classify Hi
Summary: Currently, with struct my_struct { int x; method_ptr y; }; a call to foo(my_struct s) may end up dropping the last 4 bytes of the method pointer for x86_64 NaCl and x32. When checking Has64BitPointers, also check if the method pointer straddles an eightbyte boundary and classify Hi as well as Lo if needed. Test Plan: test/CodeGenCXX/x86_64-arguments-nacl-x32.cpp Reviewers: dschuff, pavel.v.chupin Subscribers: jfb Differential Revision: http://reviews.llvm.org/D5555 llvm-svn: 218889
- Loading branch information
Showing
3 changed files
with
77 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
// 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 | ||
|
||
struct test_struct {}; | ||
typedef int test_struct::* test_struct_mdp; | ||
typedef int (test_struct::*test_struct_mfp)(); | ||
|
||
// CHECK-LABEL: define i32 @{{.*}}f_mdp{{.*}}(i32 %a) | ||
test_struct_mdp f_mdp(test_struct_mdp a) { return a; } | ||
|
||
// CHECK-LABEL: define {{.*}} @{{.*}}f_mfp{{.*}}(i64 %a.coerce) | ||
test_struct_mfp f_mfp(test_struct_mfp a) { return a; } | ||
|
||
// A struct with <= 12 bytes before a member data pointer should still | ||
// be allowed in registers, since the member data pointer is only 4 bytes. | ||
// CHECK-LABEL: define void @{{.*}}f_struct_with_mdp{{.*}}(i64 %a.coerce0, i64 %a.coerce1) | ||
struct struct_with_mdp { char *a; char *b; char *c; test_struct_mdp d; }; | ||
void f_struct_with_mdp(struct_with_mdp a) { (void)a; } | ||
|
||
struct struct_with_mdp_too_much { | ||
char *a; char *b; char *c; char *d; test_struct_mdp e; | ||
}; | ||
// CHECK-LABEL: define void @{{.*}}f_struct_with_mdp_too_much{{.*}}({{.*}} byval {{.*}} %a) | ||
void f_struct_with_mdp_too_much(struct_with_mdp_too_much a) { | ||
(void)a; | ||
} | ||
|
||
// A struct with <= 8 bytes before a member function pointer should still | ||
// be allowed in registers, since the member function pointer is only 8 bytes. | ||
// CHECK-LABEL: define void @{{.*}}f_struct_with_mfp_0{{.*}}(i64 %a.coerce0, i32 %a.coerce1) | ||
struct struct_with_mfp_0 { char *a; test_struct_mfp b; }; | ||
void f_struct_with_mfp_0(struct_with_mfp_0 a) { (void)a; } | ||
|
||
// CHECK-LABEL: define void @{{.*}}f_struct_with_mfp_1{{.*}}(i64 %a.coerce0, i64 %a.coerce1) | ||
struct struct_with_mfp_1 { char *a; char *b; test_struct_mfp c; }; | ||
void f_struct_with_mfp_1(struct_with_mfp_1 a) { (void)a; } | ||
|
||
// CHECK-LABEL: define void @{{.*}}f_struct_with_mfp_too_much{{.*}}({{.*}} byval {{.*}} %a, i32 %x) | ||
struct struct_with_mfp_too_much { | ||
char *a; char *b; char *c; test_struct_mfp d; | ||
}; | ||
void f_struct_with_mfp_too_much(struct_with_mfp_too_much a, int x) { | ||
(void)a; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters