Merge changes from topics 'ndk-libc++-libdl', 'ndk-compiler-rt_extras'

* changes:
  Always link libdl with libc++ for the NDK.
  Use libcompiler-rt_extras with NDK builds.
diff --git a/Android.bp b/Android.bp
index aee9123..0202ea7 100644
--- a/Android.bp
+++ b/Android.bp
@@ -126,6 +126,7 @@
         "cc/check.go",
         "cc/gen.go",
         "cc/makevars.go",
+        "cc/relocation_packer.go",
         "cc/sanitize.go",
         "cc/stl.go",
         "cc/strip.go",
diff --git a/androidmk/cmd/androidmk/android.go b/androidmk/cmd/androidmk/android.go
index 3bda7a9..6646c9d 100644
--- a/androidmk/cmd/androidmk/android.go
+++ b/androidmk/cmd/androidmk/android.go
@@ -70,8 +70,8 @@
 	"LOCAL_NO_CRT":                  {"nocrt", bpparser.BoolType},
 	"LOCAL_ALLOW_UNDEFINED_SYMBOLS": {"allow_undefined_symbols", bpparser.BoolType},
 	"LOCAL_RTTI_FLAG":               {"rtti", bpparser.BoolType},
-
-	"LOCAL_NO_STANDARD_LIBRARIES": {"no_standard_libraries", bpparser.BoolType},
+	"LOCAL_NO_STANDARD_LIBRARIES":   {"no_standard_libraries", bpparser.BoolType},
+	"LOCAL_PACK_MODULE_RELOCATIONS": {"pack_relocations", bpparser.BoolType},
 
 	"LOCAL_EXPORT_PACKAGE_RESOURCES": {"export_package_resources", bpparser.BoolType},
 }
diff --git a/cc/androidmk.go b/cc/androidmk.go
index 831c0fb..f446333 100644
--- a/cc/androidmk.go
+++ b/cc/androidmk.go
@@ -81,6 +81,7 @@
 func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
 	if !library.static() {
 		ctx.subAndroidMk(ret, &library.stripper)
+		ctx.subAndroidMk(ret, &library.relocationPacker)
 	}
 
 	if library.static() {
@@ -129,7 +130,6 @@
 
 	ret.Class = "EXECUTABLES"
 	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) error {
-		fmt.Fprintln(w, "LOCAL_CXX_STL := none")
 		fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
 		if Bool(binary.Properties.Static_executable) {
 			fmt.Fprintln(w, "LOCAL_FORCE_STATIC_EXECUTABLE := true")
@@ -157,7 +157,6 @@
 	ret.Class = "STATIC_LIBRARIES"
 	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) error {
 		fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+outputFile.Ext())
-		fmt.Fprintln(w, "LOCAL_CXX_STL := none")
 		fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
 
 		return nil
@@ -183,6 +182,15 @@
 	})
 }
 
