mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-22 15:31:00 +00:00
f3c89b1a6b
clang was encoding pointers to typedefs as if they were pointers to structs because that is apparently what gcc is doing. For example: ``` @class Class1; typedef NSArray<Class1 *> MyArray; void foo1(void) { const char *s0 = @encode(MyArray *); // "^{NSArray=#}" const char *s1 = @encode(NSArray<Class1 *> *); // "@" } ``` This commit removes the code that was there to make clang compatible with gcc and make clang emit the correct encoding for ObjC pointers, which is "@". rdar://problem/50563529 Differential Revision: https://reviews.llvm.org/D61974 llvm-svn: 362034
195 lines
3.7 KiB
Objective-C
195 lines
3.7 KiB
Objective-C
// RUN: %clang_cc1 -triple i686-apple-darwin9 -fobjc-runtime=macosx-fragile-10.5 -emit-llvm -o %t %s
|
|
// RUN: FileCheck < %t %s
|
|
//
|
|
// CHECK: @OBJC_METH_VAR_TYPE_{{.*}} = private unnamed_addr constant [16 x i8] c"v12@0:4[3[4@]]8\00"
|
|
|
|
@class Int1;
|
|
|
|
struct Innermost {
|
|
unsigned char a, b;
|
|
};
|
|
|
|
@interface Int1 {
|
|
signed char a, b;
|
|
struct Innermost *innermost;
|
|
}
|
|
@end
|
|
|
|
@implementation Int1
|
|
@end
|
|
|
|
@interface Base
|
|
{
|
|
struct objc_class *isa;
|
|
int full;
|
|
int full2: 32;
|
|
int _refs: 8;
|
|
int field2: 3;
|
|
unsigned f3: 8;
|
|
short cc;
|
|
unsigned g: 16;
|
|
int r2: 8;
|
|
int r3: 8;
|
|
int r4: 2;
|
|
int r5: 8;
|
|
char c;
|
|
}
|
|
@end
|
|
|
|
@interface Derived: Base
|
|
{
|
|
char d;
|
|
int _field3: 6;
|
|
}
|
|
@end
|
|
|
|
@implementation Base
|
|
@end
|
|
|
|
@implementation Derived
|
|
@end
|
|
|
|
@interface B1
|
|
{
|
|
struct objc_class *isa;
|
|
Int1 *sBase;
|
|
char c;
|
|
}
|
|
@end
|
|
|
|
@implementation B1
|
|
@end
|
|
|
|
@interface Test
|
|
{
|
|
int ivar;
|
|
__attribute__((objc_gc(weak))) SEL selector;
|
|
}
|
|
-(void) test3: (Test* [3] [4])b ;
|
|
- (SEL**) meth : (SEL) arg : (SEL*****) arg1 : (SEL*)arg2 : (SEL**) arg3;
|
|
@end
|
|
|
|
@implementation Test
|
|
-(void) test3: (Test* [3] [4])b {}
|
|
- (SEL**) meth : (SEL) arg : (SEL*****) arg1 : (SEL*)arg2 : (SEL**) arg3 {}
|
|
@end
|
|
|
|
struct S { int iS; };
|
|
|
|
@interface Object
|
|
{
|
|
Class isa;
|
|
}
|
|
@end
|
|
typedef Object MyObj;
|
|
|
|
int main()
|
|
{
|
|
const char *en = @encode(Derived);
|
|
const char *eb = @encode(B1);
|
|
const char *es = @encode(const struct S *);
|
|
const char *ec = @encode(const struct S);
|
|
const char *ee = @encode(MyObj *const);
|
|
}
|
|
|
|
// CHECK: @g0 = constant [15 x i8] c"{Innermost=CC}\00"
|
|
const char g0[] = @encode(struct Innermost);
|
|
|
|
// CHECK: @g1 = constant [38 x i8] c"{Derived=#ib32b8b3b8sb16b8b8b2b8ccb6}\00"
|
|
const char g1[] = @encode(Derived);
|
|
|
|
// CHECK: @g2 = constant [9 x i8] c"{B1=#@c}\00"
|
|
const char g2[] = @encode(B1);
|
|
|
|
// CHECK: @g3 = constant [8 x i8] c"r^{S=i}\00"
|
|
const char g3[] = @encode(const struct S *);
|
|
|
|
// CHECK: @g4 = constant [6 x i8] c"{S=i}\00"
|
|
const char g4[] = @encode(const struct S);
|
|
|
|
// CHECK: @g5 = constant [2 x i8] c"@\00"
|
|
const char g5[] = @encode(MyObj * const);
|
|
|
|
////
|
|
|
|
enum Enum1X { one, two, three, four };
|
|
|
|
@interface Base1X {
|
|
unsigned a: 2;
|
|
int b: 3;
|
|
enum Enum1X c: 4;
|
|
unsigned d: 5;
|
|
}
|
|
@end
|
|
|
|
@interface Derived1X: Base1X {
|
|
signed e: 5;
|
|
int f: 4;
|
|
enum Enum1X g: 3;
|
|
}
|
|
@end
|
|
|
|
@implementation Base1X @end
|
|
|
|
@implementation Derived1X @end
|
|
|
|
// CHECK: @g6 = constant [18 x i8] c"{Base1X=b2b3b4b5}\00"
|
|
const char g6[] = @encode(Base1X);
|
|
|
|
// CHECK: @g7 = constant [27 x i8] c"{Derived1X=b2b3b4b5b5b4b3}\00"
|
|
const char g7[] = @encode(Derived1X);
|
|
|
|
// CHECK: @g8 = constant [7 x i8] c"{s8=D}\00"
|
|
struct s8 {
|
|
long double x;
|
|
};
|
|
const char g8[] = @encode(struct s8);
|
|
|
|
// CHECK: @g9 = constant [11 x i8] c"{S9=i[0i]}\00"
|
|
struct S9 {
|
|
int x;
|
|
int flex[];
|
|
};
|
|
const char g9[] = @encode(struct S9);
|
|
|
|
struct f
|
|
{
|
|
int i;
|
|
struct{} g[4];
|
|
int tt;
|
|
};
|
|
|
|
// CHECK: @g10 = constant [14 x i8] c"{f=i[4{?=}]i}\00"
|
|
const char g10[] = @encode(struct f);
|
|
|
|
// rdar://9622422
|
|
// CHECK: @g11 = constant [2 x i8] c"v\00"
|
|
const char g11[] = @encode(void);
|
|
|
|
// PR14628
|
|
// CHECK: @g12 = constant [3 x i8] c"Ai\00"
|
|
const char g12[] = @encode(_Atomic(int));
|
|
|
|
// rdar://15824769
|
|
id test_id = 0;
|
|
Class test_class = 0;
|
|
const char g13[] = @encode(__typeof__(*test_class));
|
|
const char g14[] = @encode(__typeof__(*test_id));
|
|
// CHECK: constant [14 x i8] c"{objc_class=}\00"
|
|
// CHECK: constant [15 x i8] c"{objc_object=}\00"
|
|
|
|
// CHECK: @g15 = constant [2 x i8] c":\00"
|
|
const char g15[] = @encode(SEL);
|
|
|
|
typedef typeof(sizeof(int)) size_t;
|
|
size_t strlen(const char *s);
|
|
|
|
// CHECK-LABEL: @test_strlen(
|
|
// CHECK: %[[i:.*]] = alloca i32
|
|
// CHECK: %[[call:.*]] = call i32 @strlen
|
|
// CHECK: store i32 %[[call]], i32* %[[i]]
|
|
void test_strlen() {
|
|
const char array[] = @encode(int);
|
|
int i = strlen(array);
|
|
}
|