]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Add proper handling for internal functions and STT_GNU_IFUNC symbols in Ada mode.
authorPaul N. Hilfinger <hilfinger@adacore.com>
Sat, 21 Apr 2012 22:12:59 +0000 (22:12 +0000)
committerPaul N. Hilfinger <hilfinger@adacore.com>
Sat, 21 Apr 2012 22:12:59 +0000 (22:12 +0000)
The code for handling calls to internal functions (esp., Python
functions) and for handling STT_GNU_IFUNC had not been added to the Ada
expression evaluator.  This change adapts them from eval.c.

gdb/Changelog:

        * ada-lang.c (ada_evaluate_subexp): Add cases for
          TYPE_CODE_INTERNAL_FUNCTION and for TYPE_GNU_IFUNC, following
          their treatment in eval.c.

gdb/ChangeLog
gdb/ada-lang.c

index 8ad6e84a07b2d8bcadb01cc090e6600bfc441179..9903f0c248cff189b156ffdfba5ac590357d432f 100644 (file)
@@ -1,3 +1,9 @@
+2012-04-21  Paul Hilfinger  <hilfinger@adacore.com>
+
+       * ada-lang.c (ada_evaluate_subexp): Add cases for
+        TYPE_CODE_INTERNAL_FUNCTION and for TYPE_GNU_IFUNC, following
+        their treatment in eval.c.
+
 2012-04-21  David S. Miller  <davem@davemloft.net>
 
        * sparc-tdep.c (X_DISP10): Define.
index 52e1e59f2be255c4a4296612a176dd1ff06b78e1..180fadb774d4c103ede90d8034ec42b149a80f5a 100644 (file)
@@ -9717,8 +9717,25 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp,
         {
         case TYPE_CODE_FUNC:
           if (noside == EVAL_AVOID_SIDE_EFFECTS)
-            return allocate_value (TYPE_TARGET_TYPE (type));
+           {
+             struct type *rtype = TYPE_TARGET_TYPE (type);
+
+             if (TYPE_GNU_IFUNC (type))
+               return allocate_value (TYPE_TARGET_TYPE (rtype));
+             return allocate_value (rtype);
+           }
           return call_function_by_hand (argvec[0], nargs, argvec + 1);
+       case TYPE_CODE_INTERNAL_FUNCTION:
+         if (noside == EVAL_AVOID_SIDE_EFFECTS)
+           /* We don't know anything about what the internal
+              function might return, but we have to return
+              something.  */
+           return value_zero (builtin_type (exp->gdbarch)->builtin_int,
+                              not_lval);
+         else
+           return call_internal_function (exp->gdbarch, exp->language_defn,
+                                          argvec[0], nargs, argvec + 1);
+
         case TYPE_CODE_STRUCT:
           {
             int arity;