diff --git a/cc/x86_darwin_host.go b/cc/x86_darwin_host.go
new file mode 100644
index 0000000..bed977d
--- /dev/null
+++ b/cc/x86_darwin_host.go
@@ -0,0 +1,213 @@
+package cc
+
+import (
+	"runtime"
+	"strings"
+
+	"android/soong/common"
+)
+
+var (
+	darwinCflags = []string{
+		"-fno-exceptions", // from build/core/combo/select.mk
+		"-Wno-multichar",  // from build/core/combo/select.mk
+
+		"-fPIC",
+		"-funwind-tables",
+		"-include ${SrcDir}/build/core/combo/include/arch/darwin-x86/AndroidConfig.h",
+
+		// Workaround differences in inttypes.h between host and target.
+		//See bug 12708004.
+		"-D__STDC_FORMAT_MACROS",
+		"-D__STDC_CONSTANT_MACROS",
+
+		// HOST_RELEASE_CFLAGS
+		"-O2", // from build/core/combo/select.mk
+		"-g",  // from build/core/combo/select.mk
+		"-fno-strict-aliasing", // from build/core/combo/select.mk
+		"-isysroot ${macSdkRoot}",
+		"-mmacosx-version-min=10.9",
+		"-DMACOSX_DEPLOYMENT_TARGET=10.9",
+	}
+
+	darwinCppflags = []string{
+		"-isystem ${macSdkPath}/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1",
+	}
+
+	darwinLdflags = []string{
+		"-isysroot ${macSdkRoot}",
+		"-Wl,-syslibroot,${macSdkRoot}",
+		"-mmacosx-version-min=10.9",
+	}
+
+	// Extended cflags
+	darwinX86Cflags = []string{
+		"-m32",
+	}
+
+	darwinX8664Cflags = []string{
+		"-m64",
+	}
+
+	darwinX86Ldflags = []string{
+		"-m32",
+		"-Wl,-rpath,@loader_path/../lib",
+	}
+
+	darwinX8664Ldflags = []string{
+		"-m64",
+		"-Wl,-rpath,@loader_path/../lib64",
+	}
+
+	darwinClangCflags = append([]string{
+		"-integrated-as",
+	}, clangFilterUnknownCflags(darwinCflags)...)
+
+	darwinClangLdflags = clangFilterUnknownCflags(darwinLdflags)
+
+	darwinX86ClangLdflags = clangFilterUnknownCflags(darwinX86Ldflags)
+
+	darwinX8664ClangLdflags = clangFilterUnknownCflags(darwinX8664Ldflags)
+
+	darwinClangCppflags = clangFilterUnknownCflags(darwinCppflags)
+)
+
+func init() {
+	pctx.StaticVariable("macSdkPath", "/Applications/Xcode.app/Contents/Developer")
+	pctx.StaticVariable("macSdkRoot", "${macSdkPath}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk")
+
+	pctx.StaticVariable("darwinGccVersion", "4.2.1")
+	pctx.StaticVariable("darwinGccRoot",
+		"${SrcDir}/prebuilts/gcc/${HostPrebuiltTag}/host/i686-apple-darwin-${darwinGccVersion}")
+
+	pctx.StaticVariable("darwinGccTriple", "i686-apple-darwin11")
+
+	pctx.StaticVariable("darwinCflags", strings.Join(darwinCflags, " "))
+	pctx.StaticVariable("darwinLdflags", strings.Join(darwinLdflags, " "))
+	pctx.StaticVariable("darwinCppflags", strings.Join(darwinCppflags, " "))
+
+	pctx.StaticVariable("darwinClangCflags", strings.Join(darwinClangCflags, " "))
+	pctx.StaticVariable("darwinClangLdflags", strings.Join(darwinClangLdflags, " "))
+	pctx.StaticVariable("darwinClangCppflags", strings.Join(darwinClangCppflags, " "))
+
+	// Extended cflags
+	pctx.StaticVariable("darwinX86Cflags", strings.Join(darwinX86Cflags, " "))
+	pctx.StaticVariable("darwinX8664Cflags", strings.Join(darwinX8664Cflags, " "))
+	pctx.StaticVariable("darwinX86Ldflags", strings.Join(darwinX86Ldflags, " "))
+	pctx.StaticVariable("darwinX8664Ldflags", strings.Join(darwinX8664Ldflags, " "))
+
+	pctx.StaticVariable("darwinX86ClangCflags",
+		strings.Join(clangFilterUnknownCflags(darwinX86Cflags), " "))
+	pctx.StaticVariable("darwinX8664ClangCflags",
+		strings.Join(clangFilterUnknownCflags(darwinX8664Cflags), " "))
+	pctx.StaticVariable("darwinX86ClangLdflags", strings.Join(darwinX86ClangLdflags, " "))
+	pctx.StaticVariable("darwinX8664ClangLdflags", strings.Join(darwinX8664ClangLdflags, " "))
+}
+
+type toolchainDarwin struct {
+	cFlags, ldFlags string
+}
+
+type toolchainDarwinX86 struct {
+	toolchain32Bit
+	toolchainDarwin
+}
+
+type toolchainDarwinX8664 struct {
+	toolchain64Bit
+	toolchainDarwin
+}
+
+func (t *toolchainDarwinX86) Name() string {
+	return "x86"
+}
+
+func (t *toolchainDarwinX8664) Name() string {
+	return "x86_64"
+}
+
+func (t *toolchainDarwin) GccRoot() string {
+	return "${darwinGccRoot}"
+}
+
+func (t *toolchainDarwin) GccTriple() string {
+	return "${darwinGccTriple}"
+}
+
+func (t *toolchainDarwin) GccVersion() string {
+	return "${darwinGccVersion}"
+}
+
+func (t *toolchainDarwin) Cflags() string {
+	return "${darwinCflags} ${darwinX86Cflags}"
+}
+
+func (t *toolchainDarwinX8664) Cflags() string {
+	return "${darwinCflags} ${darwinX8664Cflags}"
+}
+
+func (t *toolchainDarwin) Cppflags() string {
+	return "${darwinCppflags}"
+}
+
+func (t *toolchainDarwinX86) Ldflags() string {
+	return "${darwinLdflags} ${darwinX86Ldflags}"
+}
+
+func (t *toolchainDarwinX8664) Ldflags() string {
+	return "${darwinLdflags} ${darwinX8664Ldflags}"
+}
+
+func (t *toolchainDarwin) IncludeFlags() string {
+	return ""
+}
+
+func (t *toolchainDarwinX86) ClangTriple() string {
+	return "i686-darwin-gnu"
+}
+
+func (t *toolchainDarwinX86) ClangCflags() string {
+	return "${darwinClangCflags} ${darwinX86ClangCflags}"
+}
+
+func (t *toolchainDarwinX86) ClangCppflags() string {
+	return "${darwinClangCppflags}"
+}
+
+func (t *toolchainDarwinX8664) ClangTriple() string {
+	return "x86_64-darwin-gnu"
+}
+
+func (t *toolchainDarwinX8664) ClangCflags() string {
+	return "${darwinClangCflags} ${darwinX8664ClangCflags}"
+}
+
+func (t *toolchainDarwinX8664) ClangCppflags() string {
+	return "${darwinClangCppflags}"
+}
+
+func (t *toolchainDarwinX86) ClangLdflags() string {
+	return "${darwinClangLdflags} ${darwinX86ClangLdflags}"
+}
+
+func (t *toolchainDarwinX8664) ClangLdflags() string {
+	return "${darwinClangLdflags} ${darwinX8664ClangLdflags}"
+}
+
+var toolchainDarwinX86Singleton Toolchain = &toolchainDarwinX86{}
+var toolchainDarwinX8664Singleton Toolchain = &toolchainDarwinX8664{}
+
+func darwinX86ToolchainFactory(archVariant string, cpuVariant string) Toolchain {
+	return toolchainDarwinX86Singleton
+}
+
+func darwinX8664ToolchainFactory(archVariant string, cpuVariant string) Toolchain {
+	return toolchainDarwinX8664Singleton
+}
+
+func init() {
+	if runtime.GOOS == "darwin" {
+		registerToolchainFactory(common.Host, common.X86, darwinX86ToolchainFactory)
+		registerToolchainFactory(common.Host, common.X86_64, darwinX8664ToolchainFactory)
+	}
+}
