Support .asm files for assembly

Test: mmma -j external/libjpeg-turbo
Change-Id: Id192dae5d74ecbf500fc668931c37f9b91d25ca4
diff --git a/cc/builder.go b/cc/builder.go
index a568a29..ee53f41 100644
--- a/cc/builder.go
+++ b/cc/builder.go
@@ -158,6 +158,16 @@
 			Description: "tidy $out",
 		},
 		"cFlags", "tidyFlags")
+
+	yasmCmd = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm")
+
+	yasm = pctx.AndroidStaticRule("yasm",
+		blueprint.RuleParams{
+			Command:     "$yasmCmd $asFlags -o $out $in",
+			CommandDeps: []string{"$yasmCmd"},
+			Description: "yasm $out",
+		},
+		"asFlags")
 )
 
 func init() {
@@ -183,6 +193,7 @@
 	yaccFlags   string
 	protoFlags  string
 	tidyFlags   string
+	yasmFlags   string
 	toolchain   config.Toolchain
 	clang       bool
 	tidy        bool
@@ -240,6 +251,19 @@
 
 		objFiles[i] = objFile
 
+		if srcFile.Ext() == ".asm" {
+			ctx.ModuleBuild(pctx, android.ModuleBuildParams{
+				Rule:      yasm,
+				Output:    objFile,
+				Input:     srcFile,
+				OrderOnly: deps,
+				Args: map[string]string{
+					"asFlags": flags.yasmFlags,
+				},
+			})
+			continue
+		}
+
 		var moduleCflags string
 		var ccCmd string
 		tidy := flags.tidy && flags.clang
diff --git a/cc/cc.go b/cc/cc.go
index df4e5cf..a4f8e58 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -101,6 +101,7 @@
 	LdFlags     []string // Flags that apply to linker command lines
 	libFlags    []string // Flags to add libraries early to the link order
 	TidyFlags   []string // Flags that apply to clang-tidy
+	YasmFlags   []string // Flags that apply to yasm assembly source files
 
 	Toolchain config.Toolchain
 	Clang     bool
diff --git a/cc/compiler.go b/cc/compiler.go
index def8d58..04f536f 100644
--- a/cc/compiler.go
+++ b/cc/compiler.go
@@ -147,6 +147,7 @@
 	flags.CppFlags = append(flags.CppFlags, esc(compiler.Properties.Cppflags)...)
 	flags.ConlyFlags = append(flags.ConlyFlags, esc(compiler.Properties.Conlyflags)...)
 	flags.AsFlags = append(flags.AsFlags, esc(compiler.Properties.Asflags)...)
+	flags.YasmFlags = append(flags.YasmFlags, esc(compiler.Properties.Asflags)...)
 	flags.YaccFlags = append(flags.YaccFlags, esc(compiler.Properties.Yaccflags)...)
 
 	// Include dir cflags
@@ -281,6 +282,8 @@
 		} else {
 			flags.CppFlags = append(flags.CppFlags, tc.Cppflags())
 		}
+
+		flags.YasmFlags = append(flags.YasmFlags, tc.YasmFlags())
 	}
 
 	if flags.Clang {
diff --git a/cc/config/toolchain.go b/cc/config/toolchain.go
index 020a0dd..995c8c6 100644
--- a/cc/config/toolchain.go
+++ b/cc/config/toolchain.go
@@ -66,6 +66,8 @@
 	ClangLdflags() string
 	ClangInstructionSetFlags(string) (string, error)
 
+	YasmFlags() string
+
 	Is64Bit() bool
 
 	ShlibSuffix() string
@@ -127,6 +129,10 @@
 	return ""
 }
 
+func (toolchainBase) YasmFlags() string {
+	return ""
+}
+
 func (toolchainBase) SanitizerRuntimeLibraryArch() string {
 	return ""
 }
diff --git a/cc/config/x86_64_device.go b/cc/config/x86_64_device.go
index 918ddf7..2a6fe2a 100644
--- a/cc/config/x86_64_device.go
+++ b/cc/config/x86_64_device.go
@@ -166,6 +166,9 @@
 	pctx.StaticVariable("X86_64ClangLdflags", strings.Join(ClangFilterUnknownCflags(x86_64Ldflags), " "))
 	pctx.StaticVariable("X86_64ClangCppflags", strings.Join(ClangFilterUnknownCflags(x86_64Cppflags), " "))
 
+	// Yasm flags
+	pctx.StaticVariable("X86_64YasmFlags", "-f elf64 -m amd64")
+
 	// Extended cflags
 
 	// Architecture variant cflags
@@ -245,6 +248,10 @@
 	return "${config.X86_64Ldflags}"
 }
 
+func (t *toolchainX86_64) YasmFlags() string {
+	return "${config.X86_64YasmFlags}"
+}
+
 func (toolchainX86_64) SanitizerRuntimeLibraryArch() string {
 	return "x86_64"
 }
diff --git a/cc/config/x86_device.go b/cc/config/x86_device.go
index 6b55564..23518b6 100644
--- a/cc/config/x86_device.go
+++ b/cc/config/x86_device.go
@@ -188,6 +188,9 @@
 	pctx.StaticVariable("X86ClangLdflags", strings.Join(ClangFilterUnknownCflags(x86Ldflags), " "))
 	pctx.StaticVariable("X86ClangCppflags", strings.Join(ClangFilterUnknownCflags(x86Cppflags), " "))
 
+	// Yasm flags
+	pctx.StaticVariable("X86YasmFlags", "-f elf32 -m x86")
+
 	// Extended cflags
 
 	// Architecture variant cflags
@@ -267,6 +270,10 @@
 	return "${config.X86Ldflags}"
 }
 
+func (t *toolchainX86) YasmFlags() string {
+	return "${config.X86YasmFlags}"
+}
+
 func (toolchainX86) SanitizerRuntimeLibraryArch() string {
 	return "i686"
 }
diff --git a/cc/util.go b/cc/util.go
index 1cb3dd7..9f958d1 100644
--- a/cc/util.go
+++ b/cc/util.go
@@ -97,6 +97,7 @@
 		ldFlags:     strings.Join(in.LdFlags, " "),
 		libFlags:    strings.Join(in.libFlags, " "),
 		tidyFlags:   strings.Join(in.TidyFlags, " "),
+		yasmFlags:   strings.Join(in.YasmFlags, " "),
 		toolchain:   in.Toolchain,
 		clang:       in.Clang,
 		tidy:        in.Tidy,