<div dir="ltr">Hi Rafael!<div><br></div><div>I get the following error when running check-llvm locally:</div><div><div>Failing Tests (1):</div><div>    LLVM :: Object/archive-symtab.test</div></div><div><...></div><div>
Invalid alignment for ELF file!<br></div><div>UNREACHABLE executed at /llvm/lib/Object/ELFObjectFile.cpp:67<br></div><div><br></div><div>llvm-nm crashes after we create the symbol table for archive with llvm-ranlib.</div>
<div>Does the latter enforces the correct alignment of archive members?</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Aug 28, 2013 at 8:22 PM, Rafael Espindola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rafael<br>
Date: Wed Aug 28 11:22:16 2013<br>
New Revision: 189489<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=189489&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=189489&view=rev</a><br>
Log:<br>
Add a minimal implementation of ranlib.<br>
<br>
This is just enough to get "llvm-ranlib foo.a" working and tested. Making<br>
llvm-ranlib a symbolic link to llvm-ar doesn't work so well with llvm's option<br>
parsing, but ar's option parsing is mostly custom anyway.<br>
<br>
This patch also removes the -X32_64 option. Looks like it was just added in<br>
r10297 as part of implementing the current command line parsing. I can add it<br>
back (with a test) if someone really has AIX portability problems without it.<br>
<br>
Modified:<br>
    llvm/trunk/test/Object/archive-symtab.test<br>
    llvm/trunk/tools/llvm-ar/CMakeLists.txt<br>
    llvm/trunk/tools/llvm-ar/Makefile<br>
    llvm/trunk/tools/llvm-ar/llvm-ar.cpp<br>
<br>
Modified: llvm/trunk/test/Object/archive-symtab.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/archive-symtab.test?rev=189489&r1=189488&r2=189489&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/archive-symtab.test?rev=189489&r1=189488&r2=189489&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/test/Object/archive-symtab.test (original)<br>
+++ llvm/trunk/test/Object/archive-symtab.test Wed Aug 28 11:22:16 2013<br>
@@ -48,3 +48,12 @@ CORRUPT-NEXT: 00000016 T main<br>
 check that the we *don't* update the symbol table.<br>
 RUN: llvm-ar s %t.a<br>
 RUN: llvm-nm -s %t.a | FileCheck %s --check-prefix=CORRUPT<br>
+<br>
+repeate the test with llvm-ranlib<br>
+<br>
+RUN: rm -f %t.a<br>
+RUN: llvm-ar rcS %t.a %p/Inputs/trivial-object-test.elf-x86-64 %p/Inputs/trivial-object-test2.elf-x86-64<br>
+RUN: llvm-nm -s %t.a | FileCheck %s --check-prefix=NOMAP<br>
+<br>
+RUN: llvm-ranlib %t.a<br>
+RUN: llvm-nm -s %t.a | FileCheck %s<br>
<br>
Modified: llvm/trunk/tools/llvm-ar/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/CMakeLists.txt?rev=189489&r1=189488&r2=189489&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/CMakeLists.txt?rev=189489&r1=189488&r2=189489&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/tools/llvm-ar/CMakeLists.txt (original)<br>
+++ llvm/trunk/tools/llvm-ar/CMakeLists.txt Wed Aug 28 11:22:16 2013<br>
@@ -4,4 +4,22 @@ add_llvm_tool(llvm-ar<br>
   llvm-ar.cpp<br>
   )<br>
