summaryrefslogtreecommitdiffstats
path: root/lldb/packages/Python/lldbsuite/test
diff options
context:
space:
mode:
authorRaphael Isemann <teemperor@gmail.com>2019-12-17 09:48:54 +0100
committerRaphael Isemann <teemperor@gmail.com>2019-12-17 10:28:40 +0100
commitd5b54bbfaf19a8527ebf70fbf23cb8d2937f15ef (patch)
treed5134d7708b01d1d60c2265c607d8ae1ed2a280b /lldb/packages/Python/lldbsuite/test
parent531c1161b9758aa7eae1a4dd8ecf11fdf4417b29 (diff)
downloadbcm5719-llvm-d5b54bbfaf19a8527ebf70fbf23cb8d2937f15ef.tar.gz
bcm5719-llvm-d5b54bbfaf19a8527ebf70fbf23cb8d2937f15ef.zip
[lldb] Add support for calling objc_direct methods from LLDB's expression evaluator.
Summary: D69991 introduced `__attribute__((objc_direct))` that allows directly calling methods without message passing. This patch adds support for calling methods with this attribute to LLDB's expression evaluator. The patch can be summarised in that LLDB just adds the same attribute to our module AST when we find a method with `__attribute__((objc_direct))` in our debug information. Reviewers: aprantl, shafik Reviewed By: shafik Subscribers: JDevlieghere, lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D71196
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test')
-rw-r--r--lldb/packages/Python/lldbsuite/test/lang/objc/objc_direct-methods/Makefile4
-rw-r--r--lldb/packages/Python/lldbsuite/test/lang/objc/objc_direct-methods/TestObjCDirectMethods.py5
-rw-r--r--lldb/packages/Python/lldbsuite/test/lang/objc/objc_direct-methods/main.m79
3 files changed, 88 insertions, 0 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/lang/objc/objc_direct-methods/Makefile b/lldb/packages/Python/lldbsuite/test/lang/objc/objc_direct-methods/Makefile
new file mode 100644
index 00000000000..afecbf96948
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/lang/objc/objc_direct-methods/Makefile
@@ -0,0 +1,4 @@
+OBJC_SOURCES := main.m
+LD_EXTRAS := -lobjc -framework Foundation
+
+include Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/lang/objc/objc_direct-methods/TestObjCDirectMethods.py b/lldb/packages/Python/lldbsuite/test/lang/objc/objc_direct-methods/TestObjCDirectMethods.py
new file mode 100644
index 00000000000..f0152de1ac3
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/lang/objc/objc_direct-methods/TestObjCDirectMethods.py
@@ -0,0 +1,5 @@
+from lldbsuite.test import lldbinline
+from lldbsuite.test import decorators
+
+lldbinline.MakeInlineTest(
+ __file__, globals(), [decorators.skipUnlessDarwin])
diff --git a/lldb/packages/Python/lldbsuite/test/lang/objc/objc_direct-methods/main.m b/lldb/packages/Python/lldbsuite/test/lang/objc/objc_direct-methods/main.m
new file mode 100644
index 00000000000..1a199acdda4
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/lang/objc/objc_direct-methods/main.m
@@ -0,0 +1,79 @@
+#import <Foundation/Foundation.h>
+
+int side_effect = 0;
+
+NSString *str = @"some string";
+
+const char *directCallConflictingName() {
+ return "wrong function";
+}
+
+@interface Foo : NSObject {
+ int instance_var;
+}
+-(int) entryPoint;
+@end
+
+@implementation Foo
+-(int) entryPoint
+{
+ // Try calling directly with self. Same as in the main method otherwise.
+ return 0; //%self.expect("expr [self directCallNoArgs]", substrs=["called directCallNoArgs"])
+ //%self.expect("expr [self directCallArgs: 1111]", substrs=["= 2345"])
+ //%self.expect("expr side_effect = 0; [self directCallVoidReturn]; side_effect", substrs=["= 4321"])
+ //%self.expect("expr [self directCallNSStringArg: str]", substrs=['@"some string"'])
+ //%self.expect("expr [self directCallIdArg: (id)str]", substrs=['@"some string appendix"'])
+ //%self.expect("expr [self directCallConflictingName]", substrs=["correct function"])
+}
+
+// Declare several objc_direct functions we can test.
+-(const char *) directCallNoArgs __attribute__((objc_direct))
+{
+ return "called directCallNoArgs";
+}
+
+-(void) directCallVoidReturn __attribute__((objc_direct))
+{
+ side_effect = 4321;
+}
+
+-(int) directCallArgs:(int)i __attribute__((objc_direct))
+{
+ // Use the arg in some way to make sure that gets passed correctly.
+ return i + 1234;
+}
+
+-(NSString *) directCallNSStringArg:(NSString *)str __attribute__((objc_direct))
+{
+ return str;
+}
+
+-(NSString *) directCallIdArg:(id)param __attribute__((objc_direct))
+{
+ return [param stringByAppendingString:@" appendix"];
+}
+
+// We have another function with the same name above. Make sure this doesn't influence
+// what we call.
+-(const char *) directCallConflictingName __attribute__((objc_direct))
+{
+ return "correct function";
+}
+@end
+
+int main()
+{
+ Foo *foo = [[Foo alloc] init];
+ [foo directCallNoArgs];
+ [foo directCallArgs: 1];
+ [foo directCallVoidReturn];
+ [foo directCallNSStringArg: str];
+ [foo directCallIdArg: (id)str];
+ [foo entryPoint]; //%self.expect("expr [foo directCallNoArgs]", substrs=["called directCallNoArgs"])
+ //%self.expect("expr [foo directCallArgs: 1111]", substrs=["= 2345"])
+ //%self.expect("expr side_effect = 0; [foo directCallVoidReturn]; side_effect", substrs=["= 4321"])
+ //%self.expect("expr [foo directCallNSStringArg: str]", substrs=['@"some string"'])
+ //%self.expect("expr [foo directCallIdArg: (id)str]", substrs=['@"some string appendix"'])
+ //%self.expect("expr [foo directCallConflictingName]", substrs=["correct function"])
+ return 0;
+}
OpenPOWER on IntegriCloud