Dedup version-script handling code.

This is common to binaries and libraries, so move it from library.link
and binary.link to baseLinker.linkerFlags and baseLinker.linkerDeps.

Test: make checkbuild
Bug: None
Change-Id: I5fb24118e601673ae0713a6adc773a1565749be8
diff --git a/cc/binary.go b/cc/binary.go
index 82e1941..be79032 100644
--- a/cc/binary.go
+++ b/cc/binary.go
@@ -31,9 +31,6 @@
 	// if set, add an extra objcopy --prefix-symbols= step
 	Prefix_symbols *string
 
-	// local file name to pass to the linker as --version_script
-	Version_script *string `android:"arch_variant"`
-
 	// if set, install a symlink to the preferred architecture
 	Symlink_preferred_arch *bool
 
@@ -163,8 +160,6 @@
 			"from static libs or set static_executable: true")
 	}
 
-	android.ExtractSourceDeps(ctx, binary.Properties.Version_script)
-
 	return deps
 }
 
@@ -175,7 +170,7 @@
 func NewBinary(hod android.HostOrDeviceSupported) (*Module, *binaryDecorator) {
 	module := newModule(hod, android.MultilibFirst)
 	binary := &binaryDecorator{
-		baseLinker:    NewBaseLinker(),
+		baseLinker:    NewBaseLinker(module.sanitize),
 		baseInstaller: NewBaseInstaller("bin", "", InstallInSystem),
 	}
 	module.compiler = NewBaseCompiler()
@@ -281,7 +276,6 @@
 func (binary *binaryDecorator) link(ctx ModuleContext,
 	flags Flags, deps PathDeps, objs Objects) android.Path {
 
-	versionScript := ctx.ExpandOptionalSource(binary.Properties.Version_script, "version_script")
 	fileName := binary.getStem(ctx) + flags.Toolchain.ExecutableSuffix()
 	outputFile := android.PathForModuleOut(ctx, fileName)
 	ret := outputFile
@@ -291,15 +285,6 @@
 	sharedLibs := deps.SharedLibs
 	sharedLibs = append(sharedLibs, deps.LateSharedLibs...)
 
-	if versionScript.Valid() {
-		if ctx.Darwin() {
-			ctx.PropertyErrorf("version_script", "Not supported on Darwin")
-		} else {
-			flags.LdFlags = append(flags.LdFlags, "-Wl,--version-script,"+versionScript.String())
-			linkerDeps = append(linkerDeps, versionScript.Path())
-		}
-	}
-
 	if deps.LinkerScript.Valid() {
 		flags.LdFlags = append(flags.LdFlags, "-Wl,-T,"+deps.LinkerScript.String())
 		linkerDeps = append(linkerDeps, deps.LinkerScript.Path())
diff --git a/cc/library.go b/cc/library.go
index 5da36dc..147dd8e 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -44,8 +44,6 @@
 		Shared_libs       []string `android:"arch_variant"`
 	} `android:"arch_variant"`
 
-	// local file name to pass to the linker as --version_script
-	Version_script *string `android:"arch_variant"`
 	// local file name to pass to the linker as -unexported_symbols_list
 	Unexported_symbols_list *string `android:"arch_variant"`
 	// local file name to pass to the linker as -force_symbols_not_weak_list
@@ -65,12 +63,6 @@
 		// export headers generated from .proto sources
 		Export_proto_headers *bool
 	}
-	Target struct {
-		Vendor struct {
-			// version script for this vendor variant
-			Version_script *string `android:"arch_variant"`
-		}
-	}
 
 	Static_ndk_lib *bool
 }
@@ -231,8 +223,6 @@
 	// shlib suffix.
 	libName string
 
-	sanitize *sanitize
-
 	sabi *sabi
 
 	// Output archive of gcno coverage information files
