aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrevor Radcliffe <tradical@google.com>2023-03-22 20:22:27 +0000
committerTrevor Radcliffe <tradical@google.com>2023-03-27 18:07:40 +0000
commit391a25d7fa3d4dd316b8263b0fd190aa5f33e4e8 (patch)
treed027c77bfc82c6cf3d07f8aeb3c8a41c78725593
parenta22c4b6a796477efa9802726da5073ae7e2ceef2 (diff)
downloadsoong-391a25d7fa3d4dd316b8263b0fd190aa5f33e4e8.tar.gz
Supporting changes for CFI toolchain features
Mostly exporting variables to Bazel, but also allowlisting a BUILD file. Bug: 251217226 Test: Unit tests Change-Id: Id87015a3cd5d970700c4058ec989bb0c14c36bcb
-rw-r--r--android/allowlists/allowlists.go2
-rw-r--r--cc/config/global.go4
-rw-r--r--cc/linker.go11
-rw-r--r--cc/sanitize.go24
-rw-r--r--tests/lib.sh1
5 files changed, 33 insertions, 9 deletions
diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go
index 33655d02d..db1349b34 100644
--- a/android/allowlists/allowlists.go
+++ b/android/allowlists/allowlists.go
@@ -388,6 +388,8 @@ var (
"external/protobuf":/* recursive = */ false,
"external/python/absl-py":/* recursive = */ true,
+ "external/compiler-rt/lib/cfi":/* recursive = */ false,
+
// this BUILD file is globbed by //external/icu/icu4c/source:icu4c_test_data's "data/**/*".
"external/icu/icu4c/source/data/unidata/norm2":/* recursive = */ false,
diff --git a/cc/config/global.go b/cc/config/global.go
index 4d703e4c3..3eb45773c 100644
--- a/cc/config/global.go
+++ b/cc/config/global.go
@@ -313,6 +313,8 @@ var (
"device/",
"vendor/",
}
+
+ VersionScriptFlagPrefix = "-Wl,--version-script,"
)
// BazelCcToolchainVars generates bzl file content containing variables for
@@ -401,6 +403,8 @@ func init() {
exportedVars.ExportString("ExperimentalCStdVersion", ExperimentalCStdVersion)
exportedVars.ExportString("ExperimentalCppStdVersion", ExperimentalCppStdVersion)
+ exportedVars.ExportString("VersionScriptFlagPrefix", VersionScriptFlagPrefix)
+
// Everything in these lists is a crime against abstraction and dependency tracking.
// Do not add anything to this list.
commonGlobalIncludes := []string{
diff --git a/cc/linker.go b/cc/linker.go
index e49b97d0b..257fe86cf 100644
--- a/cc/linker.go
+++ b/cc/linker.go
@@ -15,11 +15,12 @@
package cc
import (
- "android/soong/android"
- "android/soong/cc/config"
"fmt"
"path/filepath"
+ "android/soong/android"
+ "android/soong/cc/config"
+
"github.com/google/blueprint"
"github.com/google/blueprint/proptools"
)
@@ -542,13 +543,13 @@ func (linker *baseLinker) linkerFlags(ctx ModuleContext, flags Flags) Flags {
ctx.PropertyErrorf("version_script", "Not supported on Darwin")
} else {
flags.Local.LdFlags = append(flags.Local.LdFlags,
- "-Wl,--version-script,"+versionScript.String())
+ config.VersionScriptFlagPrefix+versionScript.String())
flags.LdFlagsDeps = append(flags.LdFlagsDeps, versionScript.Path())
if linker.sanitize.isSanitizerEnabled(cfi) {
- cfiExportsMap := android.PathForSource(ctx, cfiExportsMapPath)
+ cfiExportsMap := android.PathForSource(ctx, cfiExportsMapPath+"/"+cfiExportsMapFilename)
flags.Local.LdFlags = append(flags.Local.LdFlags,
- "-Wl,--version-script,"+cfiExportsMap.String())
+ config.VersionScriptFlagPrefix+cfiExportsMap.String())
flags.LdFlagsDeps = append(flags.LdFlagsDeps, cfiExportsMap)
}
}
diff --git a/cc/sanitize.go b/cc/sanitize.go
index c899cc47e..cc81d0ecb 100644
--- a/cc/sanitize.go
+++ b/cc/sanitize.go
@@ -62,14 +62,18 @@ var (
"-fast-isel=false",
}
- cfiCflags = []string{"-flto", "-fsanitize-cfi-cross-dso",
- "-fsanitize-ignorelist=external/compiler-rt/lib/cfi/cfi_blocklist.txt"}
+ cfiBlocklistPath = "external/compiler-rt/lib/cfi"
+ cfiBlocklistFilename = "cfi_blocklist.txt"
+ cfiCflags = []string{"-flto", "-fsanitize-cfi-cross-dso",
+ "-fsanitize-ignorelist=" + cfiBlocklistPath + "/" + cfiBlocklistFilename}
// -flto and -fvisibility are required by clang when -fsanitize=cfi is
// used, but have no effect on assembly files
cfiAsflags = []string{"-flto", "-fvisibility=default"}
cfiLdflags = []string{"-flto", "-fsanitize-cfi-cross-dso", "-fsanitize=cfi",
"-Wl,-plugin-opt,O1"}
- cfiExportsMapPath = "build/soong/cc/config/cfi_exports.map"
+ cfiExportsMapPath = "build/soong/cc/config"
+ cfiExportsMapFilename = "cfi_exports.map"
+ cfiAssemblySupportFlag = "-fno-sanitize-cfi-canonical-jump-tables"
intOverflowCflags = []string{"-fsanitize-ignorelist=build/soong/cc/config/integer_overflow_blocklist.txt"}
@@ -388,6 +392,18 @@ func init() {
exportedVars.ExportStringListStaticVariable("HostOnlySanitizeFlags", hostOnlySanitizeFlags)
exportedVars.ExportStringList("DeviceOnlySanitizeFlags", deviceOnlySanitizeFlags)
+ // Leave out "-flto" from the slices exported to bazel, as we will use the
+ // dedicated LTO feature for this
+ exportedVars.ExportStringList("CfiCFlags", cfiCflags[1:])
+ exportedVars.ExportStringList("CfiAsFlags", cfiAsflags[1:])
+ exportedVars.ExportStringList("CfiLdFlags", cfiLdflags[1:])
+
+ exportedVars.ExportString("CfiBlocklistPath", cfiBlocklistPath)
+ exportedVars.ExportString("CfiBlocklistFilename", cfiBlocklistFilename)
+ exportedVars.ExportString("CfiExportsMapPath", cfiExportsMapPath)
+ exportedVars.ExportString("CfiExportsMapFilename", cfiExportsMapFilename)
+ exportedVars.ExportString("CfiAssemblySupportFlag", cfiAssemblySupportFlag)
+
android.RegisterMakeVarsProvider(pctx, cfiMakeVarsProvider)
android.RegisterMakeVarsProvider(pctx, hwasanMakeVarsProvider)
}
@@ -810,7 +826,7 @@ func (s *sanitize) flags(ctx ModuleContext, flags Flags) Flags {
flags.Local.CFlags = append(flags.Local.CFlags, cfiCflags...)
flags.Local.AsFlags = append(flags.Local.AsFlags, cfiAsflags...)
if Bool(s.Properties.Sanitize.Config.Cfi_assembly_support) {
- flags.Local.CFlags = append(flags.Local.CFlags, "-fno-sanitize-cfi-canonical-jump-tables")
+ flags.Local.CFlags = append(flags.Local.CFlags, cfiAssemblySupportFlag)
}
// Only append the default visibility flag if -fvisibility has not already been set
// to hidden.
diff --git a/tests/lib.sh b/tests/lib.sh
index 2bcb63089..26608b8f3 100644
--- a/tests/lib.sh
+++ b/tests/lib.sh
@@ -91,6 +91,7 @@ function create_mock_soong {
symlink_directory prebuilts/go
symlink_directory prebuilts/build-tools
symlink_directory prebuilts/clang/host
+ symlink_directory external/compiler-rt
symlink_directory external/go-cmp
symlink_directory external/golang-protobuf
symlink_directory external/starlark-go