Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit 99c7fec

Browse files
committed
Update getLazyBitcodeModule to use ErrorOr for error handling.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199125 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 36713c2 commit 99c7fec

File tree

7 files changed

+41
-34
lines changed

7 files changed

+41
-34
lines changed

include/llvm/Bitcode/ReaderWriter.h

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#ifndef LLVM_BITCODE_READERWRITER_H
1515
#define LLVM_BITCODE_READERWRITER_H
1616

17+
#include "llvm/Support/ErrorOr.h"
1718
#include <string>
1819

1920
namespace llvm {
@@ -25,14 +26,11 @@ namespace llvm {
2526
class ModulePass;
2627
class raw_ostream;
2728

28-
/// getLazyBitcodeModule - Read the header of the specified bitcode buffer
29-
/// and prepare for lazy deserialization of function bodies. If successful,
30-
/// this takes ownership of 'buffer' and returns a non-null pointer. On
31-
/// error, this returns null, *does not* take ownership of Buffer, and fills
32-
/// in *ErrMsg with an error description if ErrMsg is non-null.
33-
Module *getLazyBitcodeModule(MemoryBuffer *Buffer,
34-
LLVMContext &Context,
35-
std::string *ErrMsg = 0);
29+
/// Read the header of the specified bitcode buffer and prepare for lazy
30+
/// deserialization of function bodies. If successful, this takes ownership
31+
/// of 'buffer. On error, this *does not* take ownership of Buffer.
32+
ErrorOr<Module *> getLazyBitcodeModule(MemoryBuffer *Buffer,
33+
LLVMContext &Context);
3634

3735
/// getStreamedBitcodeModule - Read the header of the specified stream
3836
/// and prepare for lazy deserialization and streaming of function bodies.

lib/Bitcode/Reader/BitReader.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,18 @@ LLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef,
5151
LLVMModuleRef *OutM,
5252
char **OutMessage) {
5353
std::string Message;
54+
ErrorOr<Module *> ModuleOrErr =
55+
getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef));
5456

55-
*OutM = wrap(getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef),
56-
&Message));
57-
if (!*OutM) {
57+
if (error_code EC = ModuleOrErr.getError()) {
58+
*OutM = wrap((Module *)NULL);
5859
if (OutMessage)
59-
*OutMessage = strdup(Message.c_str());
60+
*OutMessage = strdup(EC.message().c_str());
6061
return 1;
6162
}
6263

64+
*OutM = wrap(ModuleOrErr.get());
65+
6366
return 0;
6467

6568
}

