decode_sections() relies on CFI and cfi_hash initialization done
separately in check(), making it unusable outside of check().

Consolidate the initialization into decode_sections() and rename it to
decode_file(), and make it global along with free_insns() and
insn_reloc() for use by other objtool components -- namely, the checksum
code which will be moving to another file.

Signed-off-by: Josh Poimboeuf <[email protected]>
---
 tools/objtool/check.c                 | 36 +++++++++++++--------------
 tools/objtool/include/objtool/check.h |  5 ++++
 2 files changed, 22 insertions(+), 19 deletions(-)

diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index c8208caa4b2c..17cb9265973d 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -1346,7 +1346,7 @@ __weak bool arch_is_embedded_insn(struct symbol *sym)
        return false;
 }
 
-static struct reloc *insn_reloc(struct objtool_file *file, struct instruction 
*insn)
+struct reloc *insn_reloc(struct objtool_file *file, struct instruction *insn)
 {
        struct reloc *reloc;
 
@@ -2633,8 +2633,21 @@ static bool alts_needed(void)
               opts.checksum;
 }
 
-static int decode_sections(struct objtool_file *file)
+int decode_file(struct objtool_file *file)
 {
+       arch_initial_func_cfi_state(&initial_func_cfi);
+       init_cfi_state(&init_cfi);
+       init_cfi_state(&func_cfi);
+       set_func_state(&func_cfi);
+       init_cfi_state(&force_undefined_cfi);
+       force_undefined_cfi.force_undefined = true;
+
+       if (!cfi_hash_alloc(1UL << (file->elf->symbol_bits - 3)))
+               return -1;
+
+       cfi_hash_add(&init_cfi);
+       cfi_hash_add(&func_cfi);
+
        file->klp = is_livepatch_module(file);
 
        mark_rodata(file);
@@ -5002,7 +5015,7 @@ struct insn_chunk {
  * which can trigger more allocations for .debug_* sections whose data hasn't
  * been read yet.
  */
-static void free_insns(struct objtool_file *file)
+void free_insns(struct objtool_file *file)
 {
        struct instruction *insn;
        struct insn_chunk *chunks = NULL, *chunk;
@@ -5049,22 +5062,7 @@ int check(struct objtool_file *file)
                objtool_disas_ctx = disas_ctx;
        }
 
-       arch_initial_func_cfi_state(&initial_func_cfi);
-       init_cfi_state(&init_cfi);
-       init_cfi_state(&func_cfi);
-       set_func_state(&func_cfi);
-       init_cfi_state(&force_undefined_cfi);
-       force_undefined_cfi.force_undefined = true;
-
-       if (!cfi_hash_alloc(1UL << (file->elf->symbol_bits - 3))) {
-               ret = -1;
-               goto out;
-       }
-
-       cfi_hash_add(&init_cfi);
-       cfi_hash_add(&func_cfi);
-
-       ret = decode_sections(file);
+       ret = decode_file(file);
        if (ret)
                goto out;
 
diff --git a/tools/objtool/include/objtool/check.h 
b/tools/objtool/include/objtool/check.h
index 5f2f77bd9b41..6489e52ea2f2 100644
--- a/tools/objtool/include/objtool/check.h
+++ b/tools/objtool/include/objtool/check.h
@@ -155,6 +155,11 @@ struct instruction *next_insn_same_sec(struct objtool_file 
*file, struct instruc
             insn && insn->offset < sym->offset + sym->len;             \
             insn = next_insn_same_sec(file, insn))
 
+struct reloc *insn_reloc(struct objtool_file *file, struct instruction *insn);
+
+int decode_file(struct objtool_file *file);
+void free_insns(struct objtool_file *file);
+
 const char *objtool_disas_insn(struct instruction *insn);
 
 extern size_t sym_name_max_len;
-- 
2.53.0


Reply via email to