Skip to content

Commit a51883c

Browse files
committedApr 7, 2019
[LLVM-C] Allow Access to the Type of a Binary
Summary: Add an accessor for the type of a binary file. Reviewers: whitequark, deadalnix Reviewed By: whitequark Subscribers: hiraditya, aheejin, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D60366 llvm-svn: 357872
1 parent bad648a commit a51883c

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed
 

‎llvm/include/llvm-c/Object.h

+26
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,24 @@ typedef struct LLVMOpaqueSectionIterator *LLVMSectionIteratorRef;
3939
typedef struct LLVMOpaqueSymbolIterator *LLVMSymbolIteratorRef;
4040
typedef struct LLVMOpaqueRelocationIterator *LLVMRelocationIteratorRef;
4141

42+
typedef enum {
43+
LLVMBinaryTypeArchive, /**< Archive file. */
44+
LLVMBinaryTypeMachOUniversalBinary, /**< Mach-O Universal Binary file. */
45+
LLVMBinaryTypeCOFFImportFile, /**< COFF Import file. */
46+
LLVMBinaryTypeIR, /**< LLVM IR. */
47+
LLVMBinaryTypeWinRes, /**< Windows resource (.res) file. */
48+
LLVMBinaryTypeCOFF, /**< COFF Object file. */
49+
LLVMBinaryTypeELF32L, /**< ELF 32-bit, little endian. */
50+
LLVMBinaryTypeELF32B, /**< ELF 32-bit, big endian. */
51+
LLVMBinaryTypeELF64L, /**< ELF 64-bit, little endian. */
52+
LLVMBinaryTypeELF64B, /**< ELF 64-bit, big endian. */
53+
LLVMBinaryTypeMachO32L, /**< MachO 32-bit, little endian. */
54+
LLVMBinaryTypeMachO32B, /**< MachO 32-bit, big endian. */
55+
LLVMBinaryTypeMachO64L, /**< MachO 64-bit, little endian. */
56+
LLVMBinaryTypeMachO64B, /**< MachO 64-bit, big endian. */
57+
LLVMBinaryTypeWasm, /**< Web Assembly. */
58+
} LLVMBinaryType;
59+
4260
/**
4361
* Create a binary file from the given memory buffer.
4462
*
@@ -78,6 +96,14 @@ void LLVMDisposeBinary(LLVMBinaryRef BR);
7896
*/
7997
LLVMMemoryBufferRef LLVMBinaryCopyMemoryBuffer(LLVMBinaryRef BR);
8098

99+
/**
100+
* Retrieve the specific type of a binary.
101+
*
102+
* @see llvm::object::Binary::getType
103+
*/
104+
LLVMBinaryType LLVMBinaryGetType(LLVMBinaryRef BR);
105+
106+
81107
// ObjectFile creation
82108
LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf);
83109
void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile);

‎llvm/lib/Object/Object.cpp

+46
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,52 @@ void LLVMDisposeBinary(LLVMBinaryRef BR) {
8585
delete unwrap(BR);
8686
}
8787

88+
LLVMBinaryType LLVMBinaryGetType(LLVMBinaryRef BR) {
89+
class BinaryTypeMapper final : public Binary {
90+
public:
91+
static LLVMBinaryType mapBinaryTypeToLLVMBinaryType(unsigned Kind) {
92+
switch (Kind) {
93+
case ID_Archive:
94+
return LLVMBinaryTypeArchive;
95+
case ID_MachOUniversalBinary:
96+
return LLVMBinaryTypeMachOUniversalBinary;
97+
case ID_COFFImportFile:
98+
return LLVMBinaryTypeCOFFImportFile;
99+
case ID_IR:
100+
return LLVMBinaryTypeIR;
101+
case ID_WinRes:
102+
return LLVMBinaryTypeWinRes;
103+
case ID_COFF:
104+
return LLVMBinaryTypeCOFF;
105+
case ID_ELF32L:
106+
return LLVMBinaryTypeELF32L;
107+
case ID_ELF32B:
108+
return LLVMBinaryTypeELF32B;
109+
case ID_ELF64L:
110+
return LLVMBinaryTypeELF64L;
111+
case ID_ELF64B:
112+
return LLVMBinaryTypeELF64B;
113+
case ID_MachO32L:
114+
return LLVMBinaryTypeMachO32L;
115+
case ID_MachO32B:
116+
return LLVMBinaryTypeMachO32B;
117+
case ID_MachO64L:
118+
return LLVMBinaryTypeMachO64L;
119+
case ID_MachO64B:
120+
return LLVMBinaryTypeMachO64B;
121+
case ID_Wasm:
122+
return LLVMBinaryTypeWasm;
123+
case ID_StartObjects:
124+
case ID_EndObjects:
125+
llvm_unreachable("Marker types are not valid binary kinds!");
126+
default:
127+
llvm_unreachable("Unknown binary kind!");
128+
}
129+
}
130+
};
131+
return BinaryTypeMapper::mapBinaryTypeToLLVMBinaryType(unwrap(BR)->getType());
132+
}
133+
88134
// ObjectFile creation
89135
LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) {
90136
std::unique_ptr<MemoryBuffer> Buf(unwrap(MemBuf));

0 commit comments

Comments
 (0)
Please sign in to comment.