aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Ratiu <adrian.ratiu@collabora.corp-partner.google.com>2022-05-11 17:05:11 +0300
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-05-12 23:51:58 +0000
commit74a3c504c7d287301b1a6a4eb3a4f20f06a4365c (patch)
treee060bfc0dd812b043cf99b302b80b10d59580df4
parent5ba140d61255ba5e8a81cfacb0b4d3e1aaad13b0 (diff)
downloadtoolchain-utils-74a3c504c7d287301b1a6a4eb3a4f20f06a4365c.tar.gz
compiler_wrapper: handle split "-Wl,-z,defs"
During the libxcrypt build, both "-Wl,-z,defs" and its split equivalent "-Wl,-z -Wl,defs" are used which create problems because only the unified version is supported. This adds support for filtering the flags seprately and two tests to verify the functionality. BUG=b:187795307 TEST=Local builds with cross-*/libxcrypt; CQ. Change-Id: If48499f5c8e552e28c7cefd2d959e40f4757a88f Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/toolchain-utils/+/3641843 Tested-by: Adrian Ratiu <adrian.ratiu@collabora.corp-partner.google.com> Reviewed-by: Manoj Gupta <manojgupta@chromium.org> Reviewed-by: George Burgess <gbiv@chromium.org> Commit-Queue: Manoj Gupta <manojgupta@chromium.org> Tested-by: Manoj Gupta <manojgupta@chromium.org>
-rw-r--r--compiler_wrapper/command.go15
-rw-r--r--compiler_wrapper/sanitizer_flags.go4
-rw-r--r--compiler_wrapper/sanitizer_flags_test.go18
3 files changed, 37 insertions, 0 deletions
diff --git a/compiler_wrapper/command.go b/compiler_wrapper/command.go
index 253251ab..e186623a 100644
--- a/compiler_wrapper/command.go
+++ b/compiler_wrapper/command.go
@@ -265,6 +265,21 @@ func (builder *commandBuilder) transformArgs(transform func(arg builderArg) stri
builder.args = newArgs
}
+// Allows to filter arg pairs, useful for eg when having adjacent unsupported args
+// like "-Wl,-z -Wl,defs"
+func (builder *commandBuilder) filterArgPairs(keepPair func(arg1, arg2 builderArg) bool) {
+ newArgs := builder.args[:0]
+ for i := 0; i < len(builder.args); i++ {
+ if i == len(builder.args)-1 || keepPair(builder.args[i], builder.args[i+1]) {
+ newArgs = append(newArgs, builder.args[i])
+ } else {
+ // skip builder.args[i]) as well as next item
+ i++
+ }
+ }
+ builder.args = newArgs
+}
+
func (builder *commandBuilder) updateEnv(updates ...string) {
builder.envUpdates = append(builder.envUpdates, updates...)
}
diff --git a/compiler_wrapper/sanitizer_flags.go b/compiler_wrapper/sanitizer_flags.go
index 5d517e49..b9eb0558 100644
--- a/compiler_wrapper/sanitizer_flags.go
+++ b/compiler_wrapper/sanitizer_flags.go
@@ -37,5 +37,9 @@ func processSanitizerFlags(builder *commandBuilder) {
}
return arg.value
})
+
+ builder.filterArgPairs(func(arg1, arg2 builderArg) bool {
+ return !(arg1.value == "-Wl,-z" && arg2.value == "-Wl,defs")
+ })
}
}
diff --git a/compiler_wrapper/sanitizer_flags_test.go b/compiler_wrapper/sanitizer_flags_test.go
index 8b22a05e..17c41438 100644
--- a/compiler_wrapper/sanitizer_flags_test.go
+++ b/compiler_wrapper/sanitizer_flags_test.go
@@ -23,6 +23,15 @@ func TestFilterUnsupportedSanitizerFlagsIfSanitizeGiven(t *testing.T) {
}
cmd = ctx.must(callCompiler(ctx, ctx.cfg,
+ ctx.newCommand(gccX86_64, "-fsanitize=kernel-address", "-Wl,-z -Wl,defs", mainCc)))
+ if err := verifyArgCount(cmd, 0, "-Wl,-z"); err != nil {
+ t.Error(err)
+ }
+ if err := verifyArgCount(cmd, 0, "-Wl,defs"); err != nil {
+ t.Error(err)
+ }
+
+ cmd = ctx.must(callCompiler(ctx, ctx.cfg,
ctx.newCommand(gccX86_64, "-fsanitize=kernel-address", "-D_FORTIFY_SOURCE=1", mainCc)))
if err := verifyArgCount(cmd, 0, "-D_FORTIFY_SOURCE=1"); err != nil {
t.Error(err)
@@ -75,6 +84,15 @@ func TestKeepSanitizerFlagsIfNoSanitizeGiven(t *testing.T) {
}
cmd = ctx.must(callCompiler(ctx, ctx.cfg,
+ ctx.newCommand(gccX86_64, "-Wl,-z -Wl,defs", mainCc)))
+ if err := verifyArgCount(cmd, 1, "-Wl,-z"); err != nil {
+ t.Error(err)
+ }
+ if err := verifyArgCount(cmd, 1, "-Wl,defs"); err != nil {
+ t.Error(err)
+ }
+
+ cmd = ctx.must(callCompiler(ctx, ctx.cfg,
ctx.newCommand(gccX86_64, "-D_FORTIFY_SOURCE=1", mainCc)))
if err := verifyArgCount(cmd, 1, "-D_FORTIFY_SOURCE=1"); err != nil {
t.Error(err)