[llvm-commits] [llvm] r166767 - in /llvm/trunk/tools: llvm-ar/CMakeLists.txt llvm-ar/Makefile llvm-ar/llvm-ar.cpp llvm-as/CMakeLists.txt llvm-bcanalyzer/CMakeLists.txt llvm-dis/CMakeLists.txt llvm-ranlib/CMakeLists.txt llvm-ranlib/Makefile llvm-r
Rafael EspĂndola
rafael.espindola at gmail.com
Fri Oct 26 11:35:37 PDT 2012
Thanks!
On 26 October 2012 06:49, Joerg Sonnenberger <joerg at bec.de> wrote:
> Author: joerg
> Date: Fri Oct 26 05:49:15 2012
> New Revision: 166767
>
> URL: http://llvm.org/viewvc/llvm-project?rev=166767&view=rev
> Log:
> Adjust llvm-ar and llvm-ranlib to not depend on exception handling.
> Always use an exit code of 1, but print the help message if useful.
> Remove the exception handling tag in llvm-as, llvm-dis and
> llvm-bcanalyzer, where it isn't used.
>
> Modified:
> llvm/trunk/tools/llvm-ar/CMakeLists.txt
> llvm/trunk/tools/llvm-ar/Makefile
> llvm/trunk/tools/llvm-ar/llvm-ar.cpp
> llvm/trunk/tools/llvm-as/CMakeLists.txt
> llvm/trunk/tools/llvm-bcanalyzer/CMakeLists.txt
> llvm/trunk/tools/llvm-dis/CMakeLists.txt
> llvm/trunk/tools/llvm-ranlib/CMakeLists.txt
> llvm/trunk/tools/llvm-ranlib/Makefile
> llvm/trunk/tools/llvm-ranlib/llvm-ranlib.cpp
>
> Modified: llvm/trunk/tools/llvm-ar/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/CMakeLists.txt?rev=166767&r1=166766&r2=166767&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-ar/CMakeLists.txt (original)
> +++ llvm/trunk/tools/llvm-ar/CMakeLists.txt Fri Oct 26 05:49:15 2012
> @@ -1,5 +1,4 @@
> set(LLVM_LINK_COMPONENTS archive)
> -set(LLVM_REQUIRES_EH 1)
>
> add_llvm_tool(llvm-ar
> llvm-ar.cpp
>
> Modified: llvm/trunk/tools/llvm-ar/Makefile
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/Makefile?rev=166767&r1=166766&r2=166767&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-ar/Makefile (original)
> +++ llvm/trunk/tools/llvm-ar/Makefile Fri Oct 26 05:49:15 2012
> @@ -10,7 +10,6 @@
> LEVEL := ../..
> TOOLNAME := llvm-ar
> LINK_COMPONENTS := archive
> -REQUIRES_EH := 1
>
> # This tool has no plugins, optimize startup time.
> TOOL_NO_EXPORTS := 1
>
> Modified: llvm/trunk/tools/llvm-ar/llvm-ar.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/llvm-ar.cpp?rev=166767&r1=166766&r2=166767&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-ar/llvm-ar.cpp (original)
> +++ llvm/trunk/tools/llvm-ar/llvm-ar.cpp Fri Oct 26 05:49:15 2012
> @@ -23,6 +23,7 @@
> #include "llvm/Support/raw_ostream.h"
> #include "llvm/Support/Signals.h"
> #include <algorithm>
> +#include <cstdlib>
> #include <memory>
> #include <fstream>
> using namespace llvm;
> @@ -126,40 +127,57 @@
> // The Archive object to which all the editing operations will be sent.
> Archive* TheArchive = 0;
>
> +// The name this program was invoked as.
> +static const char *program_name;
> +
> +// show_help - Show the error message, the help message and exit.
> +LLVM_ATTRIBUTE_NORETURN static void
> +show_help(const std::string &msg) {
> + errs() << program_name << ": " << msg << "\n\n";
> + cl::PrintHelpMessage();
> + if (TheArchive)
> + delete TheArchive;
> + std::exit(1);
> +}
> +
> +// fail - Show the error message and exit.
> +LLVM_ATTRIBUTE_NORETURN static void
> +fail(const std::string &msg) {
> + errs() << program_name << ": " << msg << "\n\n";
> + if (TheArchive)
> + delete TheArchive;
> + std::exit(1);
> +}
> +
> // getRelPos - Extract the member filename from the command line for
> // the [relpos] argument associated with a, b, and i modifiers
> void getRelPos() {
> - if(RestOfArgs.size() > 0) {
> - RelPos = RestOfArgs[0];
> - RestOfArgs.erase(RestOfArgs.begin());
> - }
> - else
> - throw "Expected [relpos] for a, b, or i modifier";
> + if(RestOfArgs.size() == 0)
> + show_help("Expected [relpos] for a, b, or i modifier");
> + RelPos = RestOfArgs[0];
> + RestOfArgs.erase(RestOfArgs.begin());
> }
>
> // getCount - Extract the [count] argument associated with the N modifier
> // from the command line and check its value.
> void getCount() {
> - if(RestOfArgs.size() > 0) {
> - Count = atoi(RestOfArgs[0].c_str());
> - RestOfArgs.erase(RestOfArgs.begin());
> - }
> - else
> - throw "Expected [count] value with N modifier";
> + if(RestOfArgs.size() == 0)
> + show_help("Expected [count] value with N modifier");
> +
> + Count = atoi(RestOfArgs[0].c_str());
> + RestOfArgs.erase(RestOfArgs.begin());
>
> // Non-positive counts are not allowed
> if (Count < 1)
> - throw "Invalid [count] value (not a positive integer)";
> + show_help("Invalid [count] value (not a positive integer)");
> }
>
> // getArchive - Get the archive file name from the command line
> void getArchive() {
> - if(RestOfArgs.size() > 0) {
> - ArchiveName = RestOfArgs[0];
> - RestOfArgs.erase(RestOfArgs.begin());
> - }
> - else
> - throw "An archive name must be specified.";
> + if(RestOfArgs.size() == 0)
> + show_help("An archive name must be specified");
> + ArchiveName = RestOfArgs[0];
> + RestOfArgs.erase(RestOfArgs.begin());
> }
>
> // getMembers - Copy over remaining items in RestOfArgs to our Members vector
> @@ -240,25 +258,27 @@
> // Perform various checks on the operation/modifier specification
> // to make sure we are dealing with a legal request.
> if (NumOperations == 0)
> - throw "You must specify at least one of the operations";
> + show_help("You must specify at least one of the operations");
> if (NumOperations > 1)
> - throw "Only one operation may be specified";
> + show_help("Only one operation may be specified");
> if (NumPositional > 1)
> - throw "You may only specify one of a, b, and i modifiers";
> - if (AddAfter || AddBefore || InsertBefore)
> + show_help("You may only specify one of a, b, and i modifiers");
> + if (AddAfter || AddBefore || InsertBefore) {
> if (Operation != Move && Operation != ReplaceOrInsert)
> - throw "The 'a', 'b' and 'i' modifiers can only be specified with "
> - "the 'm' or 'r' operations";
> + show_help("The 'a', 'b' and 'i' modifiers can only be specified with "
> + "the 'm' or 'r' operations");
> + }
> if (RecurseDirectories && Operation != ReplaceOrInsert)
> - throw "The 'R' modifiers is only applicabe to the 'r' operation";
> + show_help("The 'R' modifiers is only applicabe to the 'r' operation");
> if (OriginalDates && Operation != Extract)
> - throw "The 'o' modifier is only applicable to the 'x' operation";
> + show_help("The 'o' modifier is only applicable to the 'x' operation");
> if (TruncateNames && Operation!=QuickAppend && Operation!=ReplaceOrInsert)
> - throw "The 'f' modifier is only applicable to the 'q' and 'r' operations";
> + show_help("The 'f' modifier is only applicable to the 'q' and 'r' "
> + "operations");
> if (OnlyUpdate && Operation != ReplaceOrInsert)
> - throw "The 'u' modifier is only applicable to the 'r' operation";
> + show_help("The 'u' modifier is only applicable to the 'r' operation");
> if (Count > 1 && Members.size() > 1)
> - throw "Only one member name may be specified with the 'N' modifier";
> + show_help("Only one member name may be specified with the 'N' modifier");
>
> // Return the parsed operation to the caller
> return Operation;
> @@ -304,16 +324,16 @@
> for (unsigned i = 0; i < Members.size(); i++) {
> sys::Path aPath;
> if (!aPath.set(Members[i]))
> - throw std::string("File member name invalid: ") + Members[i];
> + fail(std::string("File member name invalid: ") + Members[i]);
> if (checkExistence) {
> bool Exists;
> if (sys::fs::exists(aPath.str(), Exists) || !Exists)
> - throw std::string("File does not exist: ") + Members[i];
> + fail(std::string("File does not exist: ") + Members[i]);
> std::string Err;
> sys::PathWithStatus PwS(aPath);
> const sys::FileStatus *si = PwS.getFileStatus(false, &Err);
> if (!si)
> - throw Err;
> + fail(Err);
> if (si->isDir) {
> std::set<sys::Path> dirpaths;
> if (recurseDirectories(aPath, dirpaths, ErrMsg))
> @@ -683,6 +703,7 @@
>
> // main - main program for llvm-ar .. see comments in the code
> int main(int argc, char **argv) {
> + program_name = argv[0];
> // Print a stack trace if we signal out.
> sys::PrintStackTraceOnErrorSignal();
> PrettyStackTraceProgram X(argc, argv);
> @@ -698,76 +719,60 @@
>
> int exitCode = 0;
>
> - // Make sure we don't exit with "unhandled exception".
> - try {
> - // Do our own parsing of the command line because the CommandLine utility
> - // can't handle the grouped positional parameters without a dash.
> - ArchiveOperation Operation = parseCommandLine();
> -
> - // Check the path name of the archive
> - sys::Path ArchivePath;
> - if (!ArchivePath.set(ArchiveName))
> - throw std::string("Archive name invalid: ") + ArchiveName;
> -
> - // Create or open the archive object.
> - bool Exists;
> - if (llvm::sys::fs::exists(ArchivePath.str(), Exists) || !Exists) {
> - // Produce a warning if we should and we're creating the archive
> - if (!Create)
> - errs() << argv[0] << ": creating " << ArchivePath.str() << "\n";
> - TheArchive = Archive::CreateEmpty(ArchivePath, Context);
> - TheArchive->writeToDisk();
> - } else {
> - std::string Error;
> - TheArchive = Archive::OpenAndLoad(ArchivePath, Context, &Error);
> - if (TheArchive == 0) {
> - errs() << argv[0] << ": error loading '" << ArchivePath.str() << "': "
> - << Error << "!\n";
> - return 1;
> - }
> + // Do our own parsing of the command line because the CommandLine utility
> + // can't handle the grouped positional parameters without a dash.
> + ArchiveOperation Operation = parseCommandLine();
> +
> + // Check the path name of the archive
> + sys::Path ArchivePath;
> + if (!ArchivePath.set(ArchiveName)) {
> + errs() << argv[0] << ": Archive name invalid: " << ArchiveName << "\n";
> + return 1;
> + }
> +
> + // Create or open the archive object.
> + bool Exists;
> + if (llvm::sys::fs::exists(ArchivePath.str(), Exists) || !Exists) {
> + // Produce a warning if we should and we're creating the archive
> + if (!Create)
> + errs() << argv[0] << ": creating " << ArchivePath.str() << "\n";
> + TheArchive = Archive::CreateEmpty(ArchivePath, Context);
> + TheArchive->writeToDisk();
> + } else {
> + std::string Error;
> + TheArchive = Archive::OpenAndLoad(ArchivePath, Context, &Error);
> + if (TheArchive == 0) {
> + errs() << argv[0] << ": error loading '" << ArchivePath.str() << "': "
> + << Error << "!\n";
> + return 1;
> }
> + }
>
> - // Make sure we're not fooling ourselves.
> - assert(TheArchive && "Unable to instantiate the archive");
> -
> - // Make sure we clean up the archive even on failure.
> - std::auto_ptr<Archive> AutoArchive(TheArchive);
> + // Make sure we're not fooling ourselves.
> + assert(TheArchive && "Unable to instantiate the archive");
>
> - // Perform the operation
> - std::string ErrMsg;
> - bool haveError = false;
> - switch (Operation) {
> - case Print: haveError = doPrint(&ErrMsg); break;
> - case Delete: haveError = doDelete(&ErrMsg); break;
> - case Move: haveError = doMove(&ErrMsg); break;
> - case QuickAppend: haveError = doQuickAppend(&ErrMsg); break;
> - case ReplaceOrInsert: haveError = doReplaceOrInsert(&ErrMsg); break;
> - case DisplayTable: haveError = doDisplayTable(&ErrMsg); break;
> - case Extract: haveError = doExtract(&ErrMsg); break;
> - case NoOperation:
> - errs() << argv[0] << ": No operation was selected.\n";
> - break;
> - }
> - if (haveError) {
> - errs() << argv[0] << ": " << ErrMsg << "\n";
> - return 1;
> - }
> - } catch (const char*msg) {
> - // These errors are usage errors, thrown only by the various checks in the
> - // code above.
> - errs() << argv[0] << ": " << msg << "\n\n";
> - cl::PrintHelpMessage();
> - exitCode = 1;
> - } catch (const std::string& msg) {
> - // These errors are thrown by LLVM libraries (e.g. lib System) and represent
> - // a more serious error so we bump the exitCode and don't print the usage.
> - errs() << argv[0] << ": " << msg << "\n";
> - exitCode = 2;
> - } catch (...) {
> - // This really shouldn't happen, but just in case ....
> - errs() << argv[0] << ": An unexpected unknown exception occurred.\n";
> - exitCode = 3;
> + // Perform the operation
> + std::string ErrMsg;
> + bool haveError = false;
> + switch (Operation) {
> + case Print: haveError = doPrint(&ErrMsg); break;
> + case Delete: haveError = doDelete(&ErrMsg); break;
> + case Move: haveError = doMove(&ErrMsg); break;
> + case QuickAppend: haveError = doQuickAppend(&ErrMsg); break;
> + case ReplaceOrInsert: haveError = doReplaceOrInsert(&ErrMsg); break;
> + case DisplayTable: haveError = doDisplayTable(&ErrMsg); break;
> + case Extract: haveError = doExtract(&ErrMsg); break;
> + case NoOperation:
> + errs() << argv[0] << ": No operation was selected.\n";
> + break;
> }
> + if (haveError) {
> + errs() << argv[0] << ": " << ErrMsg << "\n";
> + return 1;
> + }
> +
> + delete TheArchive;
> + TheArchive = 0;
>
> // Return result code back to operating system.
> return exitCode;
>
> Modified: llvm/trunk/tools/llvm-as/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-as/CMakeLists.txt?rev=166767&r1=166766&r2=166767&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-as/CMakeLists.txt (original)
> +++ llvm/trunk/tools/llvm-as/CMakeLists.txt Fri Oct 26 05:49:15 2012
> @@ -1,5 +1,4 @@
> set(LLVM_LINK_COMPONENTS asmparser bitwriter)
> -set(LLVM_REQUIRES_EH 1)
>
> add_llvm_tool(llvm-as
> llvm-as.cpp
>
> Modified: llvm/trunk/tools/llvm-bcanalyzer/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-bcanalyzer/CMakeLists.txt?rev=166767&r1=166766&r2=166767&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-bcanalyzer/CMakeLists.txt (original)
> +++ llvm/trunk/tools/llvm-bcanalyzer/CMakeLists.txt Fri Oct 26 05:49:15 2012
> @@ -1,5 +1,4 @@
> set(LLVM_LINK_COMPONENTS bitreader)
> -set(LLVM_REQUIRES_EH 1)
>
> add_llvm_tool(llvm-bcanalyzer
> llvm-bcanalyzer.cpp
>
> Modified: llvm/trunk/tools/llvm-dis/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dis/CMakeLists.txt?rev=166767&r1=166766&r2=166767&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-dis/CMakeLists.txt (original)
> +++ llvm/trunk/tools/llvm-dis/CMakeLists.txt Fri Oct 26 05:49:15 2012
> @@ -1,5 +1,4 @@
> set(LLVM_LINK_COMPONENTS bitreader analysis)
> -set(LLVM_REQUIRES_EH 1)
>
> add_llvm_tool(llvm-dis
> llvm-dis.cpp
>
> Modified: llvm/trunk/tools/llvm-ranlib/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ranlib/CMakeLists.txt?rev=166767&r1=166766&r2=166767&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-ranlib/CMakeLists.txt (original)
> +++ llvm/trunk/tools/llvm-ranlib/CMakeLists.txt Fri Oct 26 05:49:15 2012
> @@ -1,5 +1,4 @@
> set(LLVM_LINK_COMPONENTS archive)
> -set(LLVM_REQUIRES_EH 1)
>
> add_llvm_tool(llvm-ranlib
> llvm-ranlib.cpp
>
> Modified: llvm/trunk/tools/llvm-ranlib/Makefile
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ranlib/Makefile?rev=166767&r1=166766&r2=166767&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-ranlib/Makefile (original)
> +++ llvm/trunk/tools/llvm-ranlib/Makefile Fri Oct 26 05:49:15 2012
> @@ -10,7 +10,6 @@
> LEVEL := ../..
> TOOLNAME := llvm-ranlib
> LINK_COMPONENTS := archive
> -REQUIRES_EH := 1
>
> # This tool has no plugins, optimize startup time.
> TOOL_NO_EXPORTS := 1
>
> Modified: llvm/trunk/tools/llvm-ranlib/llvm-ranlib.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ranlib/llvm-ranlib.cpp?rev=166767&r1=166766&r2=166767&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-ranlib/llvm-ranlib.cpp (original)
> +++ llvm/trunk/tools/llvm-ranlib/llvm-ranlib.cpp Fri Oct 26 05:49:15 2012
> @@ -61,41 +61,38 @@
>
> int exitCode = 0;
>
> - // Make sure we don't exit with "unhandled exception".
> - try {
> + // Check the path name of the archive
> + sys::Path ArchivePath;
> + if (!ArchivePath.set(ArchiveName)) {
> + errs() << argv[0] << ": " << "Archive name invalid: " << ArchiveName <<
> + "\n";
> + return 1;
> + }
> +
> + // Make sure it exists, we don't create empty archives
> + bool Exists;
> + if (llvm::sys::fs::exists(ArchivePath.str(), Exists) || !Exists) {
> + errs() << argv[0] << ": " << "Archive file does not exist" <<
> + ArchivePath.str() << "\n";
> + return 1;
> + }
>
> - // Check the path name of the archive
> - sys::Path ArchivePath;
> - if (!ArchivePath.set(ArchiveName))
> - throw std::string("Archive name invalid: ") + ArchiveName;
> -
> - // Make sure it exists, we don't create empty archives
> - bool Exists;
> - if (llvm::sys::fs::exists(ArchivePath.str(), Exists) || !Exists)
> - throw std::string("Archive file does not exist");
> -
> - std::string err_msg;
> - std::auto_ptr<Archive>
> - AutoArchive(Archive::OpenAndLoad(ArchivePath, Context, &err_msg));
> - Archive* TheArchive = AutoArchive.get();
> - if (!TheArchive)
> - throw err_msg;
> -
> - if (TheArchive->writeToDisk(true, false, &err_msg ))
> - throw err_msg;
> -
> - if (Verbose)
> - printSymbolTable(TheArchive);
> -
> - } catch (const char* msg) {
> - errs() << argv[0] << ": " << msg << "\n\n";
> - exitCode = 1;
> - } catch (const std::string& msg) {
> - errs() << argv[0] << ": " << msg << "\n";
> - exitCode = 2;
> - } catch (...) {
> - errs() << argv[0] << ": An unexpected unknown exception occurred.\n";
> - exitCode = 3;
> + std::string err_msg;
> + std::auto_ptr<Archive>
> + AutoArchive(Archive::OpenAndLoad(ArchivePath, Context, &err_msg));
> + Archive* TheArchive = AutoArchive.get();
> + if (!TheArchive) {
> + errs() << argv[0] << ": " << err_msg << "\n";
> + return 1;
> }
> +
> + if (TheArchive->writeToDisk(true, false, &err_msg )) {
> + errs() << argv[0] << ": " << err_msg << "\n";
> + return 1;
> + }
> +
> + if (Verbose)
> + printSymbolTable(TheArchive);
> +
> return exitCode;
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list