<br>
+# FIXME: this is duplicated from the clang CMakeLists.txt<br>
+# FIXME: bin/llvm-ranlib is not a valid build target with this setup (pr17024)<br>
+<br>
+if(UNIX)<br>
+  set(LLVM_LINK_OR_COPY create_symlink)<br>
+  set(llvm_ar_binary "llvm-ar${CMAKE_EXECUTABLE_SUFFIX}")<br>
+else()<br>
+  set(LLVM_LINK_OR_COPY copy)<br>
+  set(llvm_ar_binary "${LLVM_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/llvm-ar${CMAKE_EXECUTABLE_SUFFIX}")<br>
+endif()<br>
+<br>
+set(llvm_ranlib "${LLVM_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/llvm-ranlib${CMAKE_EXECUTABLE_SUFFIX}")<br>
+add_custom_command(TARGET llvm-ar POST_BUILD<br>
+    COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${llvm_ar_binary}" "${llvm_ranlib}")<br>
+<br>
+set_property(DIRECTORY APPEND<br>
+  PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${llvm_ranlib})<br>
+<br>
 # TODO: Support check-local.<br>
<br>
Modified: llvm/trunk/tools/llvm-ar/Makefile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/Makefile?rev=189489&r1=189488&r2=189489&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/Makefile?rev=189489&r1=189488&r2=189489&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/tools/llvm-ar/Makefile (original)<br>
+++ llvm/trunk/tools/llvm-ar/Makefile Wed Aug 28 11:22:16 2013<br>
@@ -9,6 +9,7 @@<br>
<br>
 LEVEL := ../..<br>
 TOOLNAME := llvm-ar<br>
+TOOLALIAS = llvm-ranlib<br>
 LINK_COMPONENTS := bitreader support object<br>
<br>
 # This tool has no plugins, optimize startup time.<br>
<br>
Modified: llvm/trunk/tools/llvm-ar/llvm-ar.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/llvm-ar.cpp?rev=189489&r1=189488&r2=189489&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-ar/llvm-ar.cpp?rev=189489&r1=189488&r2=189489&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/tools/llvm-ar/llvm-ar.cpp (original)<br>
+++ llvm/trunk/tools/llvm-ar/llvm-ar.cpp Wed Aug 28 11:22:16 2013<br>
@@ -63,20 +63,13 @@ static void failIfError(error_code EC, T<br>
   fail(Context + ": " + EC.message());<br>
 }<br>
<br>
-// Option for compatibility with AIX, not used but must allow it to be present.<br>
-static cl::opt<bool><br>
-X32Option ("X32_64", cl::Hidden,<br>
-            cl::desc("Ignored option for compatibility with AIX"));<br>
-<br>
-// llvm-ar operation code and modifier flags. This must come first.<br>
-static cl::opt<std::string><br>
-Options(cl::Positional, cl::Required, cl::desc("{operation}[modifiers]..."));<br>
-<br>
-// llvm-ar remaining positional arguments.<br>
+// llvm-ar/llvm-ranlib remaining positional arguments.<br>
 static cl::list<std::string><br>
 RestOfArgs(cl::Positional, cl::OneOrMore,<br>
     cl::desc("[relpos] [count] <archive-file> [members]..."));<br>
<br>
+std::string Options;<br>
+<br>
 // MoreHelp - Provide additional help output explaining the operations and<br>
 // modifiers of llvm-ar. This object instructs the CommandLine library<br>
 // to print the text of the constructor when the --help option is given.<br>
@@ -156,6 +149,13 @@ static void getRelPos() {<br>
   RestOfArgs.erase(RestOfArgs.begin());<br>
 }<br>
<br>
+static void getOptions() {<br>
+  if(RestOfArgs.size() == 0)<br>
+    show_help("Expected options");<br>
+  Options = RestOfArgs[0];<br>
+  RestOfArgs.erase(RestOfArgs.begin());<br>
+}<br>
+<br>
 // getArchive - Get the archive file name from the command line<br>
 static void getArchive() {<br>
   if(RestOfArgs.size() == 0)<br>
@@ -175,6 +175,7 @@ static void getMembers() {<br>
 // operation specified. Process all modifiers and check to make sure that<br>
 // constraints on modifier/operation pairs have not been violated.<br>
 static ArchiveOperation parseCommandLine() {<br>
+  getOptions();<br>
<br>
   // Keep track of number of operations. We can only specify one<br>
   // per execution.<br>
@@ -857,6 +858,9 @@ static void performOperation(ArchiveOper<br>
   llvm_unreachable("Unknown operation.");<br>
 }<br>
<br>
+static int ar_main(char **argv);<br>
+static int ranlib_main();<br>
+<br>
 // main - main program for llvm-ar .. see comments in the code<br>
 int main(int argc, char **argv) {<br>
   ToolName = argv[0];<br>
@@ -872,15 +876,35 @@ int main(int argc, char **argv) {<br>
     "  This program archives bitcode files into single libraries\n"<br>
   );<br>
<br>
+  if (ToolName.endswith("ar"))<br>
+    return ar_main(argv);<br>
+  if (ToolName.endswith("ranlib"))<br>
+    return ranlib_main();<br>
+  fail("Not ranlib or ar!");<br>
+}<br>
+<br>
+static int performOperation(ArchiveOperation Operation);<br>
+<br>
+int ranlib_main() {<br>
+  if (RestOfArgs.size() != 1)<br>
+    fail(ToolName + "takes just one archive as argument");<br>
+  ArchiveName = RestOfArgs[0];<br>
+  return performOperation(CreateSymTab);<br>
+}<br>
+<br>
+int ar_main(char **argv) {<br>
   // Do our own parsing of the command line because the CommandLine utility<br>
   // can't handle the grouped positional parameters without a dash.<br>
   ArchiveOperation Operation = parseCommandLine();<br>
+  return performOperation(Operation);<br>
+}<br>
<br>
+static int performOperation(ArchiveOperation Operation) {<br>
   // Create or open the archive object.<br>
   OwningPtr<MemoryBuffer> Buf;<br>
   error_code EC = MemoryBuffer::getFile(ArchiveName, Buf, -1, false);<br>
   if (EC && EC != llvm::errc::no_such_file_or_directory) {<br>
-    errs() << argv[0] << ": error opening '" << ArchiveName<br>
+    errs() << ToolName << ": error opening '" << ArchiveName<br>
            << "': " << EC.message() << "!\n";<br>
     return 1;<br>
   }<br>
@@ -889,7 +913,7 @@ int main(int argc, char **argv) {<br>
     object::Archive Archive(Buf.take(), EC);<br>
<br>
     if (EC) {<br>
-      errs() << argv[0] << ": error loading '" << ArchiveName<br>
+      errs() << ToolName << ": error loading '" << ArchiveName<br>
              << "': " << EC.message() << "!\n";<br>
       return 1;<br>
     }<br>
@@ -904,7 +928,7 @@ int main(int argc, char **argv) {<br>
   } else {<br>
     if (!Create) {<br>
       // Produce a warning if we should and we're creating the archive<br>
-      errs() << argv[0] << ": creating " << ArchiveName << "\n";<br>
+      errs() << ToolName << ": creating " << ArchiveName << "\n";<br>
     }<br>
   }<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div>Alexey Samsonov, MSK</div>
</div>