Skip to content

Commit

Permalink
Reapply [llvm-ar] Include a line number when failing to parse an MRI …
Browse files Browse the repository at this point in the history
…script

Reapply r372309

Errors that occur when reading an MRI script now include a corresponding
line number.

Differential Revision: https://reviews.llvm.org/D67449

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@372374 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Owen Reynolds committed Sep 20, 2019
1 parent 8958b8b commit 86279ff
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 8 deletions.
2 changes: 1 addition & 1 deletion test/Object/mri2.test
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
; RUN: echo end >> %t.mri

; RUN: not llvm-ar -M < %t.mri 2>&1 | FileCheck %s
; CHECK: error: editing multiple archives not supported
; CHECK: error: script line 2: editing multiple archives not supported
2 changes: 1 addition & 1 deletion test/Object/mri3.test
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
; RUN: echo end >> %t.mri

; RUN: not llvm-ar -M < %t.mri 2>&1 | FileCheck %s
; CHECK: error: file already saved
; CHECK: error: script line 2: file already saved
2 changes: 1 addition & 1 deletion test/Object/mri4.test
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
; RUN: echo abc > %t.mri

; RUN: not llvm-ar -M < %t.mri 2>&1 | FileCheck %s
; CHECK: error: unknown command: abc
; CHECK: error: script line 1: unknown command: abc
4 changes: 2 additions & 2 deletions test/tools/llvm-ar/mri-addlib.test
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
41 changes: 41 additions & 0 deletions test/tools/llvm-ar/mri-errors.test
Original file line number Diff line number Diff line change
@@ -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
19 changes: 16 additions & 3 deletions tools/llvm-ar/llvm-ar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,10 +116,19 @@ void printHelpMessage() {
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);
}

Expand Down Expand Up @@ -958,8 +967,10 @@ static void runMRIScript() {
const MemoryBuffer &Ref = *Buf.get();
bool Saved = false;
std::vector<NewArchiveMember> 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;
Expand Down Expand Up @@ -1021,7 +1032,9 @@ static void runMRIScript() {
fail("unknown command: " + CommandStr);
}
}


ParsingMRIScript = false;

// Nothing to do if not saved.
if (Saved)
performOperation(ReplaceOrInsert, &NewMembers);
Expand Down

0 comments on commit 86279ff

Please sign in to comment.