Loading cc/androidmk.go +3 −1 Original line number Diff line number Diff line Loading @@ -530,8 +530,10 @@ func (c *snapshotLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entrie entries.SubName = "" if c.sanitizerProperties.CfiEnabled { if c.isSanitizerEnabled(cfi) { entries.SubName += ".cfi" } else if c.isSanitizerEnabled(Hwasan) { entries.SubName += ".hwasan" } entries.SubName += c.baseProperties.Androidmk_suffix Loading cc/sanitize.go +13 −4 Original line number Diff line number Diff line Loading @@ -1171,7 +1171,7 @@ func (s *sanitizerSplitMutator) Split(ctx android.BaseModuleContext) []string { //TODO: When Rust modules have vendor support, enable this path for PlatformSanitizeable // Check if it's a snapshot module supporting sanitizer if ss, ok := c.linker.(snapshotSanitizer); ok && ss.isSanitizerEnabled(s.sanitizer) { if ss, ok := c.linker.(snapshotSanitizer); ok && ss.isSanitizerAvailable(s.sanitizer) { return []string{"", s.sanitizer.variationName()} } else { return []string{""} Loading Loading @@ -1203,7 +1203,7 @@ func (s *sanitizerSplitMutator) OutgoingTransition(ctx android.OutgoingTransitio func (s *sanitizerSplitMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string { if d, ok := ctx.Module().(PlatformSanitizeable); ok { if dm, ok := ctx.Module().(*Module); ok { if ss, ok := dm.linker.(snapshotSanitizer); ok && ss.isSanitizerEnabled(s.sanitizer) { if ss, ok := dm.linker.(snapshotSanitizer); ok && ss.isSanitizerAvailable(s.sanitizer) { return incomingVariation } } Loading Loading @@ -1319,14 +1319,23 @@ func (s *sanitizerSplitMutator) Mutate(mctx android.BottomUpMutatorContext, vari sanitizeable.AddSanitizerDependencies(mctx, s.sanitizer.name()) } } else if c, ok := mctx.Module().(*Module); ok { if ss, ok := c.linker.(snapshotSanitizer); ok && ss.isSanitizerEnabled(s.sanitizer) { if ss, ok := c.linker.(snapshotSanitizer); ok && ss.isSanitizerAvailable(s.sanitizer) { if !ss.isUnsanitizedVariant() { // Snapshot sanitizer may have only one variantion. // Skip exporting the module if it already has a sanitizer variation. c.SetPreventInstall() c.SetHideFromMake() return } c.linker.(snapshotSanitizer).setSanitizerVariation(s.sanitizer, sanitizerVariation) // Export the static lib name to make if c.static() && c.ExportedToMake() { if s.sanitizer == cfi { // use BaseModuleName which is the name for Make. if s.sanitizer == cfi { cfiStaticLibs(mctx.Config()).add(c, c.BaseModuleName()) } else if s.sanitizer == Hwasan { hwasanStaticLibs(mctx.Config()).add(c, c.BaseModuleName()) } } } Loading cc/snapshot_prebuilt.go +27 −10 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package cc // snapshot mutators and snapshot information maps which are also defined in this file. import ( "fmt" "strings" "android/soong/android" Loading Loading @@ -399,8 +400,10 @@ type SnapshotLibraryProperties struct { } type snapshotSanitizer interface { isSanitizerEnabled(t SanitizerType) bool isSanitizerAvailable(t SanitizerType) bool setSanitizerVariation(t SanitizerType, enabled bool) isSanitizerEnabled(t SanitizerType) bool isUnsanitizedVariant() bool } type snapshotLibraryDecorator struct { Loading @@ -408,10 +411,13 @@ type snapshotLibraryDecorator struct { *libraryDecorator properties SnapshotLibraryProperties sanitizerProperties struct { CfiEnabled bool `blueprint:"mutated"` SanitizerVariation SanitizerType `blueprint:"mutated"` // Library flags for cfi variant. Cfi SnapshotLibraryProperties `android:"arch_variant"` // Library flags for hwasan variant. Hwasan SnapshotLibraryProperties `android:"arch_variant"` } } Loading Loading @@ -450,8 +456,10 @@ func (p *snapshotLibraryDecorator) link(ctx ModuleContext, flags Flags, deps Pat return p.libraryDecorator.link(ctx, flags, deps, objs) } if p.sanitizerProperties.CfiEnabled { if p.isSanitizerEnabled(cfi) { p.properties = p.sanitizerProperties.Cfi } else if p.isSanitizerEnabled(Hwasan) { p.properties = p.sanitizerProperties.Hwasan } if !p.MatchesWithDevice(ctx.DeviceConfig()) { Loading Loading @@ -514,25 +522,34 @@ func (p *snapshotLibraryDecorator) nativeCoverage() bool { return false } func (p *snapshotLibraryDecorator) isSanitizerEnabled(t SanitizerType) bool { func (p *snapshotLibraryDecorator) isSanitizerAvailable(t SanitizerType) bool { switch t { case cfi: return p.sanitizerProperties.Cfi.Src != nil case Hwasan: return p.sanitizerProperties.Hwasan.Src != nil default: return false } } func (p *snapshotLibraryDecorator) setSanitizerVariation(t SanitizerType, enabled bool) { if !enabled { if !enabled || p.isSanitizerEnabled(t) { return } switch t { case cfi: p.sanitizerProperties.CfiEnabled = true default: return if !p.isUnsanitizedVariant() { panic(fmt.Errorf("snapshot Sanitizer must be one of Cfi or Hwasan but not both")) } p.sanitizerProperties.SanitizerVariation = t } func (p *snapshotLibraryDecorator) isSanitizerEnabled(t SanitizerType) bool { return p.sanitizerProperties.SanitizerVariation == t } func (p *snapshotLibraryDecorator) isUnsanitizedVariant() bool { return !p.isSanitizerEnabled(Asan) && !p.isSanitizerEnabled(Hwasan) } func snapshotLibraryFactory(image SnapshotImage, moduleSuffix string) (*Module, *snapshotLibraryDecorator) { Loading cc/vendor_snapshot_test.go +17 −2 Original line number Diff line number Diff line Loading @@ -1053,6 +1053,7 @@ func TestVendorSnapshotSanitizer(t *testing.T) { }, }, } vendor_snapshot_static { name: "libsnapshot", vendor: true, Loading @@ -1063,7 +1064,10 @@ func TestVendorSnapshotSanitizer(t *testing.T) { src: "libsnapshot.a", cfi: { src: "libsnapshot.cfi.a", } }, hwasan: { src: "libsnapshot.hwasan.a", }, }, }, } Loading Loading @@ -1098,6 +1102,7 @@ func TestVendorSnapshotSanitizer(t *testing.T) { "vendor/libc++demangle.a": nil, "vendor/libsnapshot.a": nil, "vendor/libsnapshot.cfi.a": nil, "vendor/libsnapshot.hwasan.a": nil, "vendor/note_memtag_heap_sync.a": nil, } Loading @@ -1106,15 +1111,25 @@ func TestVendorSnapshotSanitizer(t *testing.T) { config.TestProductVariables.Platform_vndk_version = StringPtr("29") ctx := testCcWithConfig(t, config) // Check non-cfi and cfi variant. // Check non-cfi, cfi and hwasan variant. staticVariant := "android_vendor.28_arm64_armv8-a_static" staticCfiVariant := "android_vendor.28_arm64_armv8-a_static_cfi" staticHwasanVariant := "android_vendor.28_arm64_armv8-a_static_hwasan" staticHwasanCfiVariant := "android_vendor.28_arm64_armv8-a_static_hwasan_cfi" staticModule := ctx.ModuleForTests("libsnapshot.vendor_static.28.arm64", staticVariant).Module().(*Module) assertString(t, staticModule.outputFile.Path().Base(), "libsnapshot.a") staticCfiModule := ctx.ModuleForTests("libsnapshot.vendor_static.28.arm64", staticCfiVariant).Module().(*Module) assertString(t, staticCfiModule.outputFile.Path().Base(), "libsnapshot.cfi.a") staticHwasanModule := ctx.ModuleForTests("libsnapshot.vendor_static.28.arm64", staticHwasanVariant).Module().(*Module) assertString(t, staticHwasanModule.outputFile.Path().Base(), "libsnapshot.hwasan.a") staticHwasanCfiModule := ctx.ModuleForTests("libsnapshot.vendor_static.28.arm64", staticHwasanCfiVariant).Module().(*Module) if !staticHwasanCfiModule.HiddenFromMake() || !staticHwasanCfiModule.PreventInstall() { t.Errorf("Hwasan and Cfi cannot enabled at the same time.") } } func TestVendorSnapshotExclude(t *testing.T) { Loading Loading
cc/androidmk.go +3 −1 Original line number Diff line number Diff line Loading @@ -530,8 +530,10 @@ func (c *snapshotLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entrie entries.SubName = "" if c.sanitizerProperties.CfiEnabled { if c.isSanitizerEnabled(cfi) { entries.SubName += ".cfi" } else if c.isSanitizerEnabled(Hwasan) { entries.SubName += ".hwasan" } entries.SubName += c.baseProperties.Androidmk_suffix Loading
cc/sanitize.go +13 −4 Original line number Diff line number Diff line Loading @@ -1171,7 +1171,7 @@ func (s *sanitizerSplitMutator) Split(ctx android.BaseModuleContext) []string { //TODO: When Rust modules have vendor support, enable this path for PlatformSanitizeable // Check if it's a snapshot module supporting sanitizer if ss, ok := c.linker.(snapshotSanitizer); ok && ss.isSanitizerEnabled(s.sanitizer) { if ss, ok := c.linker.(snapshotSanitizer); ok && ss.isSanitizerAvailable(s.sanitizer) { return []string{"", s.sanitizer.variationName()} } else { return []string{""} Loading Loading @@ -1203,7 +1203,7 @@ func (s *sanitizerSplitMutator) OutgoingTransition(ctx android.OutgoingTransitio func (s *sanitizerSplitMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string { if d, ok := ctx.Module().(PlatformSanitizeable); ok { if dm, ok := ctx.Module().(*Module); ok { if ss, ok := dm.linker.(snapshotSanitizer); ok && ss.isSanitizerEnabled(s.sanitizer) { if ss, ok := dm.linker.(snapshotSanitizer); ok && ss.isSanitizerAvailable(s.sanitizer) { return incomingVariation } } Loading Loading @@ -1319,14 +1319,23 @@ func (s *sanitizerSplitMutator) Mutate(mctx android.BottomUpMutatorContext, vari sanitizeable.AddSanitizerDependencies(mctx, s.sanitizer.name()) } } else if c, ok := mctx.Module().(*Module); ok { if ss, ok := c.linker.(snapshotSanitizer); ok && ss.isSanitizerEnabled(s.sanitizer) { if ss, ok := c.linker.(snapshotSanitizer); ok && ss.isSanitizerAvailable(s.sanitizer) { if !ss.isUnsanitizedVariant() { // Snapshot sanitizer may have only one variantion. // Skip exporting the module if it already has a sanitizer variation. c.SetPreventInstall() c.SetHideFromMake() return } c.linker.(snapshotSanitizer).setSanitizerVariation(s.sanitizer, sanitizerVariation) // Export the static lib name to make if c.static() && c.ExportedToMake() { if s.sanitizer == cfi { // use BaseModuleName which is the name for Make. if s.sanitizer == cfi { cfiStaticLibs(mctx.Config()).add(c, c.BaseModuleName()) } else if s.sanitizer == Hwasan { hwasanStaticLibs(mctx.Config()).add(c, c.BaseModuleName()) } } } Loading
cc/snapshot_prebuilt.go +27 −10 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package cc // snapshot mutators and snapshot information maps which are also defined in this file. import ( "fmt" "strings" "android/soong/android" Loading Loading @@ -399,8 +400,10 @@ type SnapshotLibraryProperties struct { } type snapshotSanitizer interface { isSanitizerEnabled(t SanitizerType) bool isSanitizerAvailable(t SanitizerType) bool setSanitizerVariation(t SanitizerType, enabled bool) isSanitizerEnabled(t SanitizerType) bool isUnsanitizedVariant() bool } type snapshotLibraryDecorator struct { Loading @@ -408,10 +411,13 @@ type snapshotLibraryDecorator struct { *libraryDecorator properties SnapshotLibraryProperties sanitizerProperties struct { CfiEnabled bool `blueprint:"mutated"` SanitizerVariation SanitizerType `blueprint:"mutated"` // Library flags for cfi variant. Cfi SnapshotLibraryProperties `android:"arch_variant"` // Library flags for hwasan variant. Hwasan SnapshotLibraryProperties `android:"arch_variant"` } } Loading Loading @@ -450,8 +456,10 @@ func (p *snapshotLibraryDecorator) link(ctx ModuleContext, flags Flags, deps Pat return p.libraryDecorator.link(ctx, flags, deps, objs) } if p.sanitizerProperties.CfiEnabled { if p.isSanitizerEnabled(cfi) { p.properties = p.sanitizerProperties.Cfi } else if p.isSanitizerEnabled(Hwasan) { p.properties = p.sanitizerProperties.Hwasan } if !p.MatchesWithDevice(ctx.DeviceConfig()) { Loading Loading @@ -514,25 +522,34 @@ func (p *snapshotLibraryDecorator) nativeCoverage() bool { return false } func (p *snapshotLibraryDecorator) isSanitizerEnabled(t SanitizerType) bool { func (p *snapshotLibraryDecorator) isSanitizerAvailable(t SanitizerType) bool { switch t { case cfi: return p.sanitizerProperties.Cfi.Src != nil case Hwasan: return p.sanitizerProperties.Hwasan.Src != nil default: return false } } func (p *snapshotLibraryDecorator) setSanitizerVariation(t SanitizerType, enabled bool) { if !enabled { if !enabled || p.isSanitizerEnabled(t) { return } switch t { case cfi: p.sanitizerProperties.CfiEnabled = true default: return if !p.isUnsanitizedVariant() { panic(fmt.Errorf("snapshot Sanitizer must be one of Cfi or Hwasan but not both")) } p.sanitizerProperties.SanitizerVariation = t } func (p *snapshotLibraryDecorator) isSanitizerEnabled(t SanitizerType) bool { return p.sanitizerProperties.SanitizerVariation == t } func (p *snapshotLibraryDecorator) isUnsanitizedVariant() bool { return !p.isSanitizerEnabled(Asan) && !p.isSanitizerEnabled(Hwasan) } func snapshotLibraryFactory(image SnapshotImage, moduleSuffix string) (*Module, *snapshotLibraryDecorator) { Loading
cc/vendor_snapshot_test.go +17 −2 Original line number Diff line number Diff line Loading @@ -1053,6 +1053,7 @@ func TestVendorSnapshotSanitizer(t *testing.T) { }, }, } vendor_snapshot_static { name: "libsnapshot", vendor: true, Loading @@ -1063,7 +1064,10 @@ func TestVendorSnapshotSanitizer(t *testing.T) { src: "libsnapshot.a", cfi: { src: "libsnapshot.cfi.a", } }, hwasan: { src: "libsnapshot.hwasan.a", }, }, }, } Loading Loading @@ -1098,6 +1102,7 @@ func TestVendorSnapshotSanitizer(t *testing.T) { "vendor/libc++demangle.a": nil, "vendor/libsnapshot.a": nil, "vendor/libsnapshot.cfi.a": nil, "vendor/libsnapshot.hwasan.a": nil, "vendor/note_memtag_heap_sync.a": nil, } Loading @@ -1106,15 +1111,25 @@ func TestVendorSnapshotSanitizer(t *testing.T) { config.TestProductVariables.Platform_vndk_version = StringPtr("29") ctx := testCcWithConfig(t, config) // Check non-cfi and cfi variant. // Check non-cfi, cfi and hwasan variant. staticVariant := "android_vendor.28_arm64_armv8-a_static" staticCfiVariant := "android_vendor.28_arm64_armv8-a_static_cfi" staticHwasanVariant := "android_vendor.28_arm64_armv8-a_static_hwasan" staticHwasanCfiVariant := "android_vendor.28_arm64_armv8-a_static_hwasan_cfi" staticModule := ctx.ModuleForTests("libsnapshot.vendor_static.28.arm64", staticVariant).Module().(*Module) assertString(t, staticModule.outputFile.Path().Base(), "libsnapshot.a") staticCfiModule := ctx.ModuleForTests("libsnapshot.vendor_static.28.arm64", staticCfiVariant).Module().(*Module) assertString(t, staticCfiModule.outputFile.Path().Base(), "libsnapshot.cfi.a") staticHwasanModule := ctx.ModuleForTests("libsnapshot.vendor_static.28.arm64", staticHwasanVariant).Module().(*Module) assertString(t, staticHwasanModule.outputFile.Path().Base(), "libsnapshot.hwasan.a") staticHwasanCfiModule := ctx.ModuleForTests("libsnapshot.vendor_static.28.arm64", staticHwasanCfiVariant).Module().(*Module) if !staticHwasanCfiModule.HiddenFromMake() || !staticHwasanCfiModule.PreventInstall() { t.Errorf("Hwasan and Cfi cannot enabled at the same time.") } } func TestVendorSnapshotExclude(t *testing.T) { Loading