Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 18 Dec 2016 00:24:13 +0000 (16:24 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 18 Dec 2016 00:24:13 +0000 (16:24 -0800)
Pull kbuild updates from Michal Marek:

 - prototypes for x86 asm-exported symbols (Adam Borowski) and a warning
   about missing CRCs (Nick Piggin)

 - asm-exports fix for LTO (Nicolas Pitre)

 - thin archives improvements (Nick Piggin)

 - linker script fix for CONFIG_LD_DEAD_CODE_DATA_ELIMINATION (Nick
   Piggin)

 - genksyms support for __builtin_va_list keyword

 - misc minor fixes

* 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild:
  x86/kbuild: enable modversions for symbols exported from asm
  kbuild: fix scripts/adjust_autoksyms.sh* for the no modules case
  scripts/kallsyms: remove last remnants of --page-offset option
  make use of make variable CURDIR instead of calling pwd
  kbuild: cmd_export_list: tighten the sed script
  kbuild: minor improvement for thin archives build
  kbuild: modpost warn if export version crc is missing
  kbuild: keep data tables through dead code elimination
  kbuild: improve linker compatibility with lib-ksyms.o build
  genksyms: Regenerate parser
  kbuild/genksyms: handle va_list type
  kbuild: thin archives for multi-y targets
  kbuild: kallsyms allow 3-pass generation if symbols size has changed

1  2 
include/asm-generic/vmlinux.lds.h
samples/bpf/Makefile
scripts/Makefile.build
scripts/mod/modpost.c
tools/lib/traceevent/Makefile
tools/perf/Makefile.perf
tools/perf/tests/make

  #ifdef CONFIG_KPROBES
  #define KPROBE_BLACKLIST()    . = ALIGN(8);                                 \
                                VMLINUX_SYMBOL(__start_kprobe_blacklist) = .; \
-                               *(_kprobe_blacklist)                          \
+                               KEEP(*(_kprobe_blacklist))                    \
                                VMLINUX_SYMBOL(__stop_kprobe_blacklist) = .;
  #else
  #define KPROBE_BLACKLIST()
  #ifdef CONFIG_EVENT_TRACING
  #define FTRACE_EVENTS()       . = ALIGN(8);                                   \
                        VMLINUX_SYMBOL(__start_ftrace_events) = .;      \
-                       *(_ftrace_events)                               \
+                       KEEP(*(_ftrace_events))                         \
                        VMLINUX_SYMBOL(__stop_ftrace_events) = .;       \
                        VMLINUX_SYMBOL(__start_ftrace_enum_maps) = .;   \
-                       *(_ftrace_enum_map)                             \
+                       KEEP(*(_ftrace_enum_map))                       \
                        VMLINUX_SYMBOL(__stop_ftrace_enum_maps) = .;
  #else
  #define FTRACE_EVENTS()
  
  #ifdef CONFIG_TRACING
  #define TRACE_PRINTKS() VMLINUX_SYMBOL(__start___trace_bprintk_fmt) = .;      \
-                        *(__trace_printk_fmt) /* Trace_printk fmt' pointer */ \
+                        KEEP(*(__trace_printk_fmt)) /* Trace_printk fmt' pointer */ \
                         VMLINUX_SYMBOL(__stop___trace_bprintk_fmt) = .;
  #define TRACEPOINT_STR() VMLINUX_SYMBOL(__start___tracepoint_str) = .;        \
-                        *(__tracepoint_str) /* Trace_printk fmt' pointer */ \
+                        KEEP(*(__tracepoint_str)) /* Trace_printk fmt' pointer */ \
                         VMLINUX_SYMBOL(__stop___tracepoint_str) = .;
  #else
  #define TRACE_PRINTKS()
  #ifdef CONFIG_FTRACE_SYSCALLS
  #define TRACE_SYSCALLS() . = ALIGN(8);                                        \
                         VMLINUX_SYMBOL(__start_syscalls_metadata) = .; \
-                        *(__syscalls_metadata)                         \
+                        KEEP(*(__syscalls_metadata))                   \
                         VMLINUX_SYMBOL(__stop_syscalls_metadata) = .;
  #else
  #define TRACE_SYSCALLS()
  #ifdef CONFIG_SERIAL_EARLYCON
  #define EARLYCON_TABLE() STRUCT_ALIGN();                      \
                         VMLINUX_SYMBOL(__earlycon_table) = .;  \
-                        *(__earlycon_table)                    \
+                        KEEP(*(__earlycon_table))              \
                         VMLINUX_SYMBOL(__earlycon_table_end) = .;
  #else
  #define EARLYCON_TABLE()
  #define _OF_TABLE_1(name)                                             \
        . = ALIGN(8);                                                   \
        VMLINUX_SYMBOL(__##name##_of_table) = .;                        \
-       *(__##name##_of_table)                                          \
-       *(__##name##_of_table_end)
+       KEEP(*(__##name##_of_table))                                    \
+       KEEP(*(__##name##_of_table_end))
  
  #define CLKSRC_OF_TABLES()    OF_TABLE(CONFIG_CLKSRC_OF, clksrc)
  #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip)
  #define ACPI_PROBE_TABLE(name)                                                \
        . = ALIGN(8);                                                   \
        VMLINUX_SYMBOL(__##name##_acpi_probe_table) = .;                \
-       *(__##name##_acpi_probe_table)                                  \
+       KEEP(*(__##name##_acpi_probe_table))                            \
        VMLINUX_SYMBOL(__##name##_acpi_probe_table_end) = .;
  #else
  #define ACPI_PROBE_TABLE(name)
  #define KERNEL_DTB()                                                  \
        STRUCT_ALIGN();                                                 \
        VMLINUX_SYMBOL(__dtb_start) = .;                                \
-       *(.dtb.init.rodata)                                             \
+       KEEP(*(.dtb.init.rodata))                                       \
        VMLINUX_SYMBOL(__dtb_end) = .;
  
  /*
        /* implement dynamic printk debug */                            \
        . = ALIGN(8);                                                   \
        VMLINUX_SYMBOL(__start___jump_table) = .;                       \
-       *(__jump_table)                                                 \
+       KEEP(*(__jump_table))                                           \
        VMLINUX_SYMBOL(__stop___jump_table) = .;                        \
        . = ALIGN(8);                                                   \
        VMLINUX_SYMBOL(__start___verbose) = .;                          \
-       *(__verbose)                                                    \
+       KEEP(*(__verbose))                                              \
        VMLINUX_SYMBOL(__stop___verbose) = .;                           \
        LIKELY_PROFILE()                                                \
        BRANCH_PROFILE()                                                \
   * own by defining an empty RO_AFTER_INIT_DATA.
   */
  #ifndef RO_AFTER_INIT_DATA
 -#define RO_AFTER_INIT_DATA *(.data..ro_after_init)
 +#define RO_AFTER_INIT_DATA                                            \
 +      __start_data_ro_after_init = .;                                 \
 +      *(.data..ro_after_init)                                         \
 +      __end_data_ro_after_init = .;
  #endif
  
  /*
                VMLINUX_SYMBOL(__start_rodata) = .;                     \
                *(.rodata) *(.rodata.*)                                 \
                RO_AFTER_INIT_DATA      /* Read only after init */      \
-               *(__vermagic)           /* Kernel version magic */      \
+               KEEP(*(__vermagic))     /* Kernel version magic */      \
                . = ALIGN(8);                                           \
                VMLINUX_SYMBOL(__start___tracepoints_ptrs) = .;         \
-               *(__tracepoints_ptrs)   /* Tracepoints: pointer array */\
+               KEEP(*(__tracepoints_ptrs)) /* Tracepoints: pointer array */ \
                VMLINUX_SYMBOL(__stop___tracepoints_ptrs) = .;          \
                *(__tracepoints_strings)/* Tracepoints: strings */      \
        }                                                               \
        /* PCI quirks */                                                \
        .pci_fixup        : AT(ADDR(.pci_fixup) - LOAD_OFFSET) {        \
                VMLINUX_SYMBOL(__start_pci_fixups_early) = .;           \
-               *(.pci_fixup_early)                                     \
+               KEEP(*(.pci_fixup_early))                               \
                VMLINUX_SYMBOL(__end_pci_fixups_early) = .;             \
                VMLINUX_SYMBOL(__start_pci_fixups_header) = .;          \
-               *(.pci_fixup_header)                                    \
+               KEEP(*(.pci_fixup_header))                              \
                VMLINUX_SYMBOL(__end_pci_fixups_header) = .;            \
                VMLINUX_SYMBOL(__start_pci_fixups_final) = .;           \
-               *(.pci_fixup_final)                                     \
+               KEEP(*(.pci_fixup_final))                               \
                VMLINUX_SYMBOL(__end_pci_fixups_final) = .;             \
                VMLINUX_SYMBOL(__start_pci_fixups_enable) = .;          \
-               *(.pci_fixup_enable)                                    \
+               KEEP(*(.pci_fixup_enable))                              \
                VMLINUX_SYMBOL(__end_pci_fixups_enable) = .;            \
                VMLINUX_SYMBOL(__start_pci_fixups_resume) = .;          \
-               *(.pci_fixup_resume)                                    \
+               KEEP(*(.pci_fixup_resume))                              \
                VMLINUX_SYMBOL(__end_pci_fixups_resume) = .;            \
                VMLINUX_SYMBOL(__start_pci_fixups_resume_early) = .;    \
-               *(.pci_fixup_resume_early)                              \
+               KEEP(*(.pci_fixup_resume_early))                        \
                VMLINUX_SYMBOL(__end_pci_fixups_resume_early) = .;      \
                VMLINUX_SYMBOL(__start_pci_fixups_suspend) = .;         \
-               *(.pci_fixup_suspend)                                   \
+               KEEP(*(.pci_fixup_suspend))                             \
                VMLINUX_SYMBOL(__end_pci_fixups_suspend) = .;           \
                VMLINUX_SYMBOL(__start_pci_fixups_suspend_late) = .;    \
-               *(.pci_fixup_suspend_late)                              \
+               KEEP(*(.pci_fixup_suspend_late))                        \
                VMLINUX_SYMBOL(__end_pci_fixups_suspend_late) = .;      \
        }                                                               \
                                                                        \
        /* Built-in firmware blobs */                                   \
        .builtin_fw        : AT(ADDR(.builtin_fw) - LOAD_OFFSET) {      \
                VMLINUX_SYMBOL(__start_builtin_fw) = .;                 \
-               *(.builtin_fw)                                          \
+               KEEP(*(.builtin_fw))                                    \
                VMLINUX_SYMBOL(__end_builtin_fw) = .;                   \
        }                                                               \
                                                                        \
                                                                        \
        /* Kernel symbol table: strings */                              \
          __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) {       \
-               KEEP(*(__ksymtab_strings))                              \
+               *(__ksymtab_strings)                                    \
        }                                                               \
                                                                        \
        /* __*init sections */                                          \
        /* Built-in module parameters. */                               \
        __param : AT(ADDR(__param) - LOAD_OFFSET) {                     \
                VMLINUX_SYMBOL(__start___param) = .;                    \
-               *(__param)                                              \
+               KEEP(*(__param))                                        \
                VMLINUX_SYMBOL(__stop___param) = .;                     \
        }                                                               \
                                                                        \
        /* Built-in module versions. */                                 \
        __modver : AT(ADDR(__modver) - LOAD_OFFSET) {                   \
                VMLINUX_SYMBOL(__start___modver) = .;                   \
-               *(__modver)                                             \
+               KEEP(*(__modver))                                       \
                VMLINUX_SYMBOL(__stop___modver) = .;                    \
                . = ALIGN((align));                                     \
                VMLINUX_SYMBOL(__end_rodata) = .;                       \
        . = ALIGN(align);                                               \
        __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {               \
                VMLINUX_SYMBOL(__start___ex_table) = .;                 \
-               *(__ex_table)                                           \
+               KEEP(*(__ex_table))                                     \
                VMLINUX_SYMBOL(__stop___ex_table) = .;                  \
        }
  
  #ifdef CONFIG_CONSTRUCTORS
  #define KERNEL_CTORS()        . = ALIGN(8);                      \
                        VMLINUX_SYMBOL(__ctors_start) = .; \
-                       *(.ctors)                          \
-                       *(SORT(.init_array.*))             \
-                       *(.init_array)                     \
+                       KEEP(*(.ctors))                    \
+                       KEEP(*(SORT(.init_array.*)))       \
+                       KEEP(*(.init_array))               \
                        VMLINUX_SYMBOL(__ctors_end) = .;
  #else
  #define KERNEL_CTORS()
        IRQCHIP_OF_MATCH_TABLE()                                        \
        ACPI_PROBE_TABLE(irqchip)                                       \
        ACPI_PROBE_TABLE(clksrc)                                        \
 +      ACPI_PROBE_TABLE(iort)                                          \
        EARLYCON_TABLE()
  
  #define INIT_TEXT                                                     \
        . = ALIGN(8);                                                   \
        __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) {             \
                VMLINUX_SYMBOL(__start___bug_table) = .;                \
-               *(__bug_table)                                          \
+               KEEP(*(__bug_table))                                    \
                VMLINUX_SYMBOL(__stop___bug_table) = .;                 \
        }
  #else
        . = ALIGN(4);                                                   \
        .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) {               \
                VMLINUX_SYMBOL(__tracedata_start) = .;                  \
-               *(.tracedata)                                           \
+               KEEP(*(.tracedata))                                     \
                VMLINUX_SYMBOL(__tracedata_end) = .;                    \
        }
  #else
  #define INIT_SETUP(initsetup_align)                                   \
                . = ALIGN(initsetup_align);                             \
                VMLINUX_SYMBOL(__setup_start) = .;                      \
-               *(.init.setup)                                          \
+               KEEP(*(.init.setup))                                    \
                VMLINUX_SYMBOL(__setup_end) = .;
  
  #define INIT_CALLS_LEVEL(level)                                               \
diff --combined samples/bpf/Makefile
@@@ -2,7 -2,7 +2,7 @@@
  obj- := dummy.o
  
  # List of programs to build
 -hostprogs-y := test_verifier test_maps
 +hostprogs-y := test_lru_dist
  hostprogs-y += sock_example
  hostprogs-y += fds_example
  hostprogs-y += sockex1
@@@ -22,20 -22,14 +22,20 @@@ hostprogs-y += spintes
  hostprogs-y += map_perf_test
  hostprogs-y += test_overhead
  hostprogs-y += test_cgrp2_array_pin
 +hostprogs-y += test_cgrp2_attach
 +hostprogs-y += test_cgrp2_attach2
 +hostprogs-y += test_cgrp2_sock
 +hostprogs-y += test_cgrp2_sock2
  hostprogs-y += xdp1
  hostprogs-y += xdp2
  hostprogs-y += test_current_task_under_cgroup
  hostprogs-y += trace_event
  hostprogs-y += sampleip
 +hostprogs-y += tc_l2_redirect
 +hostprogs-y += lwt_len_hist
 +hostprogs-y += xdp_tx_iptunnel
  
 -test_verifier-objs := test_verifier.o libbpf.o
 -test_maps-objs := test_maps.o libbpf.o
 +test_lru_dist-objs := test_lru_dist.o libbpf.o
  sock_example-objs := sock_example.o libbpf.o
  fds_example-objs := bpf_load.o libbpf.o fds_example.o
  sockex1-objs := bpf_load.o libbpf.o sockex1_user.o
@@@ -55,20 -49,13 +55,20 @@@ spintest-objs := bpf_load.o libbpf.o sp
  map_perf_test-objs := bpf_load.o libbpf.o map_perf_test_user.o
  test_overhead-objs := bpf_load.o libbpf.o test_overhead_user.o
  test_cgrp2_array_pin-objs := libbpf.o test_cgrp2_array_pin.o
 +test_cgrp2_attach-objs := libbpf.o test_cgrp2_attach.o
 +test_cgrp2_attach2-objs := libbpf.o test_cgrp2_attach2.o cgroup_helpers.o
 +test_cgrp2_sock-objs := libbpf.o test_cgrp2_sock.o
 +test_cgrp2_sock2-objs := bpf_load.o libbpf.o test_cgrp2_sock2.o
  xdp1-objs := bpf_load.o libbpf.o xdp1_user.o
  # reuse xdp1 source intentionally
  xdp2-objs := bpf_load.o libbpf.o xdp1_user.o
 -test_current_task_under_cgroup-objs := bpf_load.o libbpf.o \
 +test_current_task_under_cgroup-objs := bpf_load.o libbpf.o cgroup_helpers.o \
                                       test_current_task_under_cgroup_user.o
  trace_event-objs := bpf_load.o libbpf.o trace_event_user.o
  sampleip-objs := bpf_load.o libbpf.o sampleip_user.o
 +tc_l2_redirect-objs := bpf_load.o libbpf.o tc_l2_redirect_user.o
 +lwt_len_hist-objs := bpf_load.o libbpf.o lwt_len_hist_user.o
 +xdp_tx_iptunnel-objs := bpf_load.o libbpf.o xdp_tx_iptunnel_user.o
  
  # Tell kbuild to always build the programs
  always := $(hostprogs-y)
@@@ -81,12 -68,10 +81,12 @@@ always += tracex3_kern.
  always += tracex4_kern.o
  always += tracex5_kern.o
  always += tracex6_kern.o
 +always += sock_flags_kern.o
  always += test_probe_write_user_kern.o
  always += trace_output_kern.o
  always += tcbpf1_kern.o
  always += tcbpf2_kern.o
 +always += tc_l2_redirect_kern.o
  always += lathist_kern.o
  always += offwaketime_kern.o
  always += spintest_kern.o
@@@ -100,11 -85,8 +100,11 @@@ always += xdp2_kern.
  always += test_current_task_under_cgroup_kern.o
  always += trace_event_kern.o
  always += sampleip_kern.o
 +always += lwt_len_hist_kern.o
 +always += xdp_tx_iptunnel_kern.o
  
  HOSTCFLAGS += -I$(objtree)/usr/include
 +HOSTCFLAGS += -I$(srctree)/tools/testing/selftests/bpf/
  
  HOSTCFLAGS_bpf_load.o += -I$(objtree)/usr/include -Wno-unused-variable
  HOSTLOADLIBES_fds_example += -lelf
@@@ -117,7 -99,6 +117,7 @@@ HOSTLOADLIBES_tracex3 += -lel
  HOSTLOADLIBES_tracex4 += -lelf -lrt
  HOSTLOADLIBES_tracex5 += -lelf
  HOSTLOADLIBES_tracex6 += -lelf
 +HOSTLOADLIBES_test_cgrp2_sock2 += -lelf
  HOSTLOADLIBES_test_probe_write_user += -lelf
  HOSTLOADLIBES_trace_output += -lelf -lrt
  HOSTLOADLIBES_lathist += -lelf
@@@ -130,9 -111,6 +130,9 @@@ HOSTLOADLIBES_xdp2 += -lel
  HOSTLOADLIBES_test_current_task_under_cgroup += -lelf
  HOSTLOADLIBES_trace_event += -lelf
  HOSTLOADLIBES_sampleip += -lelf
 +HOSTLOADLIBES_tc_l2_redirect += -l elf
 +HOSTLOADLIBES_lwt_len_hist += -l elf
 +HOSTLOADLIBES_xdp_tx_iptunnel += -lelf
  
  # Allows pointing LLC/CLANG to a LLVM backend with bpf support, redefine on cmdline:
  #  make samples/bpf/ LLC=~/git/llvm/build/bin/llc CLANG=~/git/llvm/build/bin/clang
@@@ -141,10 -119,10 +141,10 @@@ CLANG ?= clan
  
  # Trick to allow make to be run from this directory
  all:
-       $(MAKE) -C ../../ $$PWD/
+       $(MAKE) -C ../../ $(CURDIR)/
  
  clean:
-       $(MAKE) -C ../../ M=$$PWD clean
+       $(MAKE) -C ../../ M=$(CURDIR) clean
        @rm -f *~
  
  # Verify LLVM compiler tools are available and bpf target is supported by llc
@@@ -174,6 -152,4 +174,6 @@@ $(obj)/%.o: $(src)/%.
        $(CLANG) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(EXTRA_CFLAGS) \
                -D__KERNEL__ -D__ASM_SYSREG_H -Wno-unused-value -Wno-pointer-sign \
                -Wno-compare-distinct-pointer-types \
 +              -Wno-gnu-variable-sized-type-not-at-end \
 +              -Wno-address-of-packed-member -Wno-tautological-compare \
                -O2 -emit-llvm -c $< -o -| $(LLC) -march=bpf -filetype=obj -o $@
diff --combined scripts/Makefile.build
@@@ -159,8 -159,7 +159,8 @@@ cmd_cpp_i_c       = $(CPP) $(c_flags) -
  $(obj)/%.i: $(src)/%.c FORCE
        $(call if_changed_dep,cpp_i_c)
  
 -cmd_gensymtypes =                                                           \
 +# These mirror gensymtypes_S and co below, keep them in synch.
 +cmd_gensymtypes_c =                                                         \
      $(CPP) -D__GENKSYMS__ $(c_flags) $< |                                   \
      $(GENKSYMS) $(if $(1), -T $(2))                                         \
       $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX))             \
  quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
  cmd_cc_symtypes_c =                                                         \
      set -e;                                                                 \
 -    $(call cmd_gensymtypes,true,$@) >/dev/null;                             \
 +    $(call cmd_gensymtypes_c,true,$@) >/dev/null;                           \
      test -s $@ || rm -f $@
  
  $(obj)/%.symtypes : $(src)/%.c FORCE
@@@ -199,10 -198,9 +199,10 @@@ els
  #   the actual value of the checksum generated by genksyms
  
  cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
 -cmd_modversions =                                                             \
 +
 +cmd_modversions_c =                                                           \
        if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then             \
 -              $(call cmd_gensymtypes,$(KBUILD_SYMTYPES),$(@:.o=.symtypes))    \
 +              $(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes))  \
                    > $(@D)/.tmp_$(@F:.o=.ver);                                 \
                                                                                \
                $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F)                      \
@@@ -270,14 -268,13 +270,14 @@@ endif # CONFIG_STACK_VALIDATIO
  define rule_cc_o_c
        $(call echo-cmd,checksrc) $(cmd_checksrc)                         \
        $(call cmd_and_fixdep,cc_o_c)                                     \
 -      $(cmd_modversions)                                                \
 +      $(cmd_modversions_c)                                              \
        $(cmd_objtool)                                                    \
        $(call echo-cmd,record_mcount) $(cmd_record_mcount)
  endef
  
  define rule_as_o_S
        $(call cmd_and_fixdep,as_o_S)                                     \
 +      $(cmd_modversions_S)                                              \
        $(cmd_objtool)
  endef
  
@@@ -317,39 -314,6 +317,39 @@@ modkern_aflags := $(KBUILD_AFLAGS_KERNE
  $(real-objs-m)      : modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
  $(real-objs-m:.o=.s): modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
  
 +# .S file exports must have their C prototypes defined in asm/asm-prototypes.h
 +# or a file that it includes, in order to get versioned symbols. We build a
 +# dummy C file that includes asm-prototypes and the EXPORT_SYMBOL lines from
 +# the .S file (with trailing ';'), and run genksyms on that, to extract vers.
 +#
 +# This is convoluted. The .S file must first be preprocessed to run guards and
 +# expand names, then the resulting exports must be constructed into plain
 +# EXPORT_SYMBOL(symbol); to build our dummy C file, and that gets preprocessed
 +# to make the genksyms input.
 +#
 +# These mirror gensymtypes_c and co above, keep them in synch.
 +cmd_gensymtypes_S =                                                         \
 +    (echo "\#include <linux/kernel.h>" ;                                    \
 +     echo "\#include <asm/asm-prototypes.h>" ;                              \
 +    $(CPP) $(a_flags) $< |                                                  \
 +     grep "\<___EXPORT_SYMBOL\>" |                                          \
 +     sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ) | \
 +    $(CPP) -D__GENKSYMS__ $(c_flags) -xc - |                                \
 +    $(GENKSYMS) $(if $(1), -T $(2))                                         \
 +     $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX))             \
 +     $(if $(KBUILD_PRESERVE),-p)                                            \
 +     -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
 +
 +quiet_cmd_cc_symtypes_S = SYM $(quiet_modtag) $@
 +cmd_cc_symtypes_S =                                                         \
 +    set -e;                                                                 \
 +    $(call cmd_gensymtypes_S,true,$@) >/dev/null;                           \
 +    test -s $@ || rm -f $@
 +
 +$(obj)/%.symtypes : $(src)/%.S FORCE
 +      $(call cmd,cc_symtypes_S)
 +
 +
  quiet_cmd_cpp_s_S = CPP $(quiet_modtag) $@
  cmd_cpp_s_S       = $(CPP) $(a_flags) -o $@ $<
  
@@@ -357,37 -321,7 +357,37 @@@ $(obj)/%.s: $(src)/%.S FORC
        $(call if_changed_dep,cpp_s_S)
  
  quiet_cmd_as_o_S = AS $(quiet_modtag)  $@
 -cmd_as_o_S       = $(CC) $(a_flags) -c -o $@ $<
 +
 +ifndef CONFIG_MODVERSIONS
 +cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<
 +
 +else
 +
 +ASM_PROTOTYPES := $(wildcard $(srctree)/arch/$(SRCARCH)/include/asm/asm-prototypes.h)
 +
 +ifeq ($(ASM_PROTOTYPES),)
 +cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<
 +
 +else
 +
 +# versioning matches the C process described above, with difference that
 +# we parse asm-prototypes.h C header to get function definitions.
 +
 +cmd_as_o_S = $(CC) $(a_flags) -c -o $(@D)/.tmp_$(@F) $<
 +
 +cmd_modversions_S =                                                           \
 +      if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then             \
 +              $(call cmd_gensymtypes_S,$(KBUILD_SYMTYPES),$(@:.o=.symtypes))  \
 +                  > $(@D)/.tmp_$(@F:.o=.ver);                                 \
 +                                                                              \
 +              $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F)                      \
 +                      -T $(@D)/.tmp_$(@F:.o=.ver);                            \
 +              rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver);                \
 +      else                                                                    \
 +              mv -f $(@D)/.tmp_$(@F) $@;                                      \
 +      fi;
 +endif
 +endif
  
  $(obj)/%.o: $(src)/%.S $(objtool_obj) FORCE
        $(call if_changed_rule,as_o_S)
@@@ -488,17 -422,14 +488,17 @@@ endi
  
  quiet_cmd_export_list = EXPORTS $@
  cmd_export_list = $(OBJDUMP) -h $< | \
-       sed -ne '/___ksymtab/{s/.*+/$(ref_prefix)/;s/ .*/)/;p}' >$(ksyms-lds);\
+       sed -ne '/___ksymtab/s/.*+\([^ ]*\).*/$(ref_prefix)\1)/p' >$(ksyms-lds);\
        rm -f $(dummy-object);\
-       $(AR) rcs$(KBUILD_ARFLAGS) $(dummy-object);\
+       echo | $(CC) $(a_flags) -c -o $(dummy-object) -x assembler -;\
        $(LD) $(ld_flags) -r -o $@ -T $(ksyms-lds) $(dummy-object);\
        rm $(dummy-object) $(ksyms-lds)
  
  $(obj)/lib-ksyms.o: $(lib-target) FORCE
        $(call if_changed,export_list)
 +
 +targets += $(obj)/lib-ksyms.o
 +
  endif
  
  #
@@@ -517,11 -448,18 +517,18 @@@ $($(subst $(obj)/,,$(@:.o=-objs)))    
  $($(subst $(obj)/,,$(@:.o=-y)))       \
  $($(subst $(obj)/,,$(@:.o=-m)))), $^)
  
- quiet_cmd_link_multi-y = LD      $@
- cmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)
+ cmd_link_multi-link = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)
+ ifdef CONFIG_THIN_ARCHIVES
+   quiet_cmd_link_multi-y = AR      $@
+   cmd_link_multi-y = rm -f $@; $(AR) rcST$(KBUILD_ARFLAGS) $@ $(link_multi_deps)
+ else
+   quiet_cmd_link_multi-y = LD      $@
+   cmd_link_multi-y = $(cmd_link_multi-link)
+ endif
  
  quiet_cmd_link_multi-m = LD [M]  $@
