Merge tag 'for-5.14-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave...
[linux-2.6-microblaze.git] / tools / objtool / orc_gen.c
index 738aa50..dc9b7dd 100644 (file)
@@ -82,12 +82,11 @@ static int init_orc_entry(struct orc_entry *orc, struct cfi_state *cfi)
 }
 
 static int write_orc_entry(struct elf *elf, struct section *orc_sec,
-                          struct section *ip_rsec, unsigned int idx,
+                          struct section *ip_sec, unsigned int idx,
                           struct section *insn_sec, unsigned long insn_off,
                           struct orc_entry *o)
 {
        struct orc_entry *orc;
-       struct reloc *reloc;
 
        /* populate ORC data */
        orc = (struct orc_entry *)orc_sec->data->d_buf + idx;
@@ -96,25 +95,9 @@ static int write_orc_entry(struct elf *elf, struct section *orc_sec,
        orc->bp_offset = bswap_if_needed(orc->bp_offset);
 
        /* populate reloc for ip */
-       reloc = malloc(sizeof(*reloc));
-       if (!reloc) {
-               perror("malloc");
+       if (elf_add_reloc_to_insn(elf, ip_sec, idx * sizeof(int), R_X86_64_PC32,
+                                 insn_sec, insn_off))
                return -1;
-       }
-       memset(reloc, 0, sizeof(*reloc));
-
-       insn_to_reloc_sym_addend(insn_sec, insn_off, reloc);
-       if (!reloc->sym) {
-               WARN("missing symbol for insn at offset 0x%lx",
-                    insn_off);
-               return -1;
-       }
-
-       reloc->type = R_X86_64_PC32;
-       reloc->offset = idx * sizeof(int);
-       reloc->sec = ip_rsec;
-
-       elf_add_reloc(elf, reloc);
 
        return 0;
 }
@@ -153,7 +136,7 @@ static unsigned long alt_group_len(struct alt_group *alt_group)
 
 int orc_create(struct objtool_file *file)
 {
-       struct section *sec, *ip_rsec, *orc_sec;
+       struct section *sec, *orc_sec;
        unsigned int nr = 0, idx = 0;
        struct orc_list_entry *entry;
        struct list_head orc_list;
@@ -242,20 +225,14 @@ int orc_create(struct objtool_file *file)
        sec = elf_create_section(file->elf, ".orc_unwind_ip", 0, sizeof(int), nr);
        if (!sec)
                return -1;
-       ip_rsec = elf_create_reloc_section(file->elf, sec, SHT_RELA);
-       if (!ip_rsec)
-               return -1;
 
        /* Write ORC entries to sections: */
        list_for_each_entry(entry, &orc_list, list) {
-               if (write_orc_entry(file->elf, orc_sec, ip_rsec, idx++,
+               if (write_orc_entry(file->elf, orc_sec, sec, idx++,
                                    entry->insn_sec, entry->insn_off,
                                    &entry->orc))
                        return -1;
        }
 
-       if (elf_rebuild_reloc_section(file->elf, ip_rsec))
-               return -1;
-
        return 0;
 }