<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>