Index: include/llvm/Object/MachOUniversal.h =================================================================== --- include/llvm/Object/MachOUniversal.h +++ include/llvm/Object/MachOUniversal.h @@ -18,6 +18,7 @@ #include "llvm/ADT/iterator_range.h" #include "llvm/Object/Archive.h" #include "llvm/Object/Binary.h" +#include "llvm/Object/IRObjectFile.h" #include "llvm/Object/MachO.h" #include "llvm/Support/ErrorOr.h" #include "llvm/Support/MachO.h" @@ -65,6 +66,9 @@ ErrorOr> getAsObjectFile() const; + ErrorOr> + getAsIRObjectFile(LLVMContext *Context) const; + ErrorOr> getAsArchive() const; }; Index: lib/Object/MachOUniversal.cpp =================================================================== --- lib/Object/MachOUniversal.cpp +++ lib/Object/MachOUniversal.cpp @@ -79,6 +79,22 @@ return expectedToErrorOr(ObjectFile::createMachOObjectFile(ObjBuffer)); } +ErrorOr> +MachOUniversalBinary::ObjectForArch::getAsIRObjectFile(LLVMContext *Context) +const { + if (!Parent) + return object_error::parse_failed; + if (!Context) + return object_error::invalid_file_type; + + StringRef ParentData = Parent->getData(); + StringRef ObjectData = ParentData.substr(Header.offset, Header.size); + StringRef ObjectName = Parent->getFileName(); + MemoryBufferRef ObjBuffer(ObjectData, ObjectName); + + return IRObjectFile::create(ObjBuffer, *Context); +} + ErrorOr> MachOUniversalBinary::ObjectForArch::getAsArchive() const { if (!Parent) Index: test/tools/llvm-nm/X86/machOUnivIR.test =================================================================== --- /dev/null +++ test/tools/llvm-nm/X86/machOUnivIR.test @@ -0,0 +1,23 @@ +# RUN: llvm-nm -m -arch all %p/Inputs/test.macho-univ.IRobj-x86_64-i386 | FileCheck %s + +# CHECK: Inputs/test.macho-univ.IRobj-x86_64-i386 (for architecture x86_64): +# CHECK: ---------------- (LTO,RODATA) external _global_const +# CHECK: ---------------- (LTO,DATA) external _global_data +# CHECK: ---------------- (LTO,CODE) external _global_func +# CHECK: ---------------- (LTO,RODATA) private external _hidden_const +# CHECK: ---------------- (LTO,DATA) private external _hidden_data +# CHECK: ---------------- (LTO,CODE) private external _hidden_func +# CHECK: ---------------- (LTO,RODATA) non-external _static_const +# CHECK: ---------------- (LTO,DATA) non-external _static_data +# CHECK: ---------------- (LTO,CODE) non-external _static_func + +# CHECK: Inputs/test.macho-univ.IRobj-x86_64-i386 (for architecture i386): +# CHECK: -------- (LTO,RODATA) external _global_const +# CHECK: -------- (LTO,DATA) external _global_data +# CHECK: -------- (LTO,CODE) external _global_func +# CHECK: -------- (LTO,RODATA) private external _hidden_const +# CHECK: -------- (LTO,DATA) private external _hidden_data +# CHECK: -------- (LTO,CODE) private external _hidden_func +# CHECK: -------- (LTO,RODATA) non-external _static_const +# CHECK: -------- (LTO,DATA) non-external _static_data +# CHECK: -------- (LTO,CODE) non-external _static_func Index: test/tools/llvm-nm/X86/machOUnivNative.test =================================================================== --- /dev/null +++ test/tools/llvm-nm/X86/machOUnivNative.test @@ -0,0 +1,23 @@ +# RUN: llvm-nm -m -arch all %p/Inputs/test.macho-univ.x86_64-i386 | FileCheck %s + +# CHECK: Inputs/test.macho-univ.x86_64-i386 (for architecture x86_64): +# CHECK: 0000000000000046 (__TEXT,__const) external _global_const +# CHECK: 0000000000000054 (__DATA,__data) external _global_data +# CHECK: 0000000000000000 (__TEXT,__text) external _global_func +# CHECK: 000000000000004a (__TEXT,__const) private external _hidden_const +# CHECK: 0000000000000058 (__DATA,__data) private external _hidden_data +# CHECK: 0000000000000010 (__TEXT,__text) private external _hidden_func +# CHECK: 000000000000004e (__TEXT,__const) non-external _static_const +# CHECK: 000000000000005c (__DATA,__data) non-external _static_data +# CHECK: 0000000000000040 (__TEXT,__text) non-external _static_func + +# CHECK: Inputs/test.macho-univ.x86_64-i386 (for architecture i386): +# CHECK: 00000035 (__TEXT,__const) external _global_const +# CHECK: 00000044 (__DATA,__data) external _global_data +# CHECK: 00000000 (__TEXT,__text) external _global_func +# CHECK: 00000039 (__TEXT,__const) private external _hidden_const +# CHECK: 00000048 (__DATA,__data) private external _hidden_data +# CHECK: 00000010 (__TEXT,__text) private external _hidden_func +# CHECK: 0000003d (__TEXT,__const) non-external _static_const +# CHECK: 0000004c (__DATA,__data) non-external _static_data +# CHECK: 00000030 (__TEXT,__text) non-external _static_func Index: tools/llvm-nm/llvm-nm.cpp =================================================================== --- tools/llvm-nm/llvm-nm.cpp +++ tools/llvm-nm/llvm-nm.cpp @@ -1177,6 +1177,22 @@ ArchitectureName); } } + } else { + ErrorOr> IRObjOrErr = + I->getAsIRObjectFile(NoLLVMBitcode ? nullptr : &Context); + if (error(IRObjOrErr.getError(), Filename)) + return; + IRObjectFile &IR = *IRObjOrErr.get(); + if (ArchFlags.size() > 1) { + if (PrintFileName) + ArchitectureName = I->getArchTypeName(); + else + outs() << "\n" << IR.getFileName() << " (for architecture " + << I->getArchTypeName() << ")" + << ":\n"; + } + dumpSymbolNamesFromObject(IR, false, ArchiveName, + ArchitectureName); } } } @@ -1230,6 +1246,13 @@ dumpSymbolNamesFromObject(*O, false, ArchiveName); } } + } else { + ErrorOr> IRObjOrErr = + I->getAsIRObjectFile(NoLLVMBitcode ? nullptr : &Context); + if (error(IRObjOrErr.getError(), Filename)) + return; + IRObjectFile &IR = *IRObjOrErr.get(); + dumpSymbolNamesFromObject(IR, false); } return; } @@ -1293,6 +1316,24 @@ dumpSymbolNamesFromObject(*O, false, ArchiveName, ArchitectureName); } } + } else { + ErrorOr> IRObjOrErr = + I->getAsIRObjectFile(NoLLVMBitcode ? nullptr : &Context); + if (error(IRObjOrErr.getError(), Filename)) + return; + IRObjectFile &IR = *IRObjOrErr.get(); + if (PrintFileName) { + if (moreThanOneArch) + ArchitectureName = I->getArchTypeName(); + } else { + if (moreThanOneArch) + outs() << "\n"; + outs() << IR.getFileName(); + if (moreThanOneArch) + outs() << " (for architecture " << I->getArchTypeName() << ")"; + outs() << ":\n"; + } + dumpSymbolNamesFromObject(IR, false, ArchiveName, ArchitectureName); } } return;