- cmd_link_multi-m = $(cmd_link_multi-y)
+ cmd_link_multi-m = $(cmd_link_multi-link)
  
  $(multi-used-y): FORCE
        $(call if_changed,link_multi-y)
diff --combined scripts/mod/modpost.c
@@@ -609,6 -609,7 +609,7 @@@ static void handle_modversions(struct m
  {
        unsigned int crc;
        enum export export;
+       bool is_crc = false;
  
        if ((!is_vmlinux(mod->name) || mod->is_dot_o) &&
            strncmp(symname, "__ksymtab", 9) == 0)
  
        /* CRC'd symbol */
        if (strncmp(symname, CRC_PFX, strlen(CRC_PFX)) == 0) {
+               is_crc = true;
                crc = (unsigned int) sym->st_value;
                sym_update_crc(symname + strlen(CRC_PFX), mod, crc,
                                export);
                else
                        symname++;
  #endif
+               if (is_crc) {
+                       const char *e = is_vmlinux(mod->name) ?"":".ko";
+                       warn("EXPORT symbol \"%s\" [%s%s] version generation failed, symbol will not be versioned.\n", symname + strlen(CRC_PFX), mod->name, e);
+               }
                mod->unres = alloc_symbol(symname,
                                          ELF_ST_BIND(sym->st_info) == STB_WEAK,
                                          mod->unres);
@@@ -2371,7 -2377,6 +2377,7 @@@ static void write_dump(const char *fnam
                }
        }
        write_if_changed(&buf, fname);
 +      free(buf.p);
  }
  
  struct ext_sym_list {
@@@ -2497,7 -2502,6 +2503,7 @@@ int main(int argc, char **argv
                              "Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n");
                }
        }
 +      free(buf.p);
  
        return err;
  }