lib/Bitcode/Reader/BitcodeReader.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3274,18 +3274,14 @@ const error_category &BitcodeReader::BitcodeErrorCategory() {
32743274

32753275
/// getLazyBitcodeModule - lazy function-at-a-time loading from a file.
32763276
///
3277-
Module *llvm::getLazyBitcodeModule(MemoryBuffer *Buffer,
3278-
LLVMContext& Context,
3279-
std::string *ErrMsg) {
3277+
ErrorOr<Module *> llvm::getLazyBitcodeModule(MemoryBuffer *Buffer,
3278+
LLVMContext &Context) {
32803279
Module *M = new Module(Buffer->getBufferIdentifier(), Context);
32813280
BitcodeReader *R = new BitcodeReader(Buffer, Context);
32823281
M->setMaterializer(R);
32833282
if (error_code EC = R->ParseBitcodeInto(M)) {
3284-
if (ErrMsg)
3285-
*ErrMsg = EC.message();
3286-
32873283
delete M; // Also deletes R.
3288-
return 0;
3284+
return EC;
32893285
}
32903286
// Have the BitcodeReader dtor delete 'Buffer'.
32913287
R->setBufferOwned(true);
@@ -3317,8 +3313,13 @@ Module *llvm::getStreamedBitcodeModule(const std::string &name,
33173313
/// If an error occurs, return null and fill in *ErrMsg if non-null.
33183314
Module *llvm::ParseBitcodeFile(MemoryBuffer *Buffer, LLVMContext& Context,
33193315
std::string *ErrMsg){
3320-
Module *M = getLazyBitcodeModule(Buffer, Context, ErrMsg);
3321-
if (!M) return 0;
3316+
ErrorOr<Module *> ModuleOrErr = getLazyBitcodeModule(Buffer, Context);
3317+
if (error_code EC = ModuleOrErr.getError()) {
3318+
if (ErrMsg)
3319+
*ErrMsg = EC.message();
3320+
return 0;
3321+
}
3322+
Module *M = ModuleOrErr.get();
33223323

33233324
// Don't let the BitcodeReader dtor delete 'Buffer', regardless of whether
33243325
// there was an error.

lib/IRReader/IRReader.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,16 @@ Module *llvm::getLazyIRModule(MemoryBuffer *Buffer, SMDiagnostic &Err,
3636
if (isBitcode((const unsigned char *)Buffer->getBufferStart(),
3737
(const unsigned char *)Buffer->getBufferEnd())) {
3838
std::string ErrMsg;
39-
Module *M = getLazyBitcodeModule(Buffer, Context, &ErrMsg);
40-
if (M == 0) {
39+
ErrorOr<Module *> ModuleOrErr = getLazyBitcodeModule(Buffer, Context);
40+
if (error_code EC = ModuleOrErr.getError()) {
4141
Err = SMDiagnostic(Buffer->getBufferIdentifier(), SourceMgr::DK_Error,
42-
ErrMsg);
42+
EC.message());
4343
// ParseBitcodeFile does not take ownership of the Buffer in the
4444
// case of an error.
4545
delete Buffer;
46+
return NULL;
4647
}
47-
return M;
48+
return ModuleOrErr.get();
4849
}
4950

5051
return ParseAssembly(Buffer, 0, Err, Context);

lib/LTO/LTOModule.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,14 @@ LTOModule *LTOModule::makeLTOModule(MemoryBuffer *buffer,
135135
TargetOptions options,
136136
std::string &errMsg) {
137137
// parse bitcode buffer
138-
OwningPtr<Module> m(getLazyBitcodeModule(buffer, getGlobalContext(),
139-
&errMsg));
140-
if (!m) {
138+
ErrorOr<Module *> ModuleOrErr =
139+
getLazyBitcodeModule(buffer, getGlobalContext());
140+
if (error_code EC = ModuleOrErr.getError()) {
141+
errMsg = EC.message();
141142
delete buffer;
142143
return NULL;
143144
}
145+
OwningPtr<Module> m(ModuleOrErr.get());
144146

145147
std::string TripleStr = m->getTargetTriple();
146148
if (TripleStr.empty())

unittests/Bitcode/BitReaderTest.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,9 @@ TEST(BitReaderTest, MaterializeFunctionsForBlockAddr) { // PR11677
5454
SmallString<1024> Mem;
5555
writeModuleToBuffer(Mem);
5656
MemoryBuffer *Buffer = MemoryBuffer::getMemBuffer(Mem.str(), "test", false);
57-
std::string errMsg;
58-
OwningPtr<Module> m(getLazyBitcodeModule(Buffer, getGlobalContext(), &errMsg));
57+
ErrorOr<Module *> ModuleOrErr =
58+
getLazyBitcodeModule(Buffer, getGlobalContext());
59+
OwningPtr<Module> m(ModuleOrErr.get());
5960
PassManager passes;
6061
passes.add(createVerifierPass());
6162
passes.run(*m);

unittests/ExecutionEngine/JIT/JITTest.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -631,13 +631,14 @@ ExecutionEngine *getJITFromBitcode(
631631
// c_str() is null-terminated like MemoryBuffer::getMemBuffer requires.
632632
MemoryBuffer *BitcodeBuffer =
633633
MemoryBuffer::getMemBuffer(Bitcode, "Bitcode for test");
634-
std::string errMsg;
635-
M = getLazyBitcodeModule(BitcodeBuffer, Context, &errMsg);
636-
if (M == NULL) {
637-
ADD_FAILURE() << errMsg;
634+
ErrorOr<Module*> ModuleOrErr = getLazyBitcodeModule(BitcodeBuffer, Context);
635+
if (error_code EC = ModuleOrErr.getError()) {
636+
ADD_FAILURE() << EC.message();
638637
delete BitcodeBuffer;
639638
return NULL;
640639
}
640+
M = ModuleOrErr.get();
641+
std::string errMsg;
641642
ExecutionEngine *TheJIT = EngineBuilder(M)
642643
.setEngineKind(EngineKind::JIT)
643644
.setErrorStr(&errMsg)

0 commit comments

Comments
 (0)