[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