From: Saleem Abdulrasool Date: Sun, 12 Feb 2017 18:55:33 +0000 (+0000) Subject: llvm-readobj: process FreeBSD core notes X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=99725470ee94af980ce869d7ef1f897f8e6cb65a;p=llvm llvm-readobj: process FreeBSD core notes core files on FreeBSD have additional notes to capture state. Process those notes when dumping the notes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294909 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Support/ELF.h b/include/llvm/Support/ELF.h index 489d821b749..dad9c2f990b 100644 --- a/include/llvm/Support/ELF.h +++ b/include/llvm/Support/ELF.h @@ -1313,6 +1313,19 @@ enum { enum { VER_NEED_NONE = 0, VER_NEED_CURRENT = 1 }; // SHT_NOTE section types +enum { + NT_FREEBSD_THRMISC = 7, + NT_FREEBSD_PROCSTAT_PROC = 8, + NT_FREEBSD_PROCSTAT_FILES = 9, + NT_FREEBSD_PROCSTAT_VMMAP = 10, + NT_FREEBSD_PROCSTAT_GROUPS = 11, + NT_FREEBSD_PROCSTAT_UMASK = 12, + NT_FREEBSD_PROCSTAT_RLIMIT = 13, + NT_FREEBSD_PROCSTAT_OSREL = 14, + NT_FREEBSD_PROCSTAT_PSSTRINGS = 15, + NT_FREEBSD_PROCSTAT_AUXV = 16, +}; + enum { NT_GNU_ABI_TAG = 1, NT_GNU_HWCAP = 2, diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index 109dde142ef..2ebe44bdcfe 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/tools/llvm-readobj/ELFDumper.cpp @@ -3337,6 +3337,34 @@ static std::string getGNUNoteTypeName(const uint32_t NT) { return string; } +static std::string getFreeBSDNoteTypeName(const uint32_t NT) { + static const struct { + uint32_t ID; + const char *Name; + } Notes[] = { + {ELF::NT_FREEBSD_THRMISC, "NT_THRMISC (thrmisc structure)"}, + {ELF::NT_FREEBSD_PROCSTAT_PROC, "NT_PROCSTAT_PROC (proc data)"}, + {ELF::NT_FREEBSD_PROCSTAT_FILES, "NT_PROCSTAT_FILES (files data)"}, + {ELF::NT_FREEBSD_PROCSTAT_VMMAP, "NT_PROCSTAT_VMMAP (vmmap data)"}, + {ELF::NT_FREEBSD_PROCSTAT_GROUPS, "NT_PROCSTAT_GROUPS (groups data)"}, + {ELF::NT_FREEBSD_PROCSTAT_UMASK, "NT_PROCSTAT_UMASK (umask data)"}, + {ELF::NT_FREEBSD_PROCSTAT_RLIMIT, "NT_PROCSTAT_RLIMIT (rlimit data)"}, + {ELF::NT_FREEBSD_PROCSTAT_OSREL, "NT_PROCSTAT_OSREL (osreldate data)"}, + {ELF::NT_FREEBSD_PROCSTAT_PSSTRINGS, + "NT_PROCSTAT_PSSTRINGS (ps_strings data)"}, + {ELF::NT_FREEBSD_PROCSTAT_AUXV, "NT_PROCSTAT_AUXV (auxv data)"}, + }; + + for (const auto &Note : Notes) + if (Note.ID == NT) + return std::string(Note.Name); + + std::string string; + raw_string_ostream OS(string); + OS << format("Unknown note type (0x%08x)", NT); + return string; +} + template static void printGNUNote(raw_ostream &OS, uint32_t NoteType, ArrayRef::Elf_Word> Words) { @@ -3416,6 +3444,8 @@ void GNUStyle::printNotes(const ELFFile *Obj) { if (Name == "GNU") { OS << getGNUNoteTypeName(Type) << '\n'; printGNUNote(OS, Type, Descriptor); + } else if (Name == "FreeBSD") { + OS << getFreeBSDNoteTypeName(Type) << '\n'; } else { OS << "Unknown note type: (" << format_hex(Type, 10) << ')'; }