[lld] Check errors from expanding response files
authorHans Wennborg <hans@chromium.org>
Sat, 5 Nov 2022 03:37:45 +0000 (04:37 +0100)
committerHans Wennborg <hans@chromium.org>
Mon, 7 Nov 2022 17:28:33 +0000 (18:28 +0100)
Previously the response file expansion code would print the error, but
lld would not exit, which was odd.

lld does response file expansion in the different drivers, but it's also
done in main() first, so it's enough to check there.

By checking for these errors we would have caught when D136090
introduced a bug that made lld print errors for response files which
contained "-rpath @foo".

Differental revision: https://reviews.llvm.org/D137477

lld/test/ELF/basic.s
lld/tools/lld/lld.cpp

index 33c0194..587fd16 100644 (file)
@@ -218,6 +218,12 @@ _start:
 # RUN:   --check-prefix=INVRSP
 # INVRSP: invalid response file quoting: patatino
 
+## Test erroring on a recursive response file, but only once.
+# RUN: echo @%t.responsefile > %t.responsefile
+# RUN: not ld.lld %t @%t.responsefile 2>&1 | FileCheck %s --check-prefix=RECRSP
+# RECRSP: recursive expansion of: '{{.*}}.responsefile'
+# RECRSP-NOT: recursive expansion of
+
 # RUN: not ld.lld %t.foo -o /dev/null 2>&1 | \
 # RUN:  FileCheck -DMSG=%errc_ENOENT --check-prefix=MISSING %s
 # MISSING: cannot open {{.*}}.foo: [[MSG]]
index b0e28d1..700c0b7 100644 (file)
@@ -89,7 +89,9 @@ static bool isPETarget(std::vector<const char *> &v) {
   SmallVector<const char *, 256> expandedArgs(v.data(), v.data() + v.size());
   BumpPtrAllocator a;
   StringSaver saver(a);
-  cl::ExpandResponseFiles(saver, getDefaultQuotingStyle(), expandedArgs);
+  cl::ExpansionContext ECtx(saver.getAllocator(), getDefaultQuotingStyle());
+  if (Error Err = ECtx.expandResponseFiles(expandedArgs))
+    die(toString(std::move(Err)));
   for (auto it = expandedArgs.begin(); it + 1 != expandedArgs.end(); ++it) {
     if (StringRef(*it) != "-m")
       continue;