Merge tag 'nios2-5.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/lftan...
[linux-2.6-microblaze.git] / scripts / link-vmlinux.sh
index 6eded32..3b261b0 100755 (executable)
@@ -43,11 +43,37 @@ info()
        fi
 }
 
+# Generate a linker script to ensure correct ordering of initcalls.
+gen_initcalls()
+{
+       info GEN .tmp_initcalls.lds
+
+       ${PYTHON} ${srctree}/scripts/jobserver-exec             \
+       ${PERL} ${srctree}/scripts/generate_initcall_order.pl   \
+               ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}   \
+               > .tmp_initcalls.lds
+}
+
+# If CONFIG_LTO_CLANG is selected, collect generated symbol versions into
+# .tmp_symversions.lds
+gen_symversions()
+{
+       info GEN .tmp_symversions.lds
+       rm -f .tmp_symversions.lds
+
+       for o in ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}; do
+               if [ -f ${o}.symversions ]; then
+                       cat ${o}.symversions >> .tmp_symversions.lds
+               fi
+       done
+}
+
 # Link of vmlinux.o used for section mismatch analysis
 # ${1} output file
 modpost_link()
 {
        local objects
+       local lds=""
 
        objects="--whole-archive                                \
                ${KBUILD_VMLINUX_OBJS}                          \
@@ -56,19 +82,57 @@ modpost_link()
                ${KBUILD_VMLINUX_LIBS}                          \
                --end-group"
 
-       ${LD} ${KBUILD_LDFLAGS} -r -o ${1} ${objects}
+       if [ -n "${CONFIG_LTO_CLANG}" ]; then
+               gen_initcalls
+               lds="-T .tmp_initcalls.lds"
+
+               if [ -n "${CONFIG_MODVERSIONS}" ]; then
+                       gen_symversions
+                       lds="${lds} -T .tmp_symversions.lds"
+               fi
+
+               # This might take a while, so indicate that we're doing
+               # an LTO link
+               info LTO ${1}
+       else
+               info LD ${1}
+       fi
+
+       ${LD} ${KBUILD_LDFLAGS} -r -o ${1} ${lds} ${objects}
 }
 
 objtool_link()
 {
+       local objtoolcmd;
        local objtoolopt;
 
+       if [ "${CONFIG_LTO_CLANG} ${CONFIG_STACK_VALIDATION}" = "y y" ]; then
+               # Don't perform vmlinux validation unless explicitly requested,
+               # but run objtool on vmlinux.o now that we have an object file.
+               if [ -n "${CONFIG_UNWINDER_ORC}" ]; then
+                       objtoolcmd="orc generate"
+               fi
+
+               objtoolopt="${objtoolopt} --duplicate"
+
+               if [ -n "${CONFIG_FTRACE_MCOUNT_USE_OBJTOOL}" ]; then
+                       objtoolopt="${objtoolopt} --mcount"
+               fi
+       fi
+
        if [ -n "${CONFIG_VMLINUX_VALIDATION}" ]; then
-               objtoolopt="check"
+               objtoolopt="${objtoolopt} --noinstr"
+       fi
+
+       if [ -n "${objtoolopt}" ]; then
+               if [ -z "${objtoolcmd}" ]; then
+                       objtoolcmd="check"
+               fi
+               objtoolopt="${objtoolopt} --vmlinux"
                if [ -z "${CONFIG_FRAME_POINTER}" ]; then
                        objtoolopt="${objtoolopt} --no-fp"
                fi
-               if [ -n "${CONFIG_GCOV_KERNEL}" ]; then
+               if [ -n "${CONFIG_GCOV_KERNEL}" ] || [ -n "${CONFIG_LTO_CLANG}" ]; then
                        objtoolopt="${objtoolopt} --no-unreachable"
                fi
                if [ -n "${CONFIG_RETPOLINE}" ]; then
@@ -78,7 +142,7 @@ objtool_link()
                        objtoolopt="${objtoolopt} --uaccess"
                fi
                info OBJTOOL ${1}
-               tools/objtool/objtool ${objtoolopt} ${1}
+               tools/objtool/objtool ${objtoolcmd} ${objtoolopt} ${1}
        fi
 }
 
@@ -103,13 +167,22 @@ vmlinux_link()
        fi
 
        if [ "${SRCARCH}" != "um" ]; then
-               objects="--whole-archive                        \
-                       ${KBUILD_VMLINUX_OBJS}                  \
-                       --no-whole-archive                      \
-                       --start-group                           \
-                       ${KBUILD_VMLINUX_LIBS}                  \
-                       --end-group                             \
-                       ${@}"
+               if [ -n "${CONFIG_LTO_CLANG}" ]; then
+                       # Use vmlinux.o instead of performing the slow LTO
+                       # link again.
+                       objects="--whole-archive                \
+                               vmlinux.o                       \
+                               --no-whole-archive              \
+                               ${@}"
+               else
+                       objects="--whole-archive                \
+                               ${KBUILD_VMLINUX_OBJS}          \
+                               --no-whole-archive              \
+                               --start-group                   \
+                               ${KBUILD_VMLINUX_LIBS}          \
+                               --end-group                     \
+                               ${@}"
+               fi
 
                ${LD} ${KBUILD_LDFLAGS} ${LDFLAGS_vmlinux}      \
                        ${strip_debug#-Wl,}                     \
@@ -225,6 +298,8 @@ cleanup()
 {
        rm -f .btf.*
        rm -f .tmp_System.map
+       rm -f .tmp_initcalls.lds
+       rm -f .tmp_symversions.lds
        rm -f .tmp_vmlinux*
        rm -f System.map
        rm -f vmlinux
@@ -274,7 +349,6 @@ fi;
 ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init need-builtin=1
 
 #link vmlinux.o
-info LD vmlinux.o
 modpost_link vmlinux.o
 objtool_link vmlinux.o