diff options
author | Colin Cross <ccross@android.com> | 2017-05-07 21:57:58 -0700 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2017-05-08 16:03:17 -0700 |
commit | 254514eb73f935e65ca40dd96550ac105635ce92 (patch) | |
tree | 62b73ecb9f356f316c3afc8d7bc8f2b1c0bc7f46 | |
parent | 8ff9ef4c30cbdfebeeb2d753de6c94f343a9cdb1 (diff) | |
download | build_soong-254514eb73f935e65ca40dd96550ac105635ce92.tar.gz build_soong-254514eb73f935e65ca40dd96550ac105635ce92.tar.bz2 build_soong-254514eb73f935e65ca40dd96550ac105635ce92.zip |
androidmk: support cfi, diag, and misc_undefined properties
Support more sanitize related properties. Also remove integer,
since it isn't a supported property, and rewrite it to be
deterministic by not going through splitBpList.
This reapplies Ie8fba06c36fc121912c65a77ee495ceef4962df0.
Bug: 37547301
Test: androidmk_test.go
Change-Id: Id637ffdb7d36bed8a2c2fe76bd6f54662709e3b3
-rw-r--r-- | androidmk/cmd/androidmk/android.go | 83 | ||||
-rw-r--r-- | androidmk/cmd/androidmk/androidmk_test.go | 29 |
2 files changed, 46 insertions, 66 deletions
diff --git a/androidmk/cmd/androidmk/android.go b/androidmk/cmd/androidmk/android.go index 3c3e2a1b..8801b34b 100644 --- a/androidmk/cmd/androidmk/android.go +++ b/androidmk/cmd/androidmk/android.go @@ -33,7 +33,8 @@ var rewriteProperties = map[string](func(variableAssignmentContext) error){ "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,50 @@ func srcFiles(ctx variableAssignmentContext) error { return nil } -func sanitize(ctx variableAssignmentContext) error { - val, err := makeVariableToBlueprint(ctx.file, ctx.mkvalue, bpparser.ListType) - if err != nil { - return err - } +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 + } - 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, + if _, ok := val.(*bpparser.List); !ok { + return fmt.Errorf("unsupported sanitize expression") + } + + misc := &bpparser.List{} + + for _, v := range val.(*bpparser.List).Values { + switch v := v.(type) { + case *bpparser.Variable, *bpparser.Operator: + ctx.file.errorf(ctx.mkvalue, "unsupported sanitize expression") + case *bpparser.String: + switch v.Value { + case "never", "address", "coverage", "thread", "undefined", "cfi": + bpTrue := &bpparser.Bool{ + Value: true, + } + err = setVariable(ctx.file, false, ctx.prefix, "sanitize."+sub+v.Value, bpTrue, true) + if err != nil { + return err + } + default: + misc.Values = append(misc.Values, v) } - return v.Value, bpTrue, nil default: - ctx.file.errorf(ctx.mkvalue, "unknown sanitize argument: %s", v.Value) - return "unknown", value, nil + return fmt.Errorf("sanitize expected a string, got %s", v.Type()) } - 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) + if len(misc.Values) > 0 { + err = setVariable(ctx.file, false, ctx.prefix, "sanitize."+sub+"misc_undefined", misc, true) + if err != nil { + return err + } } - if err != nil { - return err - } + 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 0c44ea72..5fbc951f 100644 --- a/androidmk/cmd/androidmk/androidmk_test.go +++ b/androidmk/cmd/androidmk/androidmk_test.go @@ -285,37 +285,26 @@ cc_library_shared { desc: "LOCAL_SANITIZE unknown parameter", in: ` include $(CLEAR_VARS) -LOCAL_SANITIZE := integer asdf +LOCAL_SANITIZE := thread 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"], + thread: true, + cfi: true, + misc_undefined: ["asdf"], + diag: { + cfi: true, + }, + recover: ["qwert"], }, } `, }, { - desc: "LOCAL_SANITIZE using variable", - in: ` -sanitize_var := never -include $(CLEAR_VARS) -LOCAL_SANITIZE := $(sanitize_var) -include $(BUILD_SHARED_LIBRARY) -`, - expected: ` -sanitize_var = ["never"] -cc_library_shared { - sanitize: sanitize_var, -} -`, - }, - { desc: "LOCAL_SANITIZE_RECOVER", in: ` include $(CLEAR_VARS) |