mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-21 20:45:53 -04:00

Traditionally objc had two entry points, objc_msgSend for scalar return methods, and objc_msgSend_stret for struct return convention methods. But on arm64 the second was not needed (since arm64 doesn't use an argument register for the struct return pointer) so it was removed. The code that dispatches to the objc object checker when it sees some flavor of objc_msgSend was not aware of this change so was sending the wrong arguments to the checker. <rdar://problem/48315890> Differential Revision: https://reviews.llvm.org/D58699 llvm-svn: 355026
48 lines
892 B
Objective-C
48 lines
892 B
Objective-C
#import <Foundation/Foundation.h>
|
|
|
|
// This should be a big enough struct that it will force
|
|
// the struct return convention:
|
|
typedef struct BigStruct {
|
|
float a, b, c, d, e, f, g, h, i, j, k, l;
|
|
} BigStruct;
|
|
|
|
|
|
@interface Simple : NSObject
|
|
{
|
|
int _value;
|
|
}
|
|
- (int) value;
|
|
- (void) setValue: (int) newValue;
|
|
- (BigStruct) getBigStruct;
|
|
@end
|
|
|
|
@implementation Simple
|
|
- (int) value
|
|
{
|
|
return _value;
|
|
}
|
|
|
|
- (void) setValue: (int) newValue
|
|
{
|
|
_value = newValue;
|
|
}
|
|
|
|
- (BigStruct) getBigStruct
|
|
{
|
|
BigStruct big_struct = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0,
|
|
7.0, 8.0, 9.0, 10.0, 11.0, 12.0};
|
|
return big_struct;
|
|
}
|
|
@end
|
|
|
|
int main ()
|
|
{
|
|
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
|
Simple *my_simple = [[Simple alloc] init];
|
|
my_simple.value = 20;
|
|
// Set a breakpoint here.
|
|
NSLog (@"Object has value: %d.", my_simple.value);
|
|
[pool drain];
|
|
return 0;
|
|
}
|