From c28016e4131bdd50c23510adb3a0254b7fb5adc6 Mon Sep 17 00:00:00 2001 From: Kevin Enderby Date: Thu, 19 Jun 2014 22:03:18 +0000 Subject: [PATCH] =?utf8?q?Change=20the=20output=20of=20llvm-nm=20and=20llv?= =?utf8?q?m-size=20for=20Mach-O=20universal=20files=20(aka=20fat=20files)?= =?utf8?q?=20to=20print=20=E2=80=9C=20(for=20architecture=20XYZ)=E2=80=9D?= =?utf8?q?=20for=20fat=20files=20with=20more=20than=20one=20architecture?= =?utf8?q?=20to=20be=20like=20what=20the=20darwin=20tools=20do=20for=20fat?= =?utf8?q?=20files.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Also clean up the Mach-O printing of archive membernames in llvm-nm to use the darwin form of "libx.a(foo.o)". git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211316 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/MachOUniversal.h | 4 ++++ lib/Object/MachOUniversal.cpp | 8 ++------ test/Object/nm-universal-binary.test | 8 ++++---- test/Object/size-trivial-macho.test | 8 ++++---- tools/llvm-nm/llvm-nm.cpp | 22 ++++++++++++++++++---- tools/llvm-size/llvm-size.cpp | 19 +++++++++++++++---- 6 files changed, 47 insertions(+), 22 deletions(-) diff --git a/include/llvm/Object/MachOUniversal.h b/include/llvm/Object/MachOUniversal.h index 47e93c26b46..74448f973b2 100644 --- a/include/llvm/Object/MachOUniversal.h +++ b/include/llvm/Object/MachOUniversal.h @@ -18,6 +18,7 @@ #include "llvm/ADT/Triple.h" #include "llvm/Object/Binary.h" #include "llvm/Object/Archive.h" +#include "llvm/Object/MachO.h" #include "llvm/Support/ErrorOr.h" #include "llvm/Support/MachO.h" @@ -52,6 +53,9 @@ public: ObjectForArch getNext() const { return ObjectForArch(Parent, Index + 1); } uint32_t getCPUType() const { return Header.cputype; } + std::string getArchTypeName() const { + return Triple::getArchTypeName(MachOObjectFile::getArch(Header.cputype)); + } std::error_code getAsObjectFile(std::unique_ptr &Result) const; diff --git a/lib/Object/MachOUniversal.cpp b/lib/Object/MachOUniversal.cpp index 05729ef7467..887e2bd0a34 100644 --- a/lib/Object/MachOUniversal.cpp +++ b/lib/Object/MachOUniversal.cpp @@ -72,9 +72,7 @@ std::error_code MachOUniversalBinary::ObjectForArch::getAsObjectFile( if (Parent) { StringRef ParentData = Parent->getData(); StringRef ObjectData = ParentData.substr(Header.offset, Header.size); - std::string ObjectName = - Parent->getFileName().str() + ":" + - Triple::getArchTypeName(MachOObjectFile::getArch(Header.cputype)); + std::string ObjectName = Parent->getFileName().str(); MemoryBuffer *ObjBuffer = MemoryBuffer::getMemBuffer( ObjectData, ObjectName, false); ErrorOr Obj = ObjectFile::createMachOObjectFile(ObjBuffer); @@ -91,9 +89,7 @@ std::error_code MachOUniversalBinary::ObjectForArch::getAsArchive( if (Parent) { StringRef ParentData = Parent->getData(); StringRef ObjectData = ParentData.substr(Header.offset, Header.size); - std::string ObjectName = - Parent->getFileName().str() + ":" + - Triple::getArchTypeName(MachOObjectFile::getArch(Header.cputype)); + std::string ObjectName = Parent->getFileName().str(); MemoryBuffer *ObjBuffer = MemoryBuffer::getMemBuffer( ObjectData, ObjectName, false); ErrorOr Obj = Archive::create(ObjBuffer); diff --git a/test/Object/nm-universal-binary.test b/test/Object/nm-universal-binary.test index c20c733dcd8..52781267c5c 100644 --- a/test/Object/nm-universal-binary.test +++ b/test/Object/nm-universal-binary.test @@ -3,17 +3,17 @@ RUN: | FileCheck %s -check-prefix CHECK-OBJ RUN: llvm-nm %p/Inputs/macho-universal-archive.x86_64.i386 \ RUN: | FileCheck %s -check-prefix CHECK-AR -CHECK-OBJ: macho-universal.x86_64.i386:x86_64 +CHECK-OBJ: macho-universal.x86_64.i386 (for architecture x86_64): CHECK-OBJ: 0000000100000f60 T _main -CHECK-OBJ: macho-universal.x86_64.i386:i386 +CHECK-OBJ: macho-universal.x86_64.i386 (for architecture i386): CHECK-OBJ: 00001fa0 T _main -CHECK-AR: macho-universal-archive.x86_64.i386:x86_64:hello.o: +CHECK-AR: macho-universal-archive.x86_64.i386(hello.o) (for architecture x86_64): CHECK-AR: 0000000000000068 s EH_frame0 CHECK-AR: 000000000000003b s L_.str CHECK-AR: 0000000000000000 T _main CHECK-AR: 0000000000000080 S _main.eh CHECK-AR: U _printf -CHECK-AR: macho-universal-archive.x86_64.i386:i386:foo.o: +CHECK-AR: macho-universal-archive.x86_64.i386(foo.o) (for architecture i386): CHECK-AR: 00000008 S _bar CHECK-AR: 00000000 T _foo diff --git a/test/Object/size-trivial-macho.test b/test/Object/size-trivial-macho.test index 1ed611b0de2..6602d565186 100644 --- a/test/Object/size-trivial-macho.test +++ b/test/Object/size-trivial-macho.test @@ -71,9 +71,9 @@ mxl: Segment __LINKEDIT: 0x1000 (vmaddr 0x100002000 fileoff 8192) mxl: total 0x100003000 u: __TEXT __DATA __OBJC others dec hex -u: 4096 0 0 4294971392 4294975488 100002000 {{.*}}/macho-universal.x86_64.i386:x86_64 -u: 4096 0 0 8192 12288 3000 {{.*}}/macho-universal.x86_64.i386:i386 +u: 4096 0 0 4294971392 4294975488 100002000 {{.*}}/macho-universal.x86_64.i386 (for architecture x86_64) +u: 4096 0 0 8192 12288 3000 {{.*}}/macho-universal.x86_64.i386 (for architecture i386) uAR: __TEXT __DATA __OBJC others dec hex -uAR: 136 0 0 32 168 a8 {{.*}}/macho-universal-archive.x86_64.i386:x86_64(hello.o) -uAR: 5 4 0 0 9 9 {{.*}}/macho-universal-archive.x86_64.i386:i386(foo.o) +uAR: 136 0 0 32 168 a8 {{.*}}/macho-universal-archive.x86_64.i386(hello.o) (for architecture x86_64) +uAR: 5 4 0 0 9 9 {{.*}}/macho-universal-archive.x86_64.i386(foo.o) (for architecture i386) diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index e605e6e430a..c6b80d1dd96 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -752,20 +752,28 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { if (ChildOrErr.getError()) continue; if (SymbolicFile *O = dyn_cast(&*ChildOrErr.get())) { - outs() << O->getFileName() << ":\n"; + if (isa(O)) { + outs() << Filename << "(" << O->getFileName() << ")"; + } else + outs() << O->getFileName(); + outs() << ":\n"; dumpSymbolNamesFromObject(O); } } return; } if (MachOUniversalBinary *UB = dyn_cast(Bin.get())) { + bool moreThanOneArch = UB->getNumberOfObjects() > 1; for (MachOUniversalBinary::object_iterator I = UB->begin_objects(), E = UB->end_objects(); I != E; ++I) { std::unique_ptr Obj; std::unique_ptr A; if (!I->getAsObjectFile(Obj)) { - outs() << Obj->getFileName() << ":\n"; + outs() << Obj->getFileName(); + if (isa(Obj.get()) && moreThanOneArch) + outs() << " (for architecture " << I->getArchTypeName() << ")"; + outs() << ":\n"; dumpSymbolNamesFromObject(Obj.get()); } else if (!I->getAsArchive(A)) { @@ -776,8 +784,14 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { if (ChildOrErr.getError()) continue; if (SymbolicFile *O = dyn_cast(&*ChildOrErr.get())) { - outs() << A->getFileName() << ":"; - outs() << O->getFileName() << ":\n"; + outs() << A->getFileName(); + if (isa(O)) { + outs() << "(" << O->getFileName() << ")"; + if (moreThanOneArch) + outs() << " (for architecture " << I->getArchTypeName() << ")"; + } else + outs() << ":" << O->getFileName(); + outs() << ":\n"; dumpSymbolNamesFromObject(O); } } diff --git a/tools/llvm-size/llvm-size.cpp b/tools/llvm-size/llvm-size.cpp index b3aaac8d27d..408bb4a1880 100644 --- a/tools/llvm-size/llvm-size.cpp +++ b/tools/llvm-size/llvm-size.cpp @@ -469,13 +469,20 @@ static void PrintFileSectionSizes(StringRef file) { std::unique_ptr UA; if (!I->getAsObjectFile(UO)) { if (ObjectFile *o = dyn_cast(&*UO.get())) { + MachOObjectFile *MachO = dyn_cast(o); if (OutputFormat == sysv) outs() << o->getFileName() << " :\n"; + else if(MachO && OutputFormat == darwin) { + if (moreThanOneFile || moreThanOneArch) + outs() << o->getFileName() << " (for architecture " + << I->getArchTypeName() << "):"; + outs() << "\n"; + } PrintObjectSectionSizes(o); if (OutputFormat == berkeley) { - MachOObjectFile *MachO = dyn_cast(o); if (!MachO || moreThanOneFile || moreThanOneArch) - outs() << o->getFileName(); + outs() << o->getFileName() << " (for architecture " + << I->getArchTypeName() << ")"; outs() << "\n"; } } @@ -495,11 +502,15 @@ static void PrintFileSectionSizes(StringRef file) { outs() << o->getFileName() << " (ex " << UA->getFileName() << "):\n"; else if(MachO && OutputFormat == darwin) - outs() << UA->getFileName() << "(" << o->getFileName() << "):\n"; + outs() << UA->getFileName() << "(" << o->getFileName() << ")" + << " (for architecture " << I->getArchTypeName() + << "):\n"; PrintObjectSectionSizes(o); if (OutputFormat == berkeley) { if (MachO) - outs() << UA->getFileName() << "(" << o->getFileName() << ")\n"; + outs() << UA->getFileName() << "(" << o->getFileName() << ")" + << " (for architecture " << I->getArchTypeName() + << ")\n"; else outs() << o->getFileName() << " (ex " << UA->getFileName() << ")\n"; -- 2.34.1