+func (packer *relocationPacker) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
+	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) error {
+		if packer.Properties.PackingRelocations {
+			fmt.Fprintln(w, "LOCAL_PACK_MODULE_RELOCATIONS := true")
+		}
+		return nil
+	})
+}
+
 func (installer *baseInstaller) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
 	ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) error {
 		path := installer.path.RelPathString()
diff --git a/cc/compiler.go b/cc/compiler.go
index 4a7bba9..37dc744 100644
--- a/cc/compiler.go
+++ b/cc/compiler.go
@@ -147,6 +147,7 @@
 		if !ctx.sdk() || ctx.Host() {
 			flags.GlobalFlags = append(flags.GlobalFlags,
 				"${config.CommonGlobalIncludes}",
+				"${config.CommonGlobalSystemIncludes}",
 				tc.IncludeFlags(),
 				"${config.CommonNativehelperInclude}")
 		}
diff --git a/cc/config/global.go b/cc/config/global.go
index f1989a2..5b49bc3 100644
--- a/cc/config/global.go
+++ b/cc/config/global.go
@@ -90,9 +90,11 @@
 	pctx.StaticVariable("CommonClangGlobalCppflags",
 		strings.Join(append(ClangFilterUnknownCflags(commonGlobalCppflags), "${ClangExtraCppflags}"), " "))
 
-	// Everything in this list is a crime against abstraction and dependency tracking.
+	// Everything in these lists is a crime against abstraction and dependency tracking.
 	// Do not add anything to this list.
-	pctx.PrefixedPathsForOptionalSourceVariable("CommonGlobalIncludes", "-isystem ",
+	pctx.PrefixedPathsForOptionalSourceVariable("CommonGlobalIncludes", "-I",
+		[]string{})
+	pctx.PrefixedPathsForOptionalSourceVariable("CommonGlobalSystemIncludes", "-isystem ",
 		[]string{
 			"system/core/include",
 			"system/media/audio/include",
diff --git a/cc/installer.go b/cc/installer.go
index a133bf2..fa8fc32 100644
--- a/cc/installer.go
+++ b/cc/installer.go
@@ -24,7 +24,7 @@
 
 type InstallerProperties struct {
 	// install to a subdirectory of the default install path for the module
-	Relative_install_path string
+	Relative_install_path string `android:"arch_variant"`
 
 	// install symlinks to the module
 	Symlinks []string `android:"arch_variant"`
@@ -50,6 +50,7 @@
 
 	dir      string
 	dir64    string
+	relative string
 	location installLocation
 
 	path android.OutputPath
@@ -69,7 +70,7 @@
 	if !ctx.Host() && !ctx.Arch().Native {
 		subDir = filepath.Join(subDir, ctx.Arch().ArchType.String())
 	}
-	dir := android.PathForModuleInstall(ctx, subDir, installer.Properties.Relative_install_path)
+	dir := android.PathForModuleInstall(ctx, subDir, installer.Properties.Relative_install_path, installer.relative)
 	installer.path = ctx.InstallFile(dir, file)
 	for _, symlink := range installer.Properties.Symlinks {
 		ctx.InstallSymlink(dir, symlink, installer.path)
diff --git a/cc/library.go b/cc/library.go
index 5119c90..cc5ff15 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -151,6 +151,7 @@
 
 	flagExporter
 	stripper
+	relocationPacker
 
 	// If we're used as a whole_static_lib, our missing dependencies need
 	// to be given
@@ -177,7 +178,8 @@
 	return append(props,
 		&library.Properties,
 		&library.flagExporter.Properties,
-		&library.stripper.StripProperties)
+		&library.stripper.StripProperties,
+		&library.relocationPacker.Properties)
 }
 
 func (library *libraryDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags {
@@ -289,6 +291,8 @@
 	library.baseInstaller.location = location
 
 	library.baseLinker.linkerInit(ctx)
+
+	library.relocationPacker.packingInit(ctx)
 }
 
 func (library *libraryDecorator) linkerDeps(ctx BaseModuleContext, deps Deps) Deps {
@@ -386,6 +390,12 @@
 
 	builderFlags := flagsToBuilderFlags(flags)
 
+	if library.relocationPacker.needsPacking(ctx) {
+		packedOutputFile := outputFile
+		outputFile = android.PathForModuleOut(ctx, "unpacked", fileName)
+		library.relocationPacker.pack(ctx, outputFile, packedOutputFile, builderFlags)
+	}
+
 	if library.stripper.needsStrip(ctx) {
 		strippedOutputFile := outputFile
 		outputFile = android.PathForModuleOut(ctx, "unstripped", fileName)
diff --git a/cc/makevars.go b/cc/makevars.go
index 23814c3..ea32121 100644
--- a/cc/makevars.go
+++ b/cc/makevars.go
@@ -17,6 +17,7 @@
 import (
 	"fmt"
 	"path/filepath"
+	"sort"
 	"strings"
 
 	"android/soong/android"
@@ -43,7 +44,7 @@
 	ctx.Strict("GLOBAL_CLANG_CPPFLAGS_NO_OVERRIDE", "")
 	ctx.Strict("NDK_PREBUILT_SHARED_LIBRARIES", strings.Join(ndkPrebuiltSharedLibs, " "))
 
-	includeFlags, err := ctx.Eval("${config.CommonGlobalIncludes}")
+	includeFlags, err := ctx.Eval("${config.CommonGlobalIncludes} ${config.CommonGlobalSystemIncludes}")
 	if err != nil {
 		panic(err)
 	}
@@ -51,6 +52,7 @@
 	ctx.StrictRaw("SRC_HEADERS", strings.Join(includes, " "))
 	ctx.StrictRaw("SRC_SYSTEM_HEADERS", strings.Join(systemIncludes, " "))
 
+	sort.Strings(ndkMigratedLibs)
 	ctx.Strict("NDK_MIGRATED_LIBS", strings.Join(ndkMigratedLibs, " "))
 
 	hostTargets := ctx.Config().Targets[android.Host]
diff --git a/cc/relocation_packer.go b/cc/relocation_packer.go
new file mode 100644
index 0000000..c509f31
--- /dev/null
+++ b/cc/relocation_packer.go
@@ -0,0 +1,84 @@
+// Copyright 2016 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cc
+
+import (
+	"runtime"
+
+	"github.com/google/blueprint"
+
+	"android/soong/android"
+)
+
+func init() {
+	pctx.SourcePathVariable("relocationPackerCmd", "prebuilts/misc/${config.HostPrebuiltTag}/relocation_packer/relocation_packer")
+}
+
+var relocationPackerRule = pctx.AndroidStaticRule("packRelocations",
+	blueprint.RuleParams{
+		Command:     "rm -f $out && cp $in $out && $relocationPackerCmd $out",
+		CommandDeps: []string{"$relocationPackerCmd"},
+		Description: "pack relocations $out",
+	})
+
+type RelocationPackerProperties struct {
+	Pack_relocations *bool `android:"arch_variant"`
+
+	// This will be true even if we're embedded in Make, in which case
+	// we'll defer to make to actually do the packing.
+	PackingRelocations bool `blueprint:"mutated"`
+}
+
+type relocationPacker struct {
+	Properties RelocationPackerProperties
+}
+
+func (p *relocationPacker) packingInit(ctx BaseModuleContext) {
+	enabled := true
+	// Relocation packer isn't available on Darwin yet
+	if runtime.GOOS == "darwin" {
+		enabled = false
+	}
+	if ctx.Target().Os != android.Android {
+		enabled = false
+	}
+	if ctx.AConfig().Getenv("DISABLE_RELOCATION_PACKER") == "true" {
+		enabled = false
+	}
+	if ctx.sdk() {
+		enabled = false
+	}
+	if p.Properties.Pack_relocations != nil &&
+		*p.Properties.Pack_relocations == false {
+		enabled = false
+	}
+
+	p.Properties.PackingRelocations = enabled
+}
+
+func (p *relocationPacker) needsPacking(ctx ModuleContext) bool {
+	if ctx.AConfig().EmbeddedInMake() {
+		return false
+	}
+	return p.Properties.PackingRelocations
+}
+
+func (p *relocationPacker) pack(ctx ModuleContext, in, out android.ModuleOutPath, flags builderFlags) {
+	ctx.ModuleBuild(pctx, android.ModuleBuildParams{
+		Rule:   relocationPackerRule,
+		Output: out,
+		Input:  in,
+	})
+}
diff --git a/cc/test.go b/cc/test.go
index 5418ebf..5a34d1d 100644
--- a/cc/test.go
+++ b/cc/test.go
@@ -26,7 +26,7 @@
 
 type TestProperties struct {
 	// if set, build against the gtest library. Defaults to true.
-	Gtest bool
+	Gtest *bool
 }
 
 type TestBinaryProperties struct {
@@ -116,8 +116,12 @@
 	linker     *baseLinker
 }
 
+func (test *testDecorator) gtest() bool {
+	return test.Properties.Gtest == nil || *test.Properties.Gtest == true
+}
+
 func (test *testDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags {
-	if !test.Properties.Gtest {
+	if !test.gtest() {
 		return flags
 	}
 
@@ -143,7 +147,7 @@
 }
 
 func (test *testDecorator) linkerDeps(ctx BaseModuleContext, deps Deps) Deps {
-	if test.Properties.Gtest {
+	if test.gtest() {
 		if ctx.sdk() && ctx.Device() {
 			switch ctx.selectedStl() {
 			case "ndk_libc++_shared", "ndk_libc++_static":
@@ -208,8 +212,9 @@
 }
 
 func (test *testBinary) install(ctx ModuleContext, file android.Path) {
-	test.binaryDecorator.baseInstaller.dir = filepath.Join("nativetest", ctx.ModuleName())
-	test.binaryDecorator.baseInstaller.dir64 = filepath.Join("nativetest64", ctx.ModuleName())
+	test.binaryDecorator.baseInstaller.dir = "nativetest"
+	test.binaryDecorator.baseInstaller.dir64 = "nativetest64"
+	test.binaryDecorator.baseInstaller.relative = ctx.ModuleName()
 	test.binaryDecorator.baseInstaller.install(ctx, file)
 }
 
@@ -225,7 +230,6 @@
 		binaryDecorator: binary,
 		baseCompiler:    NewBaseCompiler(),
 	}
-	test.testDecorator.Properties.Gtest = true
 	module.compiler = test
 	module.linker = test
 	module.installer = test
@@ -267,7 +271,6 @@
 		},
 		libraryDecorator: library,
 	}
-	test.testDecorator.Properties.Gtest = true
 	module.linker = test
 	return module
 }