lkml.org 
[lkml]   [2020]   [Mar]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v3.1 18b/26] objtool: Factor out CFI hints
    Subject: objtool: Factor out CFI hints
    From: Peter Zijlstra <peterz@infradead.org>
    Date: Wed Mar 25 13:08:17 CET 2020

    Move the application of CFI hints into it's own function.
    No functional changes intended.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    tools/objtool/check.c | 66 ++++++++++++++++++++++++++++----------------------
    1 file changed, 37 insertions(+), 29 deletions(-)

    --- a/tools/objtool/check.c
    +++ b/tools/objtool/check.c
    @@ -2033,6 +2033,40 @@ static int validate_return(struct symbol
    return 0;
    }

    +static int apply_insn_hint(struct objtool_file *file, struct section *sec,
    + struct symbol *func, struct instruction *insn,
    + struct insn_state *state)
    +{
    + if (insn->restore) {
    + struct instruction *save_insn, *i;
    +
    + i = insn;
    + save_insn = NULL;
    + sym_for_each_insn_continue_reverse(file, func, i) {
    + if (i->save) {
    + save_insn = i;
    + break;
    + }
    + }
    +
    + if (!save_insn) {
    + WARN_FUNC("no corresponding CFI save for CFI restore",
    + sec, insn->offset);
    + return 1;
    + }
    +
    + if (!save_insn->visited) {
    + WARN_FUNC("objtool isn't smart enough to handle this CFI save/restore combo",
    + sec, insn->offset);
    + return 1;
    + }
    +
    + insn->state = save_insn->state;
    + }
    +
    + state = insn->state;
    +}
    +
    /*
    * Follow the branch starting at the given instruction, and recursively follow
    * any other branches (jumps). Meanwhile, track the frame pointer state at
    @@ -2081,35 +2115,9 @@ static int validate_branch(struct objtoo
    }

    if (insn->hint) {
    - if (insn->restore) {
    - struct instruction *save_insn, *i;
    -
    - i = insn;
    - save_insn = NULL;
    - sym_for_each_insn_continue_reverse(file, func, i) {
    - if (i->save) {
    - save_insn = i;
    - break;
    - }
    - }
    -
    - if (!save_insn) {
    - WARN_FUNC("no corresponding CFI save for CFI restore",
    - sec, insn->offset);
    - return 1;
    - }
    -
    - if (!save_insn->visited) {
    - WARN_FUNC("objtool isn't smart enough to handle this CFI save/restore combo",
    - sec, insn->offset);
    - return 1;
    - }
    -
    - insn->state = save_insn->state;
    - }
    -
    - state = insn->state;
    -
    + ret = apply_insn_hint(file, sec, func, insn, &state);
    + if (ret)
    + return ret;
    } else
    insn->state = state;

    \
     
     \ /
      Last update: 2020-03-25 15:43    [W:4.183 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site