Merge tag 'powerpc-6.2-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[linux-block.git] / tools / objtool / check.c
index 14130ab86227f367d4533c1ae3e3b6efc7bb0bb6..4350be739f4fac504657fe76d4b8c93da1d244b7 100644 (file)
@@ -204,7 +204,7 @@ static bool __dead_end_function(struct objtool_file *file, struct symbol *func,
                return false;
 
        insn = find_insn(file, func->sec, func->offset);
-       if (!insn_func(insn))
+       if (!insn || !insn_func(insn))
                return false;
 
        func_for_each_insn(file, func, insn) {
@@ -925,9 +925,9 @@ static int create_cfi_sections(struct objtool_file *file)
 
 static int create_mcount_loc_sections(struct objtool_file *file)
 {
-       struct section *sec;
-       unsigned long *loc;
+       int addrsize = elf_class_addrsize(file->elf);
        struct instruction *insn;
+       struct section *sec;
        int idx;
 
        sec = find_section_by_name(file->elf, "__mcount_loc");
@@ -944,23 +944,25 @@ static int create_mcount_loc_sections(struct objtool_file *file)
        list_for_each_entry(insn, &file->mcount_loc_list, call_node)
                idx++;
 
-       sec = elf_create_section(file->elf, "__mcount_loc", 0, sizeof(unsigned long), idx);
+       sec = elf_create_section(file->elf, "__mcount_loc", 0, addrsize, idx);
        if (!sec)
                return -1;
 
+       sec->sh.sh_addralign = addrsize;
+
        idx = 0;
        list_for_each_entry(insn, &file->mcount_loc_list, call_node) {
+               void *loc;
 
-               loc = (unsigned long *)sec->data->d_buf + idx;
-               memset(loc, 0, sizeof(unsigned long));
+               loc = sec->data->d_buf + idx;
+               memset(loc, 0, addrsize);
 
-               if (elf_add_reloc_to_insn(file->elf, sec,
-                                         idx * sizeof(unsigned long),
-                                         R_X86_64_64,
+               if (elf_add_reloc_to_insn(file->elf, sec, idx,
+                                         addrsize == sizeof(u64) ? R_ABS64 : R_ABS32,
                                          insn->sec, insn->offset))
                        return -1;
 
-               idx++;
+               idx += addrsize;
        }
 
        return 0;
@@ -1380,17 +1382,18 @@ static void annotate_call_site(struct objtool_file *file,
        if (opts.mcount && sym->fentry) {
                if (sibling)
                        WARN_FUNC("Tail call to __fentry__ !?!?", insn->sec, insn->offset);
+               if (opts.mnop) {
+                       if (reloc) {
+                               reloc->type = R_NONE;
+                               elf_write_reloc(file->elf, reloc);
+                       }
 
-               if (reloc) {
-                       reloc->type = R_NONE;
-                       elf_write_reloc(file->elf, reloc);
-               }
-
-               elf_write_insn(file->elf, insn->sec,
-                              insn->offset, insn->len,
-                              arch_nop_insn(insn->len));
+                       elf_write_insn(file->elf, insn->sec,
+                                      insn->offset, insn->len,
+                                      arch_nop_insn(insn->len));
 
-               insn->type = INSN_NOP;
+                       insn->type = INSN_NOP;
+               }
 
                list_add_tail(&insn->call_node, &file->mcount_loc_list);
                return;
@@ -2252,7 +2255,7 @@ static int read_unwind_hints(struct objtool_file *file)
                        return -1;
                }
 
-               cfi.cfa.offset = bswap_if_needed(hint->sp_offset);
+               cfi.cfa.offset = bswap_if_needed(file->elf, hint->sp_offset);
                cfi.type = hint->type;
                cfi.end = hint->end;
 
@@ -2465,7 +2468,7 @@ static int classify_symbols(struct objtool_file *file)
                        if (arch_is_rethunk(func))
                                func->return_thunk = true;
 
-                       if (!strcmp(func->name, "__fentry__"))
+                       if (arch_ftrace_match(func->name))
                                func->fentry = true;
 
                        if (is_profiling_func(func->name))
@@ -2541,9 +2544,11 @@ static int decode_sections(struct objtool_file *file)
         * Must be before add_jump_destinations(), which depends on 'func'
         * being set for alternatives, to enable proper sibling call detection.
         */
-       ret = add_special_section_alts(file);
-       if (ret)
-               return ret;
+       if (opts.stackval || opts.orc || opts.uaccess || opts.noinstr) {
+               ret = add_special_section_alts(file);
+               if (ret)
+                       return ret;
+       }
 
        ret = add_jump_destinations(file);
        if (ret)