File indexing completed on 2026-05-10 08:43:22
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_BITCODE_BITCODEREADER_H
0014 #define LLVM_BITCODE_BITCODEREADER_H
0015
0016 #include "llvm/ADT/ArrayRef.h"
0017 #include "llvm/ADT/StringRef.h"
0018 #include "llvm/Bitstream/BitCodeEnums.h"
0019 #include "llvm/IR/GlobalValue.h"
0020 #include "llvm/Support/Endian.h"
0021 #include "llvm/Support/Error.h"
0022 #include "llvm/Support/ErrorOr.h"
0023 #include "llvm/Support/MemoryBufferRef.h"
0024 #include <cstdint>
0025 #include <memory>
0026 #include <optional>
0027 #include <string>
0028 #include <system_error>
0029 #include <vector>
0030 namespace llvm {
0031
0032 class LLVMContext;
0033 class Module;
0034 class MemoryBuffer;
0035 class Metadata;
0036 class ModuleSummaryIndex;
0037 class Type;
0038 class Value;
0039
0040
0041
0042
0043
0044 typedef std::function<std::optional<std::string>(StringRef, StringRef)>
0045 DataLayoutCallbackFuncTy;
0046
0047 typedef std::function<Type *(unsigned)> GetTypeByIDTy;
0048
0049 typedef std::function<unsigned(unsigned, unsigned)> GetContainedTypeIDTy;
0050
0051 typedef std::function<void(Value *, unsigned, GetTypeByIDTy,
0052 GetContainedTypeIDTy)>
0053 ValueTypeCallbackTy;
0054
0055 typedef std::function<void(Metadata **, unsigned, GetTypeByIDTy,
0056 GetContainedTypeIDTy)>
0057 MDTypeCallbackTy;
0058
0059
0060
0061
0062
0063 std::error_code errorToErrorCodeAndEmitErrors(LLVMContext &Ctx, Error Err);
0064
0065 template <typename T>
0066 ErrorOr<T> expectedToErrorOrAndEmitErrors(LLVMContext &Ctx, Expected<T> Val) {
0067 if (!Val)
0068 return errorToErrorCodeAndEmitErrors(Ctx, Val.takeError());
0069 return std::move(*Val);
0070 }
0071
0072 struct ParserCallbacks {
0073 std::optional<DataLayoutCallbackFuncTy> DataLayout;
0074
0075
0076
0077
0078
0079
0080
0081 std::optional<ValueTypeCallbackTy> ValueType;
0082
0083 std::optional<MDTypeCallbackTy> MDType;
0084
0085 ParserCallbacks() = default;
0086 explicit ParserCallbacks(DataLayoutCallbackFuncTy DataLayout)
0087 : DataLayout(DataLayout) {}
0088 };
0089
0090 struct BitcodeFileContents;
0091
0092
0093 struct BitcodeLTOInfo {
0094 bool IsThinLTO;
0095 bool HasSummary;
0096 bool EnableSplitLTOUnit;
0097 bool UnifiedLTO;
0098 };
0099
0100
0101 class BitcodeModule {
0102
0103 ArrayRef<uint8_t> Buffer;
0104 StringRef ModuleIdentifier;
0105
0106
0107 StringRef Strtab;
0108
0109
0110 uint64_t IdentificationBit;
0111
0112
0113 uint64_t ModuleBit;
0114
0115 BitcodeModule(ArrayRef<uint8_t> Buffer, StringRef ModuleIdentifier,
0116 uint64_t IdentificationBit, uint64_t ModuleBit)
0117 : Buffer(Buffer), ModuleIdentifier(ModuleIdentifier),
0118 IdentificationBit(IdentificationBit), ModuleBit(ModuleBit) {}
0119
0120
0121 friend Expected<BitcodeFileContents>
0122 getBitcodeFileContents(MemoryBufferRef Buffer);
0123
0124 Expected<std::unique_ptr<Module>>
0125 getModuleImpl(LLVMContext &Context, bool MaterializeAll,
0126 bool ShouldLazyLoadMetadata, bool IsImporting,
0127 ParserCallbacks Callbacks = {});
0128
0129 public:
0130 StringRef getBuffer() const {
0131 return StringRef((const char *)Buffer.begin(), Buffer.size());
0132 }
0133
0134 StringRef getStrtab() const { return Strtab; }
0135
0136 StringRef getModuleIdentifier() const { return ModuleIdentifier; }
0137
0138
0139
0140
0141
0142 Expected<std::unique_ptr<Module>>
0143 getLazyModule(LLVMContext &Context, bool ShouldLazyLoadMetadata,
0144 bool IsImporting, ParserCallbacks Callbacks = {});
0145
0146
0147 Expected<std::unique_ptr<Module>>
0148 parseModule(LLVMContext &Context, ParserCallbacks Callbacks = {});
0149
0150
0151
0152 Expected<BitcodeLTOInfo> getLTOInfo();
0153
0154
0155 Expected<std::unique_ptr<ModuleSummaryIndex>> getSummary();
0156
0157
0158
0159 Error
0160 readSummary(ModuleSummaryIndex &CombinedIndex, StringRef ModulePath,
0161 std::function<bool(GlobalValue::GUID)> IsPrevailing = nullptr);
0162 };
0163
0164 struct BitcodeFileContents {
0165 std::vector<BitcodeModule> Mods;
0166 StringRef Symtab, StrtabForSymtab;
0167 };
0168
0169
0170
0171
0172
0173
0174 Expected<BitcodeFileContents> getBitcodeFileContents(MemoryBufferRef Buffer);
0175
0176
0177 Expected<std::vector<BitcodeModule>>
0178 getBitcodeModuleList(MemoryBufferRef Buffer);
0179
0180
0181
0182
0183
0184 Expected<std::unique_ptr<Module>>
0185 getLazyBitcodeModule(MemoryBufferRef Buffer, LLVMContext &Context,
0186 bool ShouldLazyLoadMetadata = false,
0187 bool IsImporting = false,
0188 ParserCallbacks Callbacks = {});
0189
0190
0191
0192
0193
0194 Expected<std::unique_ptr<Module>> getOwningLazyBitcodeModule(
0195 std::unique_ptr<MemoryBuffer> &&Buffer, LLVMContext &Context,
0196 bool ShouldLazyLoadMetadata = false, bool IsImporting = false,
0197 ParserCallbacks Callbacks = {});
0198
0199
0200
0201
0202 Expected<std::string> getBitcodeTargetTriple(MemoryBufferRef Buffer);
0203
0204
0205
0206 Expected<bool> isBitcodeContainingObjCCategory(MemoryBufferRef Buffer);
0207
0208
0209
0210
0211 Expected<std::string> getBitcodeProducerString(MemoryBufferRef Buffer);
0212
0213
0214 Expected<std::unique_ptr<Module>>
0215 parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context,
0216 ParserCallbacks Callbacks = {});
0217
0218
0219 Expected<BitcodeLTOInfo> getBitcodeLTOInfo(MemoryBufferRef Buffer);
0220
0221
0222 Expected<std::unique_ptr<ModuleSummaryIndex>>
0223 getModuleSummaryIndex(MemoryBufferRef Buffer);
0224
0225
0226 Error readModuleSummaryIndex(MemoryBufferRef Buffer,
0227 ModuleSummaryIndex &CombinedIndex);
0228
0229
0230
0231
0232
0233 Expected<std::unique_ptr<ModuleSummaryIndex>>
0234 getModuleSummaryIndexForFile(StringRef Path,
0235 bool IgnoreEmptyThinLTOIndexFile = false);
0236
0237
0238
0239 inline bool isBitcodeWrapper(const unsigned char *BufPtr,
0240 const unsigned char *BufEnd) {
0241
0242
0243 return BufPtr != BufEnd &&
0244 BufPtr[0] == 0xDE &&
0245 BufPtr[1] == 0xC0 &&
0246 BufPtr[2] == 0x17 &&
0247 BufPtr[3] == 0x0B;
0248 }
0249
0250
0251
0252 inline bool isRawBitcode(const unsigned char *BufPtr,
0253 const unsigned char *BufEnd) {
0254
0255
0256 return BufPtr != BufEnd &&
0257 BufPtr[0] == 'B' &&
0258 BufPtr[1] == 'C' &&
0259 BufPtr[2] == 0xc0 &&
0260 BufPtr[3] == 0xde;
0261 }
0262
0263
0264
0265 inline bool isBitcode(const unsigned char *BufPtr,
0266 const unsigned char *BufEnd) {
0267 return isBitcodeWrapper(BufPtr, BufEnd) ||
0268 isRawBitcode(BufPtr, BufEnd);
0269 }
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287 inline bool SkipBitcodeWrapperHeader(const unsigned char *&BufPtr,
0288 const unsigned char *&BufEnd,
0289 bool VerifyBufferSize) {
0290
0291 if (unsigned(BufEnd - BufPtr) < BWH_SizeField + 4)
0292 return true;
0293
0294 unsigned Offset = support::endian::read32le(&BufPtr[BWH_OffsetField]);
0295 unsigned Size = support::endian::read32le(&BufPtr[BWH_SizeField]);
0296 uint64_t BitcodeOffsetEnd = (uint64_t)Offset + (uint64_t)Size;
0297
0298
0299 if (VerifyBufferSize && BitcodeOffsetEnd > uint64_t(BufEnd-BufPtr))
0300 return true;
0301 BufPtr += Offset;
0302 BufEnd = BufPtr+Size;
0303 return false;
0304 }
0305
0306 APInt readWideAPInt(ArrayRef<uint64_t> Vals, unsigned TypeBits);
0307
0308 const std::error_category &BitcodeErrorCategory();
0309 enum class BitcodeError { CorruptedBitcode = 1 };
0310 inline std::error_code make_error_code(BitcodeError E) {
0311 return std::error_code(static_cast<int>(E), BitcodeErrorCategory());
0312 }
0313
0314 }
0315
0316 namespace std {
0317
0318 template <> struct is_error_code_enum<llvm::BitcodeError> : std::true_type {};
0319
0320 }
0321
0322 #endif