aboutsummaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2016-05-03 18:02:42 -0700
committerColin Cross <ccross@android.com>2016-05-03 18:02:42 -0700
commit30d5f514dd1b43366440d6aff0b53124de5dd7b5 (patch)
tree521d35f648aa4142cfa9b46f76e5e88a1953c919 /cc
parentb8ecdfe0398c4d43178b433bea2d6c9d0c4fd509 (diff)
downloadbuild_soong-30d5f514dd1b43366440d6aff0b53124de5dd7b5.tar.gz
build_soong-30d5f514dd1b43366440d6aff0b53124de5dd7b5.tar.bz2
build_soong-30d5f514dd1b43366440d6aff0b53124de5dd7b5.zip
Support sanitizer builds inside make
Make expects libraries built with address sanitizer to be installed into /data, and can't handle multiple variants of modules. Change-Id: Ice575ff6f0788a88f296e7b3ee521a2b9771f55f
Diffstat (limited to 'cc')
-rw-r--r--cc/androidmk.go1
-rw-r--r--cc/cc.go12
-rw-r--r--cc/sanitize.go29
3 files changed, 32 insertions, 10 deletions
diff --git a/cc/androidmk.go b/cc/androidmk.go
index 5b160c63..53c05d4d 100644
--- a/cc/androidmk.go
+++ b/cc/androidmk.go
@@ -26,6 +26,7 @@ import (
func (c *Module) AndroidMk() (ret common.AndroidMkData, err error) {
ret.OutputFile = c.outputFile
ret.Extra = append(ret.Extra, func(w io.Writer, outputFile common.Path) (err error) {
+ fmt.Fprintln(w, "LOCAL_SANITIZE := never")
if len(c.Properties.AndroidMkSharedLibs) > 0 {
fmt.Fprintln(w, "LOCAL_SHARED_LIBRARIES := "+strings.Join(c.Properties.AndroidMkSharedLibs, " "))
}
diff --git a/cc/cc.go b/cc/cc.go
index 1a8ba3b1..f740ebc8 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -1482,7 +1482,7 @@ func (library *libraryLinker) flags(ctx ModuleContext, flags Flags) Flags {
flags.Nocrt = Bool(library.Properties.Nocrt)
if !library.static() {
- libName := ctx.ModuleName()
+ libName := ctx.ModuleName() + library.Properties.VariantName
// GCC for Android assumes that -shared means -Bsymbolic, use -Wl,-shared instead
sharedFlag := "-Wl,-shared"
if flags.Clang || ctx.Host() {
@@ -1663,7 +1663,8 @@ func (library *libraryLinker) appendVariantName(variant string) {
type libraryInstaller struct {
baseInstaller
- linker *libraryLinker
+ linker *libraryLinker
+ sanitize *sanitize
}
func (library *libraryInstaller) install(ctx ModuleContext, file common.Path) {
@@ -1672,6 +1673,10 @@ func (library *libraryInstaller) install(ctx ModuleContext, file common.Path) {
}
}
+func (library *libraryInstaller) inData() bool {
+ return library.baseInstaller.inData() || library.sanitize.inData()
+}
+
func NewLibrary(hod common.HostOrDeviceSupported, shared, static bool) *Module {
module := newModule(hod, common.MultilibBoth)
@@ -1688,7 +1693,8 @@ func NewLibrary(hod common.HostOrDeviceSupported, shared, static bool) *Module {
dir: "lib",
dir64: "lib64",
},
- linker: linker,
+ linker: linker,
+ sanitize: module.sanitize,
}
return module
diff --git a/cc/sanitize.go b/cc/sanitize.go
index 676d5b37..670443bf 100644
--- a/cc/sanitize.go
+++ b/cc/sanitize.go
@@ -69,6 +69,7 @@ type SanitizeProperties struct {
SanitizerEnabled bool `blueprint:"mutated"`
SanitizeDep bool `blueprint:"mutated"`
+ InData bool `blueprint:"mutated"`
}
type sanitize struct {
@@ -266,6 +267,10 @@ func (sanitize *sanitize) flags(ctx ModuleContext, flags Flags) Flags {
return flags
}
+func (sanitize *sanitize) inData() bool {
+ return sanitize.Properties.InData
+}
+
func (sanitize *sanitize) Sanitizer(t sanitizerType) bool {
if sanitize == nil {
return false
@@ -314,14 +319,24 @@ func sanitizerMutator(t sanitizerType) func(common.AndroidBottomUpMutatorContext
return func(mctx common.AndroidBottomUpMutatorContext) {
if c, ok := mctx.Module().(*Module); ok && c.sanitize != nil {
if d, ok := c.linker.(baseLinkerInterface); ok && d.isDependencyRoot() && c.sanitize.Sanitizer(t) {
- mctx.CreateVariations(t.String())
+ modules := mctx.CreateVariations(t.String())
+ modules[0].(*Module).sanitize.SetSanitizer(t, true)
+ if mctx.AConfig().EmbeddedInMake() {
+ modules[0].(*Module).sanitize.Properties.InData = true
+ }
} else if c.sanitize.Properties.SanitizeDep {
- modules := mctx.CreateVariations("", t.String())
- modules[0].(*Module).sanitize.SetSanitizer(t, false)
- modules[1].(*Module).sanitize.SetSanitizer(t, true)
- modules[1].(*Module).appendVariantName("_" + t.String())
- modules[0].(*Module).sanitize.Properties.SanitizeDep = false
- modules[1].(*Module).sanitize.Properties.SanitizeDep = false
+ if mctx.AConfig().EmbeddedInMake() {
+ modules := mctx.CreateVariations(t.String())
+ modules[0].(*Module).sanitize.SetSanitizer(t, true)
+ modules[0].(*Module).sanitize.Properties.InData = true
+ } else {
+ modules := mctx.CreateVariations("", t.String())
+ modules[0].(*Module).sanitize.SetSanitizer(t, false)
+ modules[1].(*Module).sanitize.SetSanitizer(t, true)
+ modules[1].(*Module).appendVariantName("_" + t.String())
+ modules[0].(*Module).sanitize.Properties.SanitizeDep = false
+ modules[1].(*Module).sanitize.Properties.SanitizeDep = false
+ }
}
c.sanitize.Properties.SanitizeDep = false
}