From 9142ae2cf802dbcd1c622154ac9b5305fb26c38f Mon Sep 17 00:00:00 2001 From: "Michael J. Spencer" Date: Tue, 27 Sep 2011 19:37:18 +0000 Subject: [PATCH] Add binary archive support to llvm-nm. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140627 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../TestObjectFiles/archive-test.a-bitcode | Bin 0 -> 790 bytes .../TestObjectFiles/archive-test.a-coff-i386 | Bin 0 -> 658 bytes test/Object/nm-archive.test | 17 ++++++++ tools/llvm-nm/llvm-nm.cpp | 37 +++++++++++++----- 4 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 test/Object/TestObjectFiles/archive-test.a-bitcode create mode 100644 test/Object/TestObjectFiles/archive-test.a-coff-i386 create mode 100644 test/Object/nm-archive.test diff --git a/test/Object/TestObjectFiles/archive-test.a-bitcode b/test/Object/TestObjectFiles/archive-test.a-bitcode new file mode 100644 index 0000000000000000000000000000000000000000..3aeb34fa334257f953f121226bba8fdb5cccd8f4 GIT binary patch literal 790 zcmZ8eO-vI}5T3T{zU@+A3k|jj;;UPUBu4vRYS6UZHM9{D6=R~8Zjlg!CI+NwxR_K=o=kdx=*8gKgU+s^fyumYX5KgNdz1IvLz&XO$t%2= z9vQhknjX6|n!XiJq(xuA7x4w7{y>D%a3~ZAA7U^_bqgD)gTez-$mFKVrQB>TlfRJ5 zT{O7A3ci4s(kR*?Mj|MQ77iV1D11WN`r@_$yaE7|0MLbzJQAPBcbOC`_@k?)s_pCv z&eg{}8&`#^=EQ1SqAK_ugPb$P`(;m(uertgP1WXdmpo*bvyZQ9>#@dx33XCV02X6g z^%vUdEyZM4DYrm>=%vL8%M_pkdH)&CO0x@9=$DgLYrovEO6~#An&3LgSzplUeXf>= zr%|)_+_qqMWLBmajZNKM@UY!4%Nv%Vjm5C~q&T_wFi9S)S)!k{uDvFEpph9$Dqd1D zl0vPcsF6AJCi_h#6~pySg;WGGs}W4FJa%L@Mk)#^YXp;ma+Fm%jk3!-rGd zyqQrk0o#opsz;!0j6wPP)@&~ONNvU1Kips>K3mI%f40AQx0l~E>wOstfZq+>O#Hka z8C*dTCM1{H>yYAww-x}Al?AS`v@I~hJ*^l3ZUMP2d~jqQ$GELctN`Zmj|s*Ar}oxc zz4sla%S+N=b!R1^lKD9@qxTf)pK*I)UijpM*0r$-b6px;ZI@r~2w%&>$KlZX>R`Lx G3cmsK8^=8W literal 0 HcmV?d00001 diff --git a/test/Object/TestObjectFiles/archive-test.a-coff-i386 b/test/Object/TestObjectFiles/archive-test.a-coff-i386 new file mode 100644 index 0000000000000000000000000000000000000000..846cd636f1ed8dbcbe94d2f7126dae79abcdb14d GIT binary patch literal 658 zcmY$iNi0gvu;bEKKm~@zhUSJQW)>EPsNx1tuAvD`Jb{aWfq@Z-|HS7eX67-FYLXGm zNQDG0urW~M7#X1Ep&3ZXWyVP6l@w)`WhUn6<|k#PCYR`zq!yRxCFiH5>1G;Rm@(+X zRYLp%GT8tKO-*5bgNhp%n3Wan2{1_D@?m6RSm)5^vl-}G4j={ry^_?55(pDa zssPCpAnt&QF#~A@hJXaUl*E!ms2GUi1>$8$d=S%tLEu318=m7XDqz!(vw#d^cmXH6 zffCI}cn zKq5ddAUTZ*$Y*8*ISvLuA`H-IfrtThF)=at#OoE86hTD5x)|aMN=u3%0$>uNlLbXY a9LS3g&d*KtFUd$Pax2YCF3HT#V*miHEnjT_ literal 0 HcmV?d00001 diff --git a/test/Object/nm-archive.test b/test/Object/nm-archive.test new file mode 100644 index 00000000000..da6144ee712 --- /dev/null +++ b/test/Object/nm-archive.test @@ -0,0 +1,17 @@ +RUN: llvm-nm %p/TestObjectFiles/archive-test.a-coff-i386 \ +RUN: | FileCheck %s -check-prefix COFF +RUN: llvm-nm %p/TestObjectFiles/archive-test.a-bitcode \ +RUN: | FileCheck %s -check-prefix BITCODE + + +COFF: trivial-object-test.coff-i386: +COFF-NEXT: 00000000 d .data +COFF-NEXT: 00000000 t .text +COFF-NEXT: 00000000 d L_.str +COFF-NEXT: U _SomeOtherFunction +COFF-NEXT: 00000000 T _main +COFF-NEXT: U _puts + +BITCODE: U SomeOtherFunction +BITCODE-NEXT: T main +BITCODE-NEXT: U puts diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index 71c02d130f0..b8ede8c0356 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -20,6 +20,7 @@ #include "llvm/Module.h" #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Bitcode/Archive.h" +#include "llvm/Object/Archive.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" @@ -318,18 +319,34 @@ static void DumpSymbolNamesFromFile(std::string &Filename) { errs() << ToolName << ": " << Filename << ": " << ErrorMessage << "\n"; } else if (aPath.isArchive()) { - std::string ErrMsg; - Archive* archive = Archive::OpenAndLoad(sys::Path(Filename), Context, - &ErrorMessage); - if (!archive) - errs() << ToolName << ": " << Filename << ": " << ErrorMessage << "\n"; - std::vector Modules; - if (archive->getAllModules(Modules, &ErrorMessage)) { - errs() << ToolName << ": " << Filename << ": " << ErrorMessage << "\n"; + OwningPtr arch; + if (error_code ec = object::createBinary(aPath.str(), arch)) { + errs() << ToolName << ": " << Filename << ": " << ec.message() << ".\n"; return; } - MultipleFiles = true; - std::for_each (Modules.begin(), Modules.end(), DumpSymbolNamesFromModule); + if (object::Archive *a = dyn_cast(arch.get())) { + for (object::Archive::child_iterator i = a->begin_children(), + e = a->end_children(); i != e; ++i) { + OwningPtr child; + if (error_code ec = i->getAsBinary(child)) { + // Try opening it as a bitcode file. + MemoryBuffer *buff = i->getBuffer(); + Module *Result = 0; + if (buff) + Result = ParseBitcodeFile(buff, Context, &ErrorMessage); + + if (Result) { + DumpSymbolNamesFromModule(Result); + delete Result; + } + continue; + } + if (object::ObjectFile *o = dyn_cast(child.get())) { + outs() << o->getFileName() << ":\n"; + DumpSymbolNamesFromObject(o); + } + } + } } else if (aPath.isObjectFile()) { OwningPtr obj; if (error_code ec = object::createBinary(aPath.str(), obj)) { -- 2.34.1