Merge tag 'clang-lto-v5.12-rc1-part2' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 23 Feb 2021 23:13:45 +0000 (15:13 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 23 Feb 2021 23:13:45 +0000 (15:13 -0800)
Pull more clang LTO updates from Kees Cook:
 "Clang LTO x86 enablement.

  Full disclosure: while this has _not_ been in linux-next (since it
  initially looked like the objtool dependencies weren't going to make
  v5.12), it has been under daily build and runtime testing by Sami for
  quite some time. These x86 portions have been discussed on lkml, with
  Peter, Josh, and others helping nail things down.

  The bulk of the changes are to get objtool working happily. The rest
  of the x86 enablement is very small.

  Summary:

   - Generate __mcount_loc in objtool (Peter Zijlstra)

   - Support running objtool against vmlinux.o (Sami Tolvanen)

   - Clang LTO enablement for x86 (Sami Tolvanen)"

Link: https://lore.kernel.org/lkml/20201013003203.4168817-26-samitolvanen@google.com/
Link: https://lore.kernel.org/lkml/cover.1611263461.git.jpoimboe@redhat.com/
* tag 'clang-lto-v5.12-rc1-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux:
  kbuild: lto: force rebuilds when switching CONFIG_LTO
  x86, build: allow LTO to be selected
  x86, cpu: disable LTO for cpu.c
  x86, vdso: disable LTO only for vDSO
  kbuild: lto: postpone objtool
  objtool: Split noinstr validation from --vmlinux
  x86, build: use objtool mcount
  tracing: add support for objtool mcount
  objtool: Don't autodetect vmlinux.o
  objtool: Fix __mcount_loc generation with Clang's assembler
  objtool: Add a pass for generating __mcount_loc

12 files changed:
1  2 
Makefile
arch/x86/Kconfig
arch/x86/Makefile
arch/x86/power/Makefile
kernel/trace/Kconfig
scripts/Makefile.lib
tools/objtool/builtin-check.c
tools/objtool/check.c
tools/objtool/include/objtool/builtin.h
tools/objtool/include/objtool/check.h
tools/objtool/include/objtool/objtool.h
tools/objtool/objtool.c

diff --cc Makefile
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index f47951e19c9d38f37454521de225e96f5d3022a3,b84cdc72b51f1b398d7dc230bdf0304d717c8449..c3a85d8f6c5c45a95a44551d613a35db3b20b6b1
  
  #include <subcmd/parse-options.h>
  #include <string.h>
 -#include "builtin.h"
 -#include "objtool.h"
 +#include <objtool/builtin.h>
 +#include <objtool/objtool.h>
  
- bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats, validate_dup, vmlinux;
+ bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats, validate_dup, vmlinux, mcount, noinstr;
  
  static const char * const check_usage[] = {
        "objtool check [<options>] file.o",
index 331a763d87756b6b4510f4b1b568030afbeec251,85993e606782b3e161dd8188da76a7399c9f4cdc..080a3d6cbd75dc3c4ab66778e1c1efac9a2b4ca7
@@@ -3048,11 -3015,22 +3136,18 @@@ int check(struct objtool_file *file
                goto out;
        warnings += ret;
  
+       if (mcount) {
+               ret = create_mcount_loc_sections(file);
+               if (ret < 0)
+                       goto out;
+               warnings += ret;
+       }
  out:
 -      if (ret < 0) {
 -              /*
 -               *  Fatal error.  The binary is corrupt or otherwise broken in
 -               *  some way, or objtool itself is broken.  Fail the kernel
 -               *  build.
 -               */
 -              return ret;
 -      }
 -
 +      /*
 +       *  For now, don't fail the kernel build on fatal warnings.  These
 +       *  errors are still fairly common due to the growing matrix of
 +       *  supported toolchains and their recent pace of change.
 +       */
        return 0;
  }
index 85c979caa36779b5ddc5afb321e9f3c411d7a6ce,0000000000000000000000000000000000000000..2502bb27de171ef8702a782aef2a757aa4dbd3d1
mode 100644,000000..100644
--- /dev/null
@@@ -1,16 -1,0 +1,16 @@@
- extern bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats, validate_dup, vmlinux;
 +/* SPDX-License-Identifier: GPL-2.0-or-later */
 +/*
 + * Copyright (C) 2015 Josh Poimboeuf <jpoimboe@redhat.com>
 + */
 +#ifndef _BUILTIN_H
 +#define _BUILTIN_H
 +
 +#include <subcmd/parse-options.h>
 +
 +extern const struct option check_options[];
++extern bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats, validate_dup, vmlinux, mcount, noinstr;
 +
 +extern int cmd_check(int argc, const char **argv);
 +extern int cmd_orc(int argc, const char **argv);
 +
 +#endif /* _BUILTIN_H */
index 4891ead0e85f6630312852a5629473454d5a1ee4,0000000000000000000000000000000000000000..f5be798107bc9cae657ad867acf47095b0551099
mode 100644,000000..100644
--- /dev/null
@@@ -1,93 -1,0 +1,94 @@@
 +/* SPDX-License-Identifier: GPL-2.0-or-later */
 +/*
 + * Copyright (C) 2017 Josh Poimboeuf <jpoimboe@redhat.com>
 + */
 +
 +#ifndef _CHECK_H
 +#define _CHECK_H
 +
 +#include <stdbool.h>
 +#include <objtool/cfi.h>
 +#include <objtool/arch.h>
 +
 +struct insn_state {
 +      struct cfi_state cfi;
 +      unsigned int uaccess_stack;
 +      bool uaccess;
 +      bool df;
 +      bool noinstr;
 +      s8 instr;
 +};
 +
 +struct alt_group {
 +      /*
 +       * Pointer from a replacement group to the original group.  NULL if it
 +       * *is* the original group.
 +       */
 +      struct alt_group *orig_group;
 +
 +      /* First and last instructions in the group */
 +      struct instruction *first_insn, *last_insn;
 +
 +      /*
 +       * Byte-offset-addressed len-sized array of pointers to CFI structs.
 +       * This is shared with the other alt_groups in the same alternative.
 +       */
 +      struct cfi_state **cfi;
 +};
 +
 +struct instruction {
 +      struct list_head list;
 +      struct hlist_node hash;
 +      struct list_head static_call_node;
++      struct list_head mcount_loc_node;
 +      struct section *sec;
 +      unsigned long offset;
 +      unsigned int len;
 +      enum insn_type type;
 +      unsigned long immediate;
 +      bool dead_end, ignore, ignore_alts;
 +      bool hint;
 +      bool retpoline_safe;
 +      s8 instr;
 +      u8 visited;
 +      struct alt_group *alt_group;
 +      struct symbol *call_dest;
 +      struct instruction *jump_dest;
 +      struct instruction *first_jump_src;
 +      struct reloc *jump_table;
 +      struct list_head alts;
 +      struct symbol *func;
 +      struct list_head stack_ops;
 +      struct cfi_state cfi;
 +};
 +
 +static inline bool is_static_jump(struct instruction *insn)
 +{
 +      return insn->type == INSN_JUMP_CONDITIONAL ||
 +             insn->type == INSN_JUMP_UNCONDITIONAL;
 +}
 +
 +static inline bool is_dynamic_jump(struct instruction *insn)
 +{
 +      return insn->type == INSN_JUMP_DYNAMIC ||
 +             insn->type == INSN_JUMP_DYNAMIC_CONDITIONAL;
 +}
 +
 +static inline bool is_jump(struct instruction *insn)
 +{
 +      return is_static_jump(insn) || is_dynamic_jump(insn);
 +}
 +
 +struct instruction *find_insn(struct objtool_file *file,
 +                            struct section *sec, unsigned long offset);
 +
 +#define for_each_insn(file, insn)                                     \
 +      list_for_each_entry(insn, &file->insn_list, list)
 +
 +#define sec_for_each_insn(file, sec, insn)                            \
 +      for (insn = find_insn(file, sec, 0);                            \
 +           insn && &insn->list != &file->insn_list &&                 \
 +                      insn->sec == sec;                               \
 +           insn = list_next_entry(insn, list))
 +
 +#endif /* _CHECK_H */
index e114642efb652df51455bc1dce43cb61b844b3c7,0000000000000000000000000000000000000000..e68e37476c15df9880a202e9e84fdcf1403538da
mode 100644,000000..100644
--- /dev/null
@@@ -1,31 -1,0 +1,32 @@@
 +/* SPDX-License-Identifier: GPL-2.0-or-later */
 +/*
 + * Copyright (C) 2020 Matt Helsley <mhelsley@vmware.com>
 + */
 +
 +#ifndef _OBJTOOL_H
 +#define _OBJTOOL_H
 +
 +#include <stdbool.h>
 +#include <linux/list.h>
 +#include <linux/hashtable.h>
 +
 +#include <objtool/elf.h>
 +
 +#define __weak __attribute__((weak))
 +
 +struct objtool_file {
 +      struct elf *elf;
 +      struct list_head insn_list;
 +      DECLARE_HASHTABLE(insn_hash, 20);
 +      struct list_head static_call_list;
++      struct list_head mcount_loc_list;
 +      bool ignore_unreachables, c_file, hints, rodata;
 +};
 +
 +struct objtool_file *objtool_open_read(const char *_objname);
 +
 +int check(struct objtool_file *file);
 +int orc_dump(const char *objname);
 +int orc_create(struct objtool_file *file);
 +
 +#endif /* _OBJTOOL_H */
Simple merge