diff --git a/llvm/include/llvm/Object/TapiFile.h b/llvm/include/llvm/Object/TapiFile.h --- a/llvm/include/llvm/Object/TapiFile.h +++ b/llvm/include/llvm/Object/TapiFile.h @@ -41,6 +41,8 @@ static bool classof(const Binary *v) { return v->isTapiFile(); } + bool is64Bit() { return MachO::is64Bit(Arch); } + private: struct Symbol { StringRef Prefix; @@ -52,6 +54,7 @@ }; std::vector Symbols; + MachO::Architecture Arch; }; } // end namespace object. diff --git a/llvm/include/llvm/TextAPI/MachO/Architecture.h b/llvm/include/llvm/TextAPI/MachO/Architecture.h --- a/llvm/include/llvm/TextAPI/MachO/Architecture.h +++ b/llvm/include/llvm/TextAPI/MachO/Architecture.h @@ -39,6 +39,9 @@ /// Convert an architecture slice to a CPU Type and Subtype pair. std::pair getCPUTypeFromArchitecture(Architecture Arch); +/// Check if architecture is 64 bit +bool is64Bit(Architecture); + raw_ostream &operator<<(raw_ostream &OS, Architecture Arch); } // end namespace MachO. diff --git a/llvm/lib/Object/TapiFile.cpp b/llvm/lib/Object/TapiFile.cpp --- a/llvm/lib/Object/TapiFile.cpp +++ b/llvm/lib/Object/TapiFile.cpp @@ -40,7 +40,7 @@ TapiFile::TapiFile(MemoryBufferRef Source, const InterfaceFile &interface, Architecture Arch) - : SymbolicFile(ID_TapiFile, Source) { + : SymbolicFile(ID_TapiFile, Source), Arch(Arch) { for (const auto *Symbol : interface.symbols()) { if (!Symbol->getArchitectures().has(Arch)) continue; diff --git a/llvm/lib/TextAPI/MachO/Architecture.cpp b/llvm/lib/TextAPI/MachO/Architecture.cpp --- a/llvm/lib/TextAPI/MachO/Architecture.cpp +++ b/llvm/lib/TextAPI/MachO/Architecture.cpp @@ -11,6 +11,7 @@ //===----------------------------------------------------------------------===// #include "llvm/TextAPI/MachO/Architecture.h" +#include "llvm/TextAPI/MachO/ArchitectureSet.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/BinaryFormat/MachO.h" @@ -68,6 +69,10 @@ return std::make_pair(0, 0); } +bool is64Bit(Architecture Arch) { + return ArchitectureSet({AK_arm64, AK_x86_64, AK_x86_64h}).has(Arch); +} + raw_ostream &operator<<(raw_ostream &OS, Architecture Arch) { OS << getArchitectureName(Arch); return OS; diff --git a/llvm/test/Object/nm-tapi.test b/llvm/test/Object/nm-tapi.test --- a/llvm/test/Object/nm-tapi.test +++ b/llvm/test/Object/nm-tapi.test @@ -22,9 +22,9 @@ v2: 00000000 S _sym3 v2: tapi-v2.tbd (for architecture arm64): v2: U _sym -v2: 00000000 S _sym1 -v2: 00000000 S _sym2 -v2: 00000000 S _sym3 +v2: 0000000000000000 S _sym1 +v2: 0000000000000000 S _sym2 +v2: 0000000000000000 S _sym3 v3: tapi-v3.tbd (for architecture i386): v3: 00000000 S _OBJC_CLASS_$_NSBlockPredicate diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -338,8 +338,8 @@ return false; if (isa(Obj)) return false; - if (isa(Obj)) - return false; + if (TapiFile *Tapi = dyn_cast(&Obj)) + return Tapi->is64Bit(); if (MachOObjectFile *MachO = dyn_cast(&Obj)) return MachO->is64Bit(); return cast(Obj).getBytesInAddress() == 8;