Merge commit '818299f6bdae' into android-exynos-4.14-ww-9610-minor_up-dev
[GitHub/LineageOS/android_kernel_motorola_exynos9610.git] / scripts / link-vmlinux.sh
old mode 100755 (executable)
new mode 100644 (file)
index e7b7eee..c9559fc
@@ -1,4 +1,5 @@
 #!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
 #
 # link vmlinux
 #
@@ -60,7 +61,38 @@ archive_builtin()
                ${AR} rcsTP${KBUILD_ARFLAGS} built-in.o                 \
                                        ${KBUILD_VMLINUX_INIT}          \
                                        ${KBUILD_VMLINUX_MAIN}
+
+               if [ -n "${CONFIG_LTO_CLANG}" ]; then
+                       mv -f built-in.o built-in.o.tmp
+                       ${LLVM_AR} rcsT${KBUILD_ARFLAGS} built-in.o $(${AR} t built-in.o.tmp)
+                       rm -f built-in.o.tmp
+               fi
+       fi
+}
+
+# If CONFIG_LTO_CLANG is selected, collect generated symbol versions into
+# .tmp_symversions
+modversions()
+{
+       if [ -z "${CONFIG_LTO_CLANG}" ]; then
+               return
+       fi
+
+       if [ -z "${CONFIG_MODVERSIONS}" ]; then
+               return
        fi
+
+       rm -f .tmp_symversions
+
+       for a in built-in.o ${KBUILD_VMLINUX_LIBS}; do
+               for o in $(${AR} t $a); do
+                       if [ -f ${o}.symversions ]; then
+                               cat ${o}.symversions >> .tmp_symversions
+                       fi
+               done
+       done
+
+       echo "-T .tmp_symversions"
 }
 
 # Link of vmlinux.o used for section mismatch analysis
@@ -83,7 +115,29 @@ modpost_link()
                        ${KBUILD_VMLINUX_LIBS}                          \
                        --end-group"
        fi
-       ${LD} ${LDFLAGS} -r -o ${1} ${objects}
+
+       if [ -n "${CONFIG_LTO_CLANG}" ]; then
+               # This might take a while, so indicate that we're doing
+               # an LTO link
+               info LTO vmlinux.o
+       else
+               info LD vmlinux.o
+       fi
+
+       ${LD} ${LDFLAGS} -r -o ${1} $(modversions) ${objects}
+}
+
+# If CONFIG_LTO_CLANG is selected, we postpone running recordmcount until
+# we have compiled LLVM IR to an object file.
+recordmcount()
+{
+       if [ -z "${CONFIG_LTO_CLANG}" ]; then
+               return
+       fi
+
+       if [ -n "${CONFIG_FTRACE_MCOUNT_RECORD}" ]; then
+               scripts/recordmcount ${RECORDMCOUNT_FLAGS} $*
+       fi
 }
 
 # Link of vmlinux
@@ -95,8 +149,16 @@ vmlinux_link()
        local objects
 
        if [ "${SRCARCH}" != "um" ]; then
-               if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
-                       objects="--whole-archive                        \
+               local ld=${LD}
+               local ldflags="${LDFLAGS} ${LDFLAGS_vmlinux}"
+
+               if [ -n "${LDFINAL_vmlinux}" ]; then
+                       ld=${LDFINAL_vmlinux}
+                       ldflags="${LDFLAGS_FINAL_vmlinux} ${LDFLAGS_vmlinux}"
+               fi
+
+               if [[ -n "${CONFIG_THIN_ARCHIVES}" && -z "${CONFIG_LTO_CLANG}" ]]; then
+                       objects="--whole-archive                        \
                                built-in.o                              \
                                --no-whole-archive                      \
                                --start-group                           \
@@ -112,8 +174,7 @@ vmlinux_link()
                                ${1}"
                fi
 
-               ${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2}             \
-                       -T ${lds} ${objects}
+               ${ld} ${ldflags} -o ${2} -T ${lds} ${objects}
        else
                if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
                        objects="-Wl,--whole-archive                    \
@@ -140,7 +201,6 @@ vmlinux_link()
        fi
 }
 
-
 # Create ${2} .o file with all symbols from the ${1} object file
 kallsyms()
 {
@@ -191,6 +251,7 @@ cleanup()
        rm -f .tmp_System.map
        rm -f .tmp_kallsyms*
        rm -f .tmp_version
+       rm -f .tmp_symversions
        rm -f .tmp_vmlinux*
        rm -f built-in.o
        rm -f System.map
@@ -252,12 +313,22 @@ ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init GCC_PLUGINS_CFLAGS="${GC
 archive_builtin
 
 #link vmlinux.o
-info LD vmlinux.o
 modpost_link vmlinux.o
 
 # modpost vmlinux.o to check for section mismatches
 ${MAKE} -f "${srctree}/scripts/Makefile.modpost" vmlinux.o
 
+if [ -n "${CONFIG_LTO_CLANG}" ]; then
+       # Re-use vmlinux.o, so we can avoid the slow LTO link step in
+       # vmlinux_link
+       KBUILD_VMLINUX_INIT=
+       KBUILD_VMLINUX_MAIN=vmlinux.o
+       KBUILD_VMLINUX_LIBS=
+
+       # Call recordmcount if needed
+       recordmcount vmlinux.o
+fi
+
 kallsymso=""
 kallsyms_vmlinux=""
 if [ -n "${CONFIG_KALLSYMS}" ]; then
@@ -332,5 +403,10 @@ if [ -n "${CONFIG_KALLSYMS}" ]; then
        fi
 fi
 
+if [ -n "${CONFIG_EXYNOS_FMP_FIPS}" ]; then
+    echo '  FIPS : Generating hmac of fmp and updating vmlinux... '
+       PYTHONDONTWRITEBYTECODE=0 "${srctree}/scripts/fmp/fips_fmp_integrity.py" "${objtree}/vmlinux"
+fi
+
 # We made a new kernel - delete old version file
 rm -f .old_version