@@ -432,7 +422,7 @@
 
 func (library *libraryDecorator) linkerInit(ctx BaseModuleContext) {
 	location := InstallInSystem
-	if library.sanitize.inSanitizerDir() {
+	if library.baseLinker.sanitize.inSanitizerDir() {
 		location = InstallInSanitizerDir
 	}
 	library.baseInstaller.location = location
@@ -483,11 +473,9 @@
 		deps.StaticLibs = removeListFromList(deps.StaticLibs, library.baseLinker.Properties.Target.Recovery.Exclude_static_libs)
 	}
 
-	android.ExtractSourceDeps(ctx, library.Properties.Version_script)
 	android.ExtractSourceDeps(ctx, library.Properties.Unexported_symbols_list)
 	android.ExtractSourceDeps(ctx, library.Properties.Force_symbols_not_weak_list)
 	android.ExtractSourceDeps(ctx, library.Properties.Force_symbols_weak_list)
-	android.ExtractSourceDeps(ctx, library.Properties.Target.Vendor.Version_script)
 
 	return deps
 }
@@ -526,23 +514,10 @@
 	var linkerDeps android.Paths
 	linkerDeps = append(linkerDeps, flags.LdFlagsDeps...)
 
-	versionScript := ctx.ExpandOptionalSource(library.Properties.Version_script, "version_script")
 	unexportedSymbols := ctx.ExpandOptionalSource(library.Properties.Unexported_symbols_list, "unexported_symbols_list")
 	forceNotWeakSymbols := ctx.ExpandOptionalSource(library.Properties.Force_symbols_not_weak_list, "force_symbols_not_weak_list")
 	forceWeakSymbols := ctx.ExpandOptionalSource(library.Properties.Force_symbols_weak_list, "force_symbols_weak_list")