@@@ -86,7 -86,7 +86,7 @@@ ifndef VERBOS
  endif
  
  ifeq ($(srctree),)
- srctree := $(patsubst %/,%,$(dir $(shell pwd)))
+ srctree := $(patsubst %/,%,$(dir $(CURDIR)))
  srctree := $(patsubst %/,%,$(dir $(srctree)))
  srctree := $(patsubst %/,%,$(dir $(srctree)))
  #$(info Determined 'srctree' to be $(srctree))
@@@ -99,6 -99,8 +99,6 @@@ libdir_SQ = $(subst ','\'',$(libdir)
  libdir_relative_SQ = $(subst ','\'',$(libdir_relative))
  plugin_dir_SQ = $(subst ','\'',$(plugin_dir))
  
 -LIB_FILE = libtraceevent.a libtraceevent.so
 -
  CONFIG_INCLUDES = 
  CONFIG_LIBS   =
  CONFIG_FLAGS  =
@@@ -112,9 -114,6 +112,9 @@@ N          
  
  EVENT_PARSE_VERSION = $(EP_VERSION).$(EP_PATCHLEVEL).$(EP_EXTRAVERSION)
  
 +LIB_TARGET  = libtraceevent.a libtraceevent.so.$(EVENT_PARSE_VERSION)
 +LIB_INSTALL = libtraceevent.a libtraceevent.so*
 +
  INCLUDES = -I. -I $(srctree)/tools/include $(CONFIG_INCLUDES)
  
  # Set compile option CFLAGS
@@@ -157,11 -156,11 +157,11 @@@ PLUGINS += plugin_cfg80211.s
  PLUGINS    := $(addprefix $(OUTPUT),$(PLUGINS))
  PLUGINS_IN := $(PLUGINS:.so=-in.o)
  
 -TE_IN    := $(OUTPUT)libtraceevent-in.o
 -LIB_FILE := $(addprefix $(OUTPUT),$(LIB_FILE))
 +TE_IN      := $(OUTPUT)libtraceevent-in.o
 +LIB_TARGET := $(addprefix $(OUTPUT),$(LIB_TARGET))
  DYNAMIC_LIST_FILE := $(OUTPUT)libtraceevent-dynamic-list
  
 -CMD_TARGETS = $(LIB_FILE) $(PLUGINS) $(DYNAMIC_LIST_FILE)
 +CMD_TARGETS = $(LIB_TARGET) $(PLUGINS) $(DYNAMIC_LIST_FILE)
  
  TARGETS = $(CMD_TARGETS)
  
@@@ -172,10 -171,8 +172,10 @@@ all_cmd: $(CMD_TARGETS
  $(TE_IN): force
        $(Q)$(MAKE) $(build)=libtraceevent
  
 -$(OUTPUT)libtraceevent.so: $(TE_IN)
 -      $(QUIET_LINK)$(CC) --shared $^ -o $@
 +$(OUTPUT)libtraceevent.so.$(EVENT_PARSE_VERSION): $(TE_IN)
 +      $(QUIET_LINK)$(CC) --shared $^ -Wl,-soname,libtraceevent.so.$(EP_VERSION) -o $@
 +      @ln -sf $(@F) $(OUTPUT)libtraceevent.so
 +      @ln -sf $(@F) $(OUTPUT)libtraceevent.so.$(EP_VERSION)
  
  $(OUTPUT)libtraceevent.a: $(TE_IN)
        $(QUIET_LINK)$(RM) $@; $(AR) rcs $@ $^
@@@ -239,15 -236,11 +239,15 @@@ TAGS:   forc
        find . -name '*.[ch]' | xargs etags \
        --regex='/_PE(\([^,)]*\).*/PEVENT_ERRNO__\1/'
  
 +define do_install_mkdir
 +      if [ ! -d '$(DESTDIR_SQ)$1' ]; then             \
 +              $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$1'; \
 +      fi
 +endef
 +
  define do_install
 -      if [ ! -d '$(DESTDIR_SQ)$2' ]; then             \
 -              $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$2'; \
 -      fi;                                             \
 -      $(INSTALL) $1 '$(DESTDIR_SQ)$2'
 +      $(call do_install_mkdir,$2);                    \
 +      $(INSTALL) $(if $3,-m $3,) $1 '$(DESTDIR_SQ)$2'
  endef
  
  define do_install_plugins
@@@ -264,20 -257,13 +264,20 @@@ define do_generate_dynamic_list_fil
  endef
  
  install_lib: all_cmd install_plugins
 -      $(call QUIET_INSTALL, $(LIB_FILE)) \
 -              $(call do_install,$(LIB_FILE),$(libdir_SQ))
 +      $(call QUIET_INSTALL, $(LIB_TARGET)) \
 +              $(call do_install_mkdir,$(libdir_SQ)); \
 +              cp -fpR $(LIB_INSTALL) $(DESTDIR)$(libdir_SQ)
  
  install_plugins: $(PLUGINS)
        $(call QUIET_INSTALL, trace_plugins) \
                $(call do_install_plugins, $(PLUGINS))
  
 +install_headers:
 +      $(call QUIET_INSTALL, headers) \
 +              $(call do_install,event-parse.h,$(prefix)/include/traceevent,644); \
 +              $(call do_install,event-utils.h,$(prefix)/include/traceevent,644); \
 +              $(call do_install,kbuffer.h,$(prefix)/include/traceevent,644)
 +
  install: install_lib
  
  clean:
diff --combined tools/perf/Makefile.perf
@@@ -86,12 -86,6 +86,12 @@@ include ../scripts/utilities.ma
  #
  # Define FEATURES_DUMP to provide features detection dump file
  # and bypass the feature detection
 +#
 +# Define NO_JVMTI if you do not want jvmti agent built
 +#
 +# Define LIBCLANGLLVM if you DO want builtin clang and llvm support.
 +# When selected, pass LLVM_CONFIG=/path/to/llvm-config to `make' if
 +# llvm-config is not in $PATH.
  
  # As per kernel Makefile, avoid funny character set dependencies
  unexport LC_ALL
@@@ -100,7 -94,7 +100,7 @@@ LC_NUMERIC=
  export LC_COLLATE LC_NUMERIC
  
  ifeq ($(srctree),)
- srctree := $(patsubst %/,%,$(dir $(shell pwd)))
+ srctree := $(patsubst %/,%,$(dir $(CURDIR)))
  srctree := $(patsubst %/,%,$(dir $(srctree)))
  #$(info Determined 'srctree' to be $(srctree))
  endif
@@@ -128,6 -122,10 +128,6 @@@ endi
  # (this improves performance and avoids hard-to-debug behaviour);
  MAKEFLAGS += -r
  
 -$(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD
 -      $(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
 -      $(Q)touch $(OUTPUT)PERF-VERSION-FILE
 -
  # Makefiles suck: This macro sets a default value of $(2) for the
  # variable named by $(1), unless the variable has been set by
  # environment or command line. This is necessary for CC and AR
@@@ -143,7 -141,6 +143,7 @@@ ende
  $(call allow-override,CC,$(CROSS_COMPILE)gcc)
  $(call allow-override,AR,$(CROSS_COMPILE)ar)
  $(call allow-override,LD,$(CROSS_COMPILE)ld)
 +$(call allow-override,CXX,$(CROSS_COMPILE)g++)
  
  LD += $(EXTRA_LDFLAGS)
  
@@@ -152,7 -149,6 +152,7 @@@ HOSTLD  ?= l
  HOSTAR  ?= ar
  
  PKG_CONFIG = $(CROSS_COMPILE)pkg-config
 +LLVM_CONFIG ?= llvm-config
  
  RM      = rm -f
  LN      = ln -f
@@@ -164,11 -160,16 +164,11 @@@ BISON   = biso
  STRIP   = strip
  AWK     = awk
  
 -LIB_DIR               = $(srctree)/tools/lib/api/
 -TRACE_EVENT_DIR = $(srctree)/tools/lib/traceevent/
 -BPF_DIR               = $(srctree)/tools/lib/bpf/
 -SUBCMD_DIR    = $(srctree)/tools/lib/subcmd/
 -
  # include Makefile.config by default and rule out
  # non-config cases
  config := 1
  
 -NON_CONFIG_TARGETS := clean TAGS tags cscope help install-doc
 +NON_CONFIG_TARGETS := clean TAGS tags cscope help install-doc install-man install-html install-info install-pdf doc man html info pdf
  
  ifdef MAKECMDGOALS
  ifeq ($(filter-out $(NON_CONFIG_TARGETS),$(MAKECMDGOALS)),)
  endif
  endif
  
 +# The fixdep build - we force fixdep tool to be built as
 +# the first target in the separate make session not to be
 +# disturbed by any parallel make jobs. Once fixdep is done
 +# we issue the requested build with FIXDEP=1 variable.
 +#
 +# The fixdep build is disabled for $(NON_CONFIG_TARGETS)
 +# targets, because it's not necessary.
 +
 +ifdef FIXDEP
 +  force_fixdep := 0
 +else
 +  force_fixdep := $(config)
 +endif
 +
 +export srctree OUTPUT RM CC CXX LD AR CFLAGS CXXFLAGS V BISON FLEX AWK
 +export HOSTCC HOSTLD HOSTAR
 +
 +include $(srctree)/tools/build/Makefile.include
 +
 +ifeq ($(force_fixdep),1)
 +goals := $(filter-out all sub-make, $(MAKECMDGOALS))
 +
 +$(goals) all: sub-make
 +
 +sub-make: fixdep
 +      $(Q)$(MAKE) FIXDEP=1 -f Makefile.perf $(goals)
 +
 +else # force_fixdep
 +
 +LIB_DIR         = $(srctree)/tools/lib/api/
 +TRACE_EVENT_DIR = $(srctree)/tools/lib/traceevent/
 +BPF_DIR         = $(srctree)/tools/lib/bpf/
 +SUBCMD_DIR      = $(srctree)/tools/lib/subcmd/
 +
  # Set FEATURE_TESTS to 'all' so all possible feature checkers are executed.
  # Without this setting the output feature dump file misses some features, for
  # example, liberty. Select all checkers so we won't get an incomplete feature
@@@ -293,6 -260,17 +293,6 @@@ python-clean := $(call QUIET_CLEAN, pyt
  PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
  PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBAPI)
  
 -$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST)
 -      $(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \
 -        CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \
 -        $(PYTHON_WORD) util/setup.py \
 -        --quiet build_ext; \
 -      mkdir -p $(OUTPUT)python && \
 -      cp $(PYTHON_EXTBUILD_LIB)perf.so $(OUTPUT)python/
 -#
 -# No Perl scripts right now:
 -#
 -
  SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
  
  PROGRAMS += $(OUTPUT)perf
@@@ -305,12 -283,6 +305,12 @@@ ifndef NO_PERF_READ_VDSOX3
  PROGRAMS += $(OUTPUT)perf-read-vdsox32
  endif
  
 +LIBJVMTI = libperf-jvmti.so
 +
 +ifndef NO_JVMTI
 +PROGRAMS += $(OUTPUT)$(LIBJVMTI)
 +endif
 +
  # what 'all' will build and 'install' will install, in perfexecdir
  ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
  
@@@ -345,6 -317,11 +345,6 @@@ endi
  ifndef NO_GTK2
    ALL_PROGRAMS += $(OUTPUT)libperf-gtk.so
    GTK_IN := $(OUTPUT)gtk-in.o
 -
 -install-gtk: $(OUTPUT)libperf-gtk.so
 -      $(call QUIET_INSTALL, 'GTK UI') \
 -              $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(libdir_SQ)'; \
 -              $(INSTALL) $(OUTPUT)libperf-gtk.so '$(DESTDIR_SQ)$(libdir_SQ)'
  endif
  
  ifdef ASCIIDOC8
@@@ -353,21 -330,6 +353,21 @@@ endi
  
  LIBS = -Wl,--whole-archive $(PERFLIBS) -Wl,--no-whole-archive -Wl,--start-group $(EXTLIBS) -Wl,--end-group
  
 +ifeq ($(USE_CLANG), 1)
 +  CLANGLIBS_LIST = AST Basic CodeGen Driver Frontend Lex Tooling Edit Sema Analysis Parse Serialization
 +  LIBCLANG = $(foreach l,$(CLANGLIBS_LIST),$(wildcard $(shell $(LLVM_CONFIG) --libdir)/libclang$(l).a))
 +  LIBS += -Wl,--start-group $(LIBCLANG) -Wl,--end-group
 +endif
 +
 +ifeq ($(USE_LLVM), 1)
 +  LIBLLVM = $(shell $(LLVM_CONFIG) --libs all) $(shell $(LLVM_CONFIG) --system-libs)
 +  LIBS += -L$(shell $(LLVM_CONFIG) --libdir) $(LIBLLVM)
 +endif
 +
 +ifeq ($(USE_CXX), 1)
 +  LIBS += -lstdc++
 +endif
 +
  export INSTALL SHELL_PATH
  
  ### Build rules
@@@ -376,14 -338,6 +376,14 @@@ SHELL = $(SHELL_PATH
  
  all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
  
 +$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST)
 +      $(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \
 +        CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \
 +        $(PYTHON_WORD) util/setup.py \
 +        --quiet build_ext; \
 +      mkdir -p $(OUTPUT)python && \
 +      cp $(PYTHON_EXTBUILD_LIB)perf.so $(OUTPUT)python/
 +
  please_set_SHELL_PATH_to_a_more_modern_shell:
        $(Q)$$(:)
  
@@@ -394,6 -348,10 +394,6 @@@ strip: $(PROGRAMS) $(OUTPUT)per
  
  PERF_IN := $(OUTPUT)perf-in.o
  
 -export srctree OUTPUT RM CC LD AR CFLAGS V BISON FLEX AWK
 -export HOSTCC HOSTLD HOSTAR
 -include $(srctree)/tools/build/Makefile.include
 -
  JEVENTS       := $(OUTPUT)pmu-events/jevents
  JEVENTS_IN    := $(OUTPUT)pmu-events/jevents-in.o
  
@@@ -423,10 -381,10 +423,10 @@@ $(PERF_IN): prepare FORC
          (diff -B ../arch/x86/include/asm/cpufeatures.h ../../arch/x86/include/asm/cpufeatures.h >/dev/null) \
          || echo "Warning: tools/arch/x86/include/asm/cpufeatures.h differs from kernel" >&2 )) || true
        @(test -f ../../arch/x86/lib/memcpy_64.S && ( \
 -        (diff -B ../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memcpy_64.S >/dev/null) \
 +        (diff -B -I "^EXPORT_SYMBOL" -I "^#include <asm/export.h>" ../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memcpy_64.S >/dev/null) \
          || echo "Warning: tools/arch/x86/lib/memcpy_64.S differs from kernel" >&2 )) || true
        @(test -f ../../arch/x86/lib/memset_64.S && ( \
 -        (diff -B ../arch/x86/lib/memset_64.S ../../arch/x86/lib/memset_64.S >/dev/null) \
 +        (diff -B -I "^EXPORT_SYMBOL" -I "^#include <asm/export.h>" ../arch/x86/lib/memset_64.S ../../arch/x86/lib/memset_64.S >/dev/null) \
          || echo "Warning: tools/arch/x86/lib/memset_64.S differs from kernel" >&2 )) || true
        @(test -f ../../arch/arm/include/uapi/asm/perf_regs.h && ( \
          (diff -B ../arch/arm/include/uapi/asm/perf_regs.h ../../arch/arm/include/uapi/asm/perf_regs.h >/dev/null) \
@@@ -512,7 -470,7 +512,7 @@@ $(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $
        $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \
                $(PERF_IN) $(PMU_EVENTS_IN) $(LIBS) -o $@
  
 -$(GTK_IN): fixdep FORCE
 +$(GTK_IN): FORCE
        $(Q)$(MAKE) $(build)=gtk
  
  $(OUTPUT)libperf-gtk.so: $(GTK_IN) $(PERFLIBS)
@@@ -526,10 -484,6 +526,10 @@@ $(OUTPUT)common-cmds.h: $(wildcard Docu
  $(SCRIPTS) : % : %.sh
        $(QUIET_GEN)$(INSTALL) '$@.sh' '$(OUTPUT)$@'
  
 +$(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD
 +      $(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
 +      $(Q)touch $(OUTPUT)PERF-VERSION-FILE
 +
  # These can record PERF_VERSION
  perf.spec $(SCRIPTS) \
        : $(OUTPUT)PERF-VERSION-FILE
@@@ -561,7 -515,7 +561,7 @@@ endi
  __build-dir = $(subst $(OUTPUT),,$(dir $@))
  build-dir   = $(if $(__build-dir),$(__build-dir),.)
  
 -prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h fixdep archheaders
 +prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders
  
  $(OUTPUT)%.o: %.c prepare FORCE
        $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
@@@ -597,21 -551,11 +597,21 @@@ $(OUTPUT)perf-read-vdsox32: perf-read-v
        $(QUIET_CC)$(CC) -mx32 $(filter -static,$(LDFLAGS)) -Wall -Werror -o $@ perf-read-vdso.c
  endif
  
 +ifndef NO_JVMTI
 +LIBJVMTI_IN := $(OUTPUT)jvmti/jvmti-in.o
 +
 +$(LIBJVMTI_IN): FORCE
 +      $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=jvmti obj=jvmti
 +
 +$(OUTPUT)$(LIBJVMTI): $(LIBJVMTI_IN)
 +      $(QUIET_LINK)$(CC) -shared -Wl,-soname -Wl,$(LIBJVMTI) -o $@ $< -lelf -lrt
 +endif
 +
  $(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h)
  
  LIBPERF_IN := $(OUTPUT)libperf-in.o
  
 -$(LIBPERF_IN): prepare fixdep FORCE
 +$(LIBPERF_IN): prepare FORCE
        $(Q)$(MAKE) $(build)=libperf
  
  $(LIB_FILE): $(LIBPERF_IN)
  
  LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ)
  
 -$(LIBTRACEEVENT): fixdep FORCE
 +$(LIBTRACEEVENT): FORCE
        $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) $(OUTPUT)libtraceevent.a
  
 -libtraceevent_plugins: fixdep FORCE
 +libtraceevent_plugins: FORCE
        $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) plugins
  
  $(LIBTRACEEVENT_DYNAMIC_LIST): libtraceevent_plugins
@@@ -635,21 -579,21 +635,21 @@@ $(LIBTRACEEVENT)-clean
  install-traceevent-plugins: libtraceevent_plugins
        $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) install_plugins
  
 -$(LIBAPI): fixdep FORCE
 +$(LIBAPI): FORCE
        $(Q)$(MAKE) -C $(LIB_DIR) O=$(OUTPUT) $(OUTPUT)libapi.a
  
  $(LIBAPI)-clean:
        $(call QUIET_CLEAN, libapi)
        $(Q)$(MAKE) -C $(LIB_DIR) O=$(OUTPUT) clean >/dev/null
  
 -$(LIBBPF): fixdep FORCE
 +$(LIBBPF): FORCE
        $(Q)$(MAKE) -C $(BPF_DIR) O=$(OUTPUT) $(OUTPUT)libbpf.a FEATURES_DUMP=$(FEATURE_DUMP_EXPORT)
  
  $(LIBBPF)-clean:
        $(call QUIET_CLEAN, libbpf)
        $(Q)$(MAKE) -C $(BPF_DIR) O=$(OUTPUT) clean >/dev/null
  
 -$(LIBSUBCMD): fixdep FORCE
 +$(LIBSUBCMD): FORCE
        $(Q)$(MAKE) -C $(SUBCMD_DIR) O=$(OUTPUT) $(OUTPUT)libsubcmd.a
  
  $(LIBSUBCMD)-clean:
@@@ -729,14 -673,7 +729,14 @@@ check: $(OUTPUT)common-cmds.
  
  ### Installation rules
  
 +ifndef NO_GTK2
 +install-gtk: $(OUTPUT)libperf-gtk.so
 +      $(call QUIET_INSTALL, 'GTK UI') \
 +              $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(libdir_SQ)'; \
 +              $(INSTALL) $(OUTPUT)libperf-gtk.so '$(DESTDIR_SQ)$(libdir_SQ)'
 +else
  install-gtk:
 +endif
  
  install-tools: all install-gtk
        $(call QUIET_INSTALL, binaries) \
@@@ -750,10 -687,6 +750,10 @@@ endi
  ifndef NO_PERF_READ_VDSOX32
        $(call QUIET_INSTALL, perf-read-vdsox32) \
                $(INSTALL) $(OUTPUT)perf-read-vdsox32 '$(DESTDIR_SQ)$(bindir_SQ)';
 +endif
 +ifndef NO_JVMTI
 +      $(call QUIET_INSTALL, $(LIBJVMTI)) \
 +              $(INSTALL) $(OUTPUT)$(LIBJVMTI) '$(DESTDIR_SQ)$(libdir_SQ)';
  endif
        $(call QUIET_INSTALL, libexec) \
                $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
@@@ -821,7 -754,7 +821,7 @@@ clean:: $(LIBTRACEEVENT)-clean $(LIBAPI
        $(call QUIET_CLEAN, core-objs)  $(RM) $(LIB_FILE) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(LANG_BINDINGS)
        $(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
        $(Q)$(RM) $(OUTPUT).config-detected
 -      $(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32 $(OUTPUT)pmu-events/jevents
 +      $(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32 $(OUTPUT)pmu-events/jevents $(OUTPUT)$(LIBJVMTI).so
        $(call QUIET_CLEAN, core-gen)   $(RM)  *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope* $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)FEATURE-DUMP $(OUTPUT)util/*-bison* $(OUTPUT)util/*-flex* \
                $(OUTPUT)util/intel-pt-decoder/inat-tables.c $(OUTPUT)fixdep \
                $(OUTPUT)tests/llvm-src-{base,kbuild,prologue,relocation}.c \
@@@ -857,4 -790,3 +857,4 @@@ FORCE
  .PHONY: $(GIT-HEAD-PHONY) TAGS tags cscope FORCE prepare
  .PHONY: libtraceevent_plugins archheaders
  
 +endif # force_fixdep
diff --combined tools/perf/tests/make
@@@ -42,7 -42,7 +42,7 @@@ LC_NUMERIC=
  export LC_COLLATE LC_NUMERIC
  
  ifeq ($(srctree),)
- srctree := $(patsubst %/,%,$(dir $(shell pwd)))
+ srctree := $(patsubst %/,%,$(dir $(CURDIR)))
  srctree := $(patsubst %/,%,$(dir $(srctree)))
  #$(info Determined 'srctree' to be $(srctree))
  endif
@@@ -83,7 -83,6 +83,7 @@@ make_no_libbpf            := NO_LIBBPF=
  make_no_libcrypto   := NO_LIBCRYPTO=1
  make_with_babeltrace:= LIBBABELTRACE=1
  make_no_sdt       := NO_SDT=1
 +make_with_clangllvm := LIBCLANGLLVM=1
  make_tags           := tags
  make_cscope         := cscope
  make_help           := help
@@@ -107,7 -106,7 +107,7 @@@ make_minimal        := NO_LIBPERL=1 NO_
  make_minimal        += NO_DEMANGLE=1 NO_LIBELF=1 NO_LIBUNWIND=1 NO_BACKTRACE=1
  make_minimal        += NO_LIBNUMA=1 NO_LIBAUDIT=1 NO_LIBBIONIC=1
  make_minimal        += NO_LIBDW_DWARF_UNWIND=1 NO_AUXTRACE=1 NO_LIBBPF=1
 -make_minimal        += NO_LIBCRYPTO=1 NO_SDT=1
 +make_minimal        += NO_LIBCRYPTO=1 NO_SDT=1 NO_JVMTI=1
  
  # $(run) contains all available tests
  run := make_pure
@@@ -140,7 -139,6 +140,7 @@@ run += make_no_libbioni
  run += make_no_auxtrace
  run += make_no_libbpf
  run += make_with_babeltrace
 +run += make_with_clangllvm
  run += make_help
  run += make_doc
  run += make_perf_o
@@@ -280,7 -278,7 +280,7 @@@ endi
  
  MAKEFLAGS := --no-print-directory
  
 -clean := @(cd $(PERF); $(MAKE_F) -s $(O_OPT) clean >/dev/null)
 +clean := @(cd $(PERF); $(MAKE_F) -s $(O_OPT) clean >/dev/null && $(MAKE) -s $(O_OPT) -C ../build clean >/dev/null)
  
  $(run):
        $(call clean)