diff --git a/llvm/test/tools/llvm-ar/mri-addlib.test b/llvm/test/tools/llvm-ar/mri-addlib.test --- a/llvm/test/tools/llvm-ar/mri-addlib.test +++ b/llvm/test/tools/llvm-ar/mri-addlib.test @@ -22,10 +22,10 @@ # RUN: not llvm-ar -M < %t/badlib.mri 2>&1 | FileCheck --check-prefix=PARSE %s # RUN: not ls %t/badlib.a -# PARSE: error: could not parse library +# PARSE: error: script line 2: could not parse library ## No create command. -# RUN: echo "ADDLIB %t/f.a" > %t/nocreate.mri +# RUN: echo "ADDLIB %t/f.a" > %t/nocreate.mri # RUN: echo "SAVE" >> %t/nocreate.mri # RUN: not llvm-ar -M < %t/nocreate.mri diff --git a/llvm/test/tools/llvm-ar/mri-errors.test b/llvm/test/tools/llvm-ar/mri-errors.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-ar/mri-errors.test @@ -0,0 +1,41 @@ +## Test different MRI comment formats and whitespace. + +# RUN: rm -rf %t && mkdir -p %t + +# RUN: echo "create %t/mri.ar" > %t/script1.mri +# RUN: echo "addlib %t/missing.a" >> %t/script1.mri + +# RUN: not llvm-ar -M < %t/script1.mri 2>&1 | FileCheck --check-prefix=SCRIPT1 %s +# SCRIPT1: error: script line 2: could not open library + +# RUN: echo "create %t/mri.ar" > %t/script2.mri +# RUN: echo "addlib %t/bad.a" >> %t/script2.mri + +# RUN: echo "bad archive" > %t/bad.a + +# RUN: not llvm-ar -M < %t/script2.mri 2>&1 | FileCheck --check-prefix=SCRIPT2 %s +# SCRIPT2: error: script line 2: could not parse library + +# RUN: echo "create %t/mri.ar" > %t/script3.mri +# RUN: echo "create %t/second.ar" >> %t/script3.mri + +# RUN: not llvm-ar -M < %t/script3.mri 2>&1 | FileCheck --check-prefix=SCRIPT3 %s +# SCRIPT3: error: script line 2: editing multiple archives not supported + +# RUN: echo "save" > %t/script4.mri +# RUN: echo "create %t/mri.ar" >> %t/script4.mri + +# RUN: not llvm-ar -M < %t/script4.mri 2>&1 | FileCheck --check-prefix=SCRIPT4 %s +# SCRIPT4: error: script line 2: file already saved + +# RUN: echo "create %t/mri.ar" > %t/script5.mri +# RUN: echo "bad command" >> %t/script5.mri + +# RUN: not llvm-ar -M < %t/script5.mri 2>&1 | FileCheck --check-prefix=SCRIPT5 %s +# SCRIPT5: error: script line 2: unknown command: bad + +# RUN: echo "bad command" | not llvm-ar -M 2>&1 | FileCheck --check-prefix=SCRIPT6 %s +# SCRIPT6: error: script line 1: unknown command: bad + +# RUN: not llvm-ar -M rc %t/mri.ar 2>&1 | FileCheck --check-prefix=SCRIPT7 %s +# SCRIPT7: error: cannot mix -M and other options diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp --- a/llvm/tools/llvm-ar/llvm-ar.cpp +++ b/llvm/tools/llvm-ar/llvm-ar.cpp @@ -116,10 +116,19 @@ outs() << ArHelp; } +static unsigned MRILineNumber; +static bool ParsingMRIScript; + // Show the error message and exit. LLVM_ATTRIBUTE_NORETURN static void fail(Twine Error) { - WithColor::error(errs(), ToolName) << Error << "\n"; - printHelpMessage(); + if (ParsingMRIScript) { + WithColor::error(errs(), ToolName) + << "script line " << MRILineNumber << ": " << Error << "\n"; + } else { + WithColor::error(errs(), ToolName) << Error << "\n"; + printHelpMessage(); + } + exit(1); } @@ -959,8 +968,10 @@ const MemoryBuffer &Ref = *Buf.get(); bool Saved = false; std::vector NewMembers; + ParsingMRIScript = true; for (line_iterator I(Ref, /*SkipBlanks*/ false), E; I != E; ++I) { + ++MRILineNumber; StringRef Line = *I; Line = Line.split(';').first; Line = Line.split('*').first; @@ -1022,7 +1033,9 @@ fail("unknown command: " + CommandStr); } } - + + ParsingMRIScript = false; + // Nothing to do if not saved. if (Saved) performOperation(ReplaceOrInsert, &NewMembers);