-	if ctx.useVndk() && library.Properties.Target.Vendor.Version_script != nil {
-		versionScript = ctx.ExpandOptionalSource(library.Properties.Target.Vendor.Version_script, "target.vendor.version_script")
-	}
 	if !ctx.Darwin() {
-		if versionScript.Valid() {
-			flags.LdFlags = append(flags.LdFlags, "-Wl,--version-script,"+versionScript.String())
-			linkerDeps = append(linkerDeps, versionScript.Path())
-			if library.sanitize.isSanitizerEnabled(cfi) {
-				cfiExportsMap := android.PathForSource(ctx, cfiExportsMapPath)
-				flags.LdFlags = append(flags.LdFlags, "-Wl,--version-script,"+cfiExportsMap.String())
-				linkerDeps = append(linkerDeps, cfiExportsMap)
-			}
-		}
 		if unexportedSymbols.Valid() {
 			ctx.PropertyErrorf("unexported_symbols_list", "Only supported on Darwin")
 		}
@@ -553,9 +528,6 @@
 			ctx.PropertyErrorf("force_symbols_weak_list", "Only supported on Darwin")
 		}
 	} else {
-		if versionScript.Valid() {
-			ctx.PropertyErrorf("version_script", "Not supported on Darwin")
-		}
 		if unexportedSymbols.Valid() {
 			flags.LdFlags = append(flags.LdFlags, "-Wl,-unexported_symbols_list,"+unexportedSymbols.String())
 			linkerDeps = append(linkerDeps, unexportedSymbols.Path())
@@ -768,7 +740,7 @@
 
 	if Bool(library.Properties.Static_ndk_lib) && library.static() &&
 		!ctx.useVndk() && !ctx.inRecovery() && ctx.Device() &&
-		library.sanitize.isUnsanitizedVariant() {
+		library.baseLinker.sanitize.isUnsanitizedVariant() {
 		installPath := getNdkSysrootBase(ctx).Join(
 			ctx, "usr/lib", config.NDKTriple(ctx.toolchain()), file.Base())
 
@@ -827,9 +799,8 @@
 			BuildStatic: true,
 		},
 		baseCompiler:  NewBaseCompiler(),
-		baseLinker:    NewBaseLinker(),
+		baseLinker:    NewBaseLinker(module.sanitize),
 		baseInstaller: NewBaseInstaller("lib", "lib64", InstallInSystem),
-		sanitize:      module.sanitize,
 		sabi:          module.sabi,
 	}
 
diff --git a/cc/linker.go b/cc/linker.go
index 6bbf015..2972006 100644
--- a/cc/linker.go
+++ b/cc/linker.go
@@ -127,10 +127,20 @@
 type MoreBaseLinkerProperties struct {
 	// Generate compact dynamic relocation table, default true.
 	Pack_relocations *bool `android:"arch_variant"`
+
+	// local file name to pass to the linker as --version_script
+	Version_script *string `android:"arch_variant"`
+
+	Target struct {
+		Vendor struct {
+			// version script for this vendor variant
+			Version_script *string `android:"arch_variant"`
+		}
+	}
 }
 
-func NewBaseLinker() *baseLinker {
-	return &baseLinker{}
+func NewBaseLinker(sanitize *sanitize) *baseLinker {
+	return &baseLinker{sanitize: sanitize}
 }
 
 // baseLinker provides support for shared_libs, static_libs, and whole_static_libs properties
@@ -140,6 +150,8 @@
 	dynamicProperties struct {
 		RunPaths []string `blueprint:"mutated"`
 	}
+
+	sanitize *sanitize
 }
 
 func (linker *baseLinker) appendLdflags(flags []string) {
@@ -158,7 +170,7 @@
 	return []interface{}{&linker.Properties, &linker.MoreProperties, &linker.dynamicProperties}
 }
 
-func (linker *baseLinker) linkerDeps(ctx BaseModuleContext, deps Deps) Deps {
+func (linker *baseLinker) linkerDeps(ctx DepsContext, deps Deps) Deps {
 	deps.WholeStaticLibs = append(deps.WholeStaticLibs, linker.Properties.Whole_static_libs...)
 	deps.HeaderLibs = append(deps.HeaderLibs, linker.Properties.Header_libs...)
 	deps.StaticLibs = append(deps.StaticLibs, linker.Properties.Static_libs...)
@@ -237,6 +249,10 @@
 		deps.LateStaticLibs = append(deps.LateStaticLibs, "libwinpthread")
 	}
 
+	android.ExtractSourceDeps(ctx, linker.MoreProperties.Version_script)
+	android.ExtractSourceDeps(ctx,
+		linker.MoreProperties.Target.Vendor.Version_script)
+
 	return deps
 }
 
@@ -345,6 +361,32 @@
 		flags.GroupStaticLibs = true
 	}
 
+	versionScript := ctx.ExpandOptionalSource(
+		linker.MoreProperties.Version_script, "version_script")
+
+	if ctx.useVndk() && linker.MoreProperties.Target.Vendor.Version_script != nil {
+		versionScript = ctx.ExpandOptionalSource(
+			linker.MoreProperties.Target.Vendor.Version_script,
+			"target.vendor.version_script")
+	}
+
+	if versionScript.Valid() {
+		if ctx.Darwin() {
+			ctx.PropertyErrorf("version_script", "Not supported on Darwin")
+		} else {
+			flags.LdFlags = append(flags.LdFlags,
+				"-Wl,--version-script,"+versionScript.String())
+			flags.LdFlagsDeps = append(flags.LdFlagsDeps, versionScript.Path())
+
+			if linker.sanitize.isSanitizerEnabled(cfi) {
+				cfiExportsMap := android.PathForSource(ctx, cfiExportsMapPath)
+				flags.LdFlags = append(flags.LdFlags,
+					"-Wl,--version-script,"+cfiExportsMap.String())
+				flags.LdFlagsDeps = append(flags.LdFlagsDeps, cfiExportsMap)
+			}
+		}
+	}
+
 	return flags
 }
 
diff --git a/cc/ndk_prebuilt.go b/cc/ndk_prebuilt.go
index 4c633c2..258d6bd 100644
--- a/cc/ndk_prebuilt.go
+++ b/cc/ndk_prebuilt.go
@@ -68,7 +68,7 @@
 	module := newBaseModule(android.DeviceSupported, android.MultilibBoth)
 	module.linker = &ndkPrebuiltObjectLinker{
 		objectLinker: objectLinker{
-			baseLinker: NewBaseLinker(),
+			baseLinker: NewBaseLinker(nil),
 		},
 	}
 	module.Properties.HideFromMake = true
diff --git a/cc/object.go b/cc/object.go
index d0f4f20..b5fd835 100644
--- a/cc/object.go
+++ b/cc/object.go
@@ -36,7 +36,7 @@
 func objectFactory() android.Module {
 	module := newBaseModule(android.HostAndDeviceSupported, android.MultilibBoth)
 	module.linker = &objectLinker{
-		baseLinker: NewBaseLinker(),
+		baseLinker: NewBaseLinker(nil),
 	}
 	module.compiler = NewBaseCompiler()
 	return module.Init()