From patchwork Wed Nov 12 15:55:12 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Galvan X-Patchwork-Id: 3680 Received: (qmail 4670 invoked by alias); 12 Nov 2014 15:55:19 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 4655 invoked by uid 89); 12 Nov 2014 15:55:18 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_SOFTFAIL autolearn=no version=3.3.2 X-HELO: mail-lb0-f173.google.com Received: from mail-lb0-f173.google.com (HELO mail-lb0-f173.google.com) (209.85.217.173) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Wed, 12 Nov 2014 15:55:16 +0000 Received: by mail-lb0-f173.google.com with SMTP id n15so9720273lbi.18 for ; Wed, 12 Nov 2014 07:55:12 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=/YWJcAj/r2ICrL/swLfP472LN41+NJih8Z4RbZ9qRRQ=; b=hTwSZiYzNwpLbMcJG+10Ho97XhLdYO6zaOMDfRHoHrlUwF8FIMZu/QtLsf9GMH02wx LNC1eNKrWkFeCrpMiAvF+ylRw/qiMrw2ddbdwedpowX7ZbZlJPwsMsutLGdeJKqCmUd8 A9yQSLWUIrk5XrRJjdzq6U/gDsmOiM5dnnEdjWrOtjyl5vx2ysLvQkUjJhTBNxFaSL2w XbO3itNp4Fmz6Uh2iZW2OyLxLJP7XDH3N4CY3H+ycKKaRiS4PXFTtsQkc8ZwHlsbtAKQ aPFEmCz4tfVPeQR3zDNMsJSdPAJeoU1Kayr5J9/IRFGCyE3NGNvZaUSZKRRsrNwQCVvh VPBA== X-Gm-Message-State: ALoCoQlxVtbz/VJTeQMMZYSdCtu8ctXvNr4e+sxPLSeTOfJtNc1XForh5x3vTcI+6myxT8vofwE+ MIME-Version: 1.0 X-Received: by 10.112.159.129 with SMTP id xc1mr43329637lbb.24.1415807712288; Wed, 12 Nov 2014 07:55:12 -0800 (PST) Received: by 10.112.59.129 with HTTP; Wed, 12 Nov 2014 07:55:12 -0800 (PST) In-Reply-To: References: <201411071727.sA7HRNIQ007851@d03av02.boulder.ibm.com> Date: Wed, 12 Nov 2014 12:55:12 -0300 Message-ID: Subject: Re: [PING][RFC][PATCH v2] Python API: add gdb.stack_may_be_invalid From: Martin Galvan To: Ulrich Weigand Cc: gdb-patches@sourceware.org, Doug Evans , Eli Zaretskii , Pedro Alves , Daniel Gutson On Fri, Nov 7, 2014 at 2:36 PM, Martin Galvan wrote: > On Fri, Nov 7, 2014 at 2:27 PM, Ulrich Weigand wrote: >> Just one comment here: python_gdbarch isn't really correct here. >> If you have a platform that supports multiple architectures, then >> you really should use the appropriate gdbarch for PC. >> >> Ideally, the Python interface should carry enough information to >> determine the appropriate gdbarch, e.g. by operating on a Frame >> instead of a plain PC value. > > If I understand correctly, using a Frame would require the program to > be already running by the time we call the API function, which isn't > really what we want. > >> If that isn't possible, one fall-back might be to look up the >> symbol table from the PC, and use the associated objfile arch. Here's the new version of the patch. It uses the objfile's gdbarch and, if not available, python_gdbarch. static PyObject * @@ -2000,6 +2081,15 @@ Return the selected inferior object." }, { "inferiors", gdbpy_inferiors, METH_NOARGS, "inferiors () -> (gdb.Inferior, ...).\n\ Return a tuple containing all inferiors." }, + + + { "stack_may_be_invalid", gdbpy_stack_may_be_invalid, METH_VARARGS, + "stack_may_be_invalid (Long) -> Boolean.\n\ +Returns True if a given PC may point to an address in which the stack frame\n\ +may not be valid (either because it may not be set up yet or because it was\n\ +destroyed, usually in a function's epilogue), False otherwise."}, + + {NULL, NULL, 0, NULL} }; diff --git a/gdb/python/python.c b/gdb/python/python.c index d23325a..2dc2d41 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -703,6 +703,87 @@ gdbpy_solib_name (PyObject *self, PyObject *args) return str_obj; } +/* Returns 1 if the given PC may be inside a prologue, 0 if it definitely isn't, + and -1 if we have no debug info to use. */ + +static int +pc_may_be_in_prologue (gdb_py_ulongest pc) +{ + int result = -1; + struct symbol *function_symbol; + struct symtab_and_line function_body_start_sal; + + function_symbol = find_pc_function(pc); + + if (function_symbol) + { + function_body_start_sal = find_function_start_sal (function_symbol, 1); + + result = pc < function_body_start_sal.pc; + } + + return result; +} + +static int +stack_is_destroyed (gdb_py_ulongest pc) +{ + int result; + struct symtab *symtab = NULL; + struct gdbarch *gdbarch = NULL; + + symtab = find_pc_symtab (pc); + + if ((symtab != NULL) && (symtab->objfile != NULL)) + { + gdbarch = get_objfile_arch (symtab->objfile); + } + + if (gdbarch != NULL) + { + result = gdbarch_in_function_epilogue_p (gdbarch, pc); + } + else + { + result = gdbarch_in_function_epilogue_p (python_gdbarch, pc); + } + + return result; +} + +/* Returns True if a given PC may point to an address in which the stack frame + may not be valid (either because it may not be set up yet or because it was + destroyed, usually in a function's epilogue), False otherwise. */ + +static PyObject * +gdbpy_stack_may_be_invalid (PyObject *self, PyObject *args) +{ + gdb_py_ulongest pc; + PyObject *result = NULL; + int pc_maybe_in_prologue; + + if (PyArg_ParseTuple (args, GDB_PY_LLU_ARG, &pc)) + { + pc_maybe_in_prologue = pc_may_be_in_prologue (pc); + + if (pc_maybe_in_prologue != -1) + { + result = stack_is_destroyed (pc) || pc_maybe_in_prologue ? + Py_True : Py_False; + + Py_INCREF (result); + } + else /* No debug info at that point. */ + { + PyErr_Format (PyExc_RuntimeError, + _("There's no debug info for a function that\n" + "could be enclosing the given PC.")); + } + } + + return result; +} + /* A Python function which is a wrapper for decode_line_1. */