androidmk: support cfi, diag, and misc_undefined properties

Support more sanitize related properties.

Bug: 37547301
Test: androidmk_test.go
Change-Id: Ie8fba06c36fc121912c65a77ee495ceef4962df0
diff --git a/androidmk/cmd/androidmk/android.go b/androidmk/cmd/androidmk/android.go
index 3c3e2a1..be75041 100644
--- a/androidmk/cmd/androidmk/android.go
+++ b/androidmk/cmd/androidmk/android.go
@@ -33,7 +33,8 @@
 	"LOCAL_MODULE_STEM":           stem,
 	"LOCAL_MODULE_HOST_OS":        hostOs,
 	"LOCAL_SRC_FILES":             srcFiles,
-	"LOCAL_SANITIZE":              sanitize,
+	"LOCAL_SANITIZE":              sanitize(""),
+	"LOCAL_SANITIZE_DIAG":         sanitize("diag."),
 
 	// composite functions
 	"LOCAL_MODULE_TAGS": includeVariableIf(bpVariable{"tags", bpparser.ListType}, not(valueDumpEquals("optional"))),
@@ -413,60 +414,63 @@
 	return nil
 }
 
-func sanitize(ctx variableAssignmentContext) error {
-	val, err := makeVariableToBlueprint(ctx.file, ctx.mkvalue, bpparser.ListType)
-	if err != nil {
-		return err
-	}
-
-	lists, err := splitBpList(val, func(value bpparser.Expression) (string, bpparser.Expression, error) {
-		switch v := value.(type) {
-		case *bpparser.Variable:
-			return "vars", value, nil
-		case *bpparser.Operator:
-			ctx.file.errorf(ctx.mkvalue, "unknown sanitize expression")
-			return "unknown", value, nil
-		case *bpparser.String:
-			switch v.Value {
-			case "never", "address", "coverage", "integer", "thread", "undefined":
-				bpTrue := &bpparser.Bool{
-					Value: true,
-				}
-				return v.Value, bpTrue, nil
-			default:
-				ctx.file.errorf(ctx.mkvalue, "unknown sanitize argument: %s", v.Value)
-				return "unknown", value, nil
-			}
-		default:
-			return "", nil, fmt.Errorf("sanitize expected a string, got %s", value.Type())
-		}
-	})
-	if err != nil {
-		return err
-	}
-
-	for k, v := range lists {
-		if emptyList(v) {
-			continue
-		}
-
-		switch k {
-		case "never", "address", "coverage", "integer", "thread", "undefined":
-			err = setVariable(ctx.file, false, ctx.prefix, "sanitize."+k, lists[k].(*bpparser.List).Values[0], true)
-		case "unknown":
-		// Nothing, we already added the error above
-		case "vars":
-			fallthrough
-		default:
-			err = setVariable(ctx.file, true, ctx.prefix, "sanitize", v, true)
-		}
-
+func sanitize(sub string) func(ctx variableAssignmentContext) error {
+	return func(ctx variableAssignmentContext) error {
+		val, err := makeVariableToBlueprint(ctx.file, ctx.mkvalue, bpparser.ListType)
 		if err != nil {
 			return err
 		}
-	}
 
-	return err
+		lists, err := splitBpList(val, func(value bpparser.Expression) (string, bpparser.Expression, error) {
+			switch v := value.(type) {
+			case *bpparser.Variable:
+				return "vars", value, nil
+			case *bpparser.Operator:
+				ctx.file.errorf(ctx.mkvalue, "unknown sanitize expression")
+				return "unknown", value, nil
+			case *bpparser.String:
+				switch v.Value {
+				case "never", "address", "coverage", "integer", "thread", "undefined", "cfi":
+					bpTrue := &bpparser.Bool{
+						Value: true,
+					}
+					return v.Value, bpTrue, nil
+				default:
+					return "misc_undefined", v, nil
+				}
+			default:
+				return "", nil, fmt.Errorf("sanitize expected a string, got %s", value.Type())
+			}
+		})
+		if err != nil {
+			return err
+		}
+
+		for k, v := range lists {
+			if emptyList(v) {
+				continue
+			}
+
+			switch k {
+			case "never", "address", "coverage", "integer", "thread", "undefined", "cfi":
+				err = setVariable(ctx.file, false, ctx.prefix, "sanitize."+sub+k, lists[k].(*bpparser.List).Values[0], true)
+			case "misc_undefined":
+				err = setVariable(ctx.file, false, ctx.prefix, "sanitize."+sub+"misc_undefined", lists[k].(*bpparser.List), true)
+			case "unknown":
+				// Nothing, we already added the error above
+			case "vars":
+				fallthrough
+			default:
+				err = setVariable(ctx.file, true, ctx.prefix, "sanitize", v, true)
+			}
+
+			if err != nil {
+				return err
+			}
+		}
+
+		return err
+	}
 }
 
 func prebuiltClass(ctx variableAssignmentContext) error {
diff --git a/androidmk/cmd/androidmk/androidmk_test.go b/androidmk/cmd/androidmk/androidmk_test.go
index 0c44ea7..7ebc947 100644
--- a/androidmk/cmd/androidmk/androidmk_test.go
+++ b/androidmk/cmd/androidmk/androidmk_test.go
@@ -285,17 +285,21 @@
 		desc: "LOCAL_SANITIZE unknown parameter",
 		in: `
 include $(CLEAR_VARS)
-LOCAL_SANITIZE := integer asdf
+LOCAL_SANITIZE := integer cfi asdf
+LOCAL_SANITIZE_DIAG := cfi
 LOCAL_SANITIZE_RECOVER := qwert
 include $(BUILD_SHARED_LIBRARY)
 `,
 		expected: `
 cc_library_shared {
-    // ANDROIDMK TRANSLATION ERROR: unknown sanitize argument: asdf
-    // integer asdf
     sanitize: {
-	integer: true,
-	recover: ["qwert"],
+        integer: true,
+        cfi: true,
+        misc_undefined: ["asdf"],
+        diag: {
+            cfi: true,
+        },
+        recover: ["qwert"],
     },
 }
 `,