aboutsummaryrefslogtreecommitdiff
path: root/packages/Python/lldbsuite/test/functionalities/return-value/call-func.c
diff options
context:
space:
mode:
Diffstat (limited to 'packages/Python/lldbsuite/test/functionalities/return-value/call-func.c')
-rw-r--r--packages/Python/lldbsuite/test/functionalities/return-value/call-func.c407
1 files changed, 407 insertions, 0 deletions
diff --git a/packages/Python/lldbsuite/test/functionalities/return-value/call-func.c b/packages/Python/lldbsuite/test/functionalities/return-value/call-func.c
new file mode 100644
index 000000000000..0c026ffcca17
--- /dev/null
+++ b/packages/Python/lldbsuite/test/functionalities/return-value/call-func.c
@@ -0,0 +1,407 @@
+// Some convenient things to return:
+static char *g_first_pointer = "I am the first";
+static char *g_second_pointer = "I am the second";
+
+// First we have some simple functions that return standard types, ints, floats and doubles.
+// We have a function calling a function in a few cases to test that if you stop in the
+// inner function then do "up/fin" you get the return value from the outer-most frame.
+
+int
+inner_sint (int value)
+{
+ return value;
+}
+
+int
+outer_sint (int value)
+{
+ int outer_value = 2 * inner_sint (value);
+ return outer_value;
+}
+
+float
+inner_float (float value)
+{
+ return value;
+}
+
+float
+outer_float (float value)
+{
+ float outer_value = 2 * inner_float(value);
+ return outer_value;
+}
+
+double
+return_double (double value)
+{
+ return value;
+}
+
+long double
+return_long_double (long double value)
+{
+ return value;
+}
+
+char *
+return_pointer (char *value)
+{
+ return value;
+}
+
+struct one_int
+{
+ int one_field;
+};
+
+struct one_int
+return_one_int (struct one_int value)
+{
+ return value;
+}
+
+struct two_int
+{
+ int first_field;
+ int second_field;
+};
+
+struct two_int
+return_two_int (struct two_int value)
+{
+ return value;
+}
+
+struct three_int
+{
+ int first_field;
+ int second_field;
+ int third_field;
+};
+
+struct three_int
+return_three_int (struct three_int value)
+{
+ return value;
+}
+
+struct four_int
+{
+ int first_field;
+ int second_field;
+ int third_field;
+ int fourth_field;
+};
+
+struct four_int
+return_four_int (struct four_int value)
+{
+ return value;
+}
+
+struct five_int
+{
+ int first_field;
+ int second_field;
+ int third_field;
+ int fourth_field;
+ int fifth_field;
+};
+
+struct five_int
+return_five_int (struct five_int value)
+{
+ return value;
+}
+
+struct one_int_one_double
+{
+ int first_field;
+ double second_field;
+};
+
+struct one_int_one_double
+return_one_int_one_double (struct one_int_one_double value)
+{
+ return value;
+}
+
+struct one_int_one_double_one_int
+{
+ int one_field;
+ double second_field;
+ int third_field;
+};
+
+struct one_int_one_double_one_int
+return_one_int_one_double_one_int (struct one_int_one_double_one_int value)
+{
+ return value;
+}
+
+struct one_short_one_double_one_short
+{
+ int one_field;
+ double second_field;
+ int third_field;
+};
+
+struct one_short_one_double_one_short
+return_one_short_one_double_one_short (struct one_short_one_double_one_short value)
+{
+ return value;
+}
+
+struct three_short_one_float
+{
+ short one_field;
+ short second_field;
+ short third_field;
+ float fourth_field;
+};
+
+struct three_short_one_float
+return_three_short_one_float (struct three_short_one_float value)
+{
+ return value;
+}
+
+struct one_int_one_float_one_int
+{
+ int one_field;
+ float second_field;
+ int third_field;
+};
+
+struct one_int_one_float_one_int
+return_one_int_one_float_one_int (struct one_int_one_float_one_int value)
+{
+ return value;
+}
+
+struct one_float_one_int_one_float
+{
+ float one_field;
+ int second_field;
+ float third_field;
+};
+
+struct one_float_one_int_one_float
+return_one_float_one_int_one_float (struct one_float_one_int_one_float value)
+{
+ return value;
+}
+
+struct one_double_two_float
+{
+ double one_field;
+ float second_field;
+ float third_field;
+};
+
+struct one_double_two_float
+return_one_double_two_float (struct one_double_two_float value)
+{
+ return value;
+}
+
+struct two_double
+{
+ double first_field;
+ double second_field;
+};
+
+struct two_double
+return_two_double (struct two_double value)
+{
+ return value;
+}
+
+struct two_float
+{
+ float first_field;
+ float second_field;
+};
+
+struct two_float
+return_two_float (struct two_float value)
+{
+ return value;
+}
+
+struct one_int_one_double_packed
+{
+ int first_field;
+ double second_field;
+} __attribute__((__packed__));
+
+struct one_int_one_double_packed
+return_one_int_one_double_packed (struct one_int_one_double_packed value)
+{
+ return value;
+}
+
+struct one_int_one_long
+{
+ int first_field;
+ long second_field;
+};
+
+struct one_int_one_long
+return_one_int_one_long (struct one_int_one_long value)
+{
+ return value;
+}
+
+struct one_pointer
+{
+ char *first_field;
+};
+
+struct one_pointer
+return_one_pointer (struct one_pointer value)
+{
+ return value;
+}
+
+struct two_pointer
+{
+ char *first_field;
+ char *second_field;
+};
+
+struct two_pointer
+return_two_pointer (struct two_pointer value)
+{
+ return value;
+}
+
+struct one_float_one_pointer
+{
+ float first_field;
+ char *second_field;
+};
+
+struct one_float_one_pointer
+return_one_float_one_pointer (struct one_float_one_pointer value)
+{
+ return value;
+}
+
+struct one_int_one_pointer
+{
+ int first_field;
+ char *second_field;
+};
+
+struct one_int_one_pointer
+return_one_int_one_pointer (struct one_int_one_pointer value)
+{
+ return value;
+}
+
+typedef float vector_size_float32_8 __attribute__((__vector_size__(8)));
+typedef float vector_size_float32_16 __attribute__((__vector_size__(16)));
+typedef float vector_size_float32_32 __attribute__((__vector_size__(32)));
+
+typedef float ext_vector_size_float32_2 __attribute__((ext_vector_type(2)));
+typedef float ext_vector_size_float32_4 __attribute__((ext_vector_type(4)));
+typedef float ext_vector_size_float32_8 __attribute__((ext_vector_type(8)));
+
+vector_size_float32_8
+return_vector_size_float32_8 (vector_size_float32_8 value)
+{
+ return value;
+}
+
+vector_size_float32_16
+return_vector_size_float32_16 (vector_size_float32_16 value)
+{
+ return value;
+}
+
+vector_size_float32_32
+return_vector_size_float32_32 (vector_size_float32_32 value)
+{
+ return value;
+}
+
+ext_vector_size_float32_2
+return_ext_vector_size_float32_2 (ext_vector_size_float32_2 value)
+{
+ return value;
+}
+
+ext_vector_size_float32_4
+return_ext_vector_size_float32_4 (ext_vector_size_float32_4 value)
+{
+ return value;
+}
+
+ext_vector_size_float32_8
+return_ext_vector_size_float32_8 (ext_vector_size_float32_8 value)
+{
+ return value;
+}
+
+int
+main ()
+{
+ int first_int = 123456;
+ int second_int = 234567;
+
+ outer_sint (first_int);
+ outer_sint (second_int);
+
+ float first_float_value = 12.34;
+ float second_float_value = 23.45;
+
+ outer_float (first_float_value);
+ outer_float (second_float_value);
+
+ double double_value = -23.45;
+
+ return_double (double_value);
+
+ return_pointer(g_first_pointer);
+
+ long double long_double_value = -3456789.987654321;
+
+ return_long_double (long_double_value);
+
+ // Okay, now the structures:
+ return_one_int ((struct one_int) {10});
+ return_two_int ((struct two_int) {10, 20});
+ return_three_int ((struct three_int) {10, 20, 30});
+ return_four_int ((struct four_int) {10, 20, 30, 40});
+ return_five_int ((struct five_int) {10, 20, 30, 40, 50});
+
+ return_two_double ((struct two_double) {10.0, 20.0});
+ return_one_double_two_float ((struct one_double_two_float) {10.0, 20.0, 30.0});
+ return_one_int_one_float_one_int ((struct one_int_one_float_one_int) {10, 20.0, 30});
+
+ return_one_pointer ((struct one_pointer) {g_first_pointer});
+ return_two_pointer ((struct two_pointer) {g_first_pointer, g_second_pointer});
+ return_one_float_one_pointer ((struct one_float_one_pointer) {10.0, g_first_pointer});
+ return_one_int_one_pointer ((struct one_int_one_pointer) {10, g_first_pointer});
+ return_three_short_one_float ((struct three_short_one_float) {10, 20, 30, 40.0});
+
+ return_one_int_one_double ((struct one_int_one_double) {10, 20.0});
+ return_one_int_one_double_one_int ((struct one_int_one_double_one_int) {10, 20.0, 30});
+ return_one_short_one_double_one_short ((struct one_short_one_double_one_short) {10, 20.0, 30});
+ return_one_float_one_int_one_float ((struct one_float_one_int_one_float) {10.0, 20, 30.0});
+ return_two_float ((struct two_float) { 10.0, 20.0});
+ return_one_int_one_double_packed ((struct one_int_one_double_packed) {10, 20.0});
+ return_one_int_one_long ((struct one_int_one_long) {10, 20});
+
+ return_vector_size_float32_8 (( vector_size_float32_8 ){1.5, 2.25});
+ return_vector_size_float32_16 (( vector_size_float32_16 ){1.5, 2.25, 4.125, 8.0625});
+ return_vector_size_float32_32 (( vector_size_float32_32 ){1.5, 2.25, 4.125, 8.0625, 7.89, 8.52, 6.31, 9.12});
+
+ return_ext_vector_size_float32_2 ((ext_vector_size_float32_2){ 16.5, 32.25});
+ return_ext_vector_size_float32_4 ((ext_vector_size_float32_4){ 16.5, 32.25, 64.125, 128.0625});
+ return_ext_vector_size_float32_8 ((ext_vector_size_float32_8){ 16.5, 32.25, 64.125, 128.0625, 1.59, 3.57, 8.63, 9.12 });
+
+ return 0;
+}