Skip to content

Commit 6304e94

Browse files
committed
Pass a std::unique_ptr& to the create??? methods is lib/Object.
This makes the buffer ownership on error conditions very natural. The buffer is only moved out of the argument if an object is constructed that now owns the buffer. llvm-svn: 211546
1 parent aed5c96 commit 6304e94

File tree

16 files changed

+68
-53
lines changed

16 files changed

+68
-53
lines changed

llvm/include/llvm/Object/Binary.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class Binary {
128128
/// @param Source The data to create the Binary from. Ownership is transferred
129129
/// to the Binary if successful. If an error is returned,
130130
/// Source is destroyed by createBinary before returning.
131-
ErrorOr<Binary *> createBinary(MemoryBuffer *Source,
131+
ErrorOr<Binary *> createBinary(std::unique_ptr<MemoryBuffer> &Source,
132132
LLVMContext *Context = nullptr);
133133

134134
ErrorOr<Binary *> createBinary(StringRef Path);

llvm/include/llvm/Object/ObjectFile.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -333,9 +333,11 @@ class ObjectFile : public SymbolicFile {
333333
/// return true.
334334
/// @brief Create ObjectFile from path.
335335
static ErrorOr<ObjectFile *> createObjectFile(StringRef ObjectPath);
336-
static ErrorOr<ObjectFile *> createObjectFile(MemoryBuffer *Object,
337-
sys::fs::file_magic Type);
338-
static ErrorOr<ObjectFile *> createObjectFile(MemoryBuffer *Object) {
336+
static ErrorOr<ObjectFile *>
337+
createObjectFile(std::unique_ptr<MemoryBuffer> &Object,
338+
sys::fs::file_magic Type);
339+
static ErrorOr<ObjectFile *>
340+
createObjectFile(std::unique_ptr<MemoryBuffer> &Object) {
339341
return createObjectFile(Object, sys::fs::file_magic::unknown);
340342
}
341343

@@ -346,8 +348,10 @@ class ObjectFile : public SymbolicFile {
346348

347349
public:
348350
static ErrorOr<ObjectFile *> createCOFFObjectFile(MemoryBuffer *Object);
349-
static ErrorOr<ObjectFile *> createELFObjectFile(MemoryBuffer *Object);
350-
static ErrorOr<ObjectFile *> createMachOObjectFile(MemoryBuffer *Object);
351+
static ErrorOr<ObjectFile *>
352+
createELFObjectFile(std::unique_ptr<MemoryBuffer> &Object);
353+
static ErrorOr<ObjectFile *>
354+
createMachOObjectFile(std::unique_ptr<MemoryBuffer> &Object);
351355
};
352356

353357
// Inline function definitions.

llvm/include/llvm/Object/SymbolicFile.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,11 +145,12 @@ class SymbolicFile : public Binary {
145145
static ErrorOr<SymbolicFile *> createIRObjectFile(MemoryBuffer *Object,
146146
LLVMContext &Context);
147147

148-
static ErrorOr<SymbolicFile *> createSymbolicFile(MemoryBuffer *Object,
149-
sys::fs::file_magic Type,
150-
LLVMContext *Context);
148+
static ErrorOr<SymbolicFile *>
149+
createSymbolicFile(std::unique_ptr<MemoryBuffer> &Object,
150+
sys::fs::file_magic Type, LLVMContext *Context);
151151

152-
static ErrorOr<SymbolicFile *> createSymbolicFile(MemoryBuffer *Object) {
152+
static ErrorOr<SymbolicFile *>
153+
createSymbolicFile(std::unique_ptr<MemoryBuffer> &Object) {
153154
return createSymbolicFile(Object, sys::fs::file_magic::unknown, nullptr);
154155
}
155156
static ErrorOr<SymbolicFile *> createSymbolicFile(StringRef ObjectPath);

llvm/lib/ExecutionEngine/RuntimeDyld/ObjectImageCommon.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ class ObjectImageCommon : public ObjectImage {
4848
{
4949
// FIXME: error checking? createObjectFile returns an ErrorOr<ObjectFile*>
5050
// and should probably be checked for failure.
51-
ObjFile.reset(object::ObjectFile::createObjectFile(Buffer->getMemBuffer()).get());
51+
std::unique_ptr<MemoryBuffer> Buf(Buffer->getMemBuffer());
52+
ObjFile.reset(object::ObjectFile::createObjectFile(Buf).get());
5253
}
5354
ObjectImageCommon(std::unique_ptr<object::ObjectFile> Input)
5455
: ObjectImage(nullptr), ObjFile(std::move(Input)) {}

llvm/lib/Object/Archive.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,7 @@ Archive::Child::getAsBinary(LLVMContext *Context) const {
183183
return EC;
184184

185185
std::unique_ptr<MemoryBuffer> Buff(BuffOrErr.get().release());
186-
ErrorOr<std::unique_ptr<Binary>> Ret = createBinary(Buff.get(), Context);
187-
if (!Ret.getError())
188-
Buff.release();
189-
return Ret;
186+
return createBinary(Buff, Context);
190187
}
191188

192189
ErrorOr<Archive*> Archive::create(MemoryBuffer *Source) {

llvm/lib/Object/Binary.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ StringRef Binary::getFileName() const {
3838
return Data->getBufferIdentifier();
3939
}
4040

41-
ErrorOr<Binary *> object::createBinary(MemoryBuffer *Buffer,
41+
ErrorOr<Binary *> object::createBinary(std::unique_ptr<MemoryBuffer> &Buffer,
4242
LLVMContext *Context) {
4343
sys::fs::file_magic Type = sys::fs::identify_magic(Buffer->getBuffer());
4444

4545
switch (Type) {
4646
case sys::fs::file_magic::archive:
47-
return Archive::create(Buffer);
47+
return Archive::create(Buffer.release());
4848
case sys::fs::file_magic::elf_relocatable:
4949
case sys::fs::file_magic::elf_executable:
5050
case sys::fs::file_magic::elf_shared_object:
@@ -65,7 +65,7 @@ ErrorOr<Binary *> object::createBinary(MemoryBuffer *Buffer,
6565
case sys::fs::file_magic::bitcode:
6666
return ObjectFile::createSymbolicFile(Buffer, Type, Context);
6767
case sys::fs::file_magic::macho_universal_binary:
68-
return MachOUniversalBinary::create(Buffer);
68+
return MachOUniversalBinary::create(Buffer.release());
6969
case sys::fs::file_magic::unknown:
7070
case sys::fs::file_magic::windows_resource:
7171
// Unrecognized object file format.
@@ -78,5 +78,5 @@ ErrorOr<Binary *> object::createBinary(StringRef Path) {
7878
std::unique_ptr<MemoryBuffer> File;
7979
if (std::error_code EC = MemoryBuffer::getFileOrSTDIN(Path, File))
8080
return EC;
81-
return createBinary(File.release());
81+
return createBinary(File);
8282
}

llvm/lib/Object/ELFObjectFile.cpp

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717
namespace llvm {
1818
using namespace object;
1919

20-
ErrorOr<ObjectFile *> ObjectFile::createELFObjectFile(MemoryBuffer *Obj) {
21-
std::pair<unsigned char, unsigned char> Ident = getElfArchType(Obj);
20+
ErrorOr<ObjectFile *>
21+
ObjectFile::createELFObjectFile(std::unique_ptr<MemoryBuffer> &Obj) {
22+
std::pair<unsigned char, unsigned char> Ident = getElfArchType(Obj.get());
2223
std::size_t MaxAlignment =
2324
1ULL << countTrailingZeros(uintptr_t(Obj->getBufferStart()));
2425

@@ -27,41 +28,49 @@ ErrorOr<ObjectFile *> ObjectFile::createELFObjectFile(MemoryBuffer *Obj) {
2728
if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB)
2829
#if !LLVM_IS_UNALIGNED_ACCESS_FAST
2930
if (MaxAlignment >= 4)
30-
R.reset(new ELFObjectFile<ELFType<support::little, 4, false>>(Obj, EC));
31+
R.reset(new ELFObjectFile<ELFType<support::little, 4, false>>(
32+
Obj.release(), EC));
3133
else
3234
#endif
3335
if (MaxAlignment >= 2)
34-
R.reset(new ELFObjectFile<ELFType<support::little, 2, false>>(Obj, EC));
36+
R.reset(new ELFObjectFile<ELFType<support::little, 2, false>>(
37+
Obj.release(), EC));
3538
else
3639
return object_error::parse_failed;
3740
else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB)
3841
#if !LLVM_IS_UNALIGNED_ACCESS_FAST
3942
if (MaxAlignment >= 4)
40-
R.reset(new ELFObjectFile<ELFType<support::big, 4, false>>(Obj, EC));
43+
R.reset(new ELFObjectFile<ELFType<support::big, 4, false>>(Obj.release(),
44+
EC));
4145
else
4246
#endif
4347
if (MaxAlignment >= 2)
44-
R.reset(new ELFObjectFile<ELFType<support::big, 2, false>>(Obj, EC));
48+
R.reset(new ELFObjectFile<ELFType<support::big, 2, false>>(Obj.release(),
49+
EC));
4550
else
4651
return object_error::parse_failed;
4752
else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB)
4853
#if !LLVM_IS_UNALIGNED_ACCESS_FAST
4954
if (MaxAlignment >= 8)
50-
R.reset(new ELFObjectFile<ELFType<support::big, 8, true>>(Obj, EC));
55+
R.reset(
56+
new ELFObjectFile<ELFType<support::big, 8, true>>(Obj.release(), EC));
5157
else
5258
#endif
5359
if (MaxAlignment >= 2)
54-
R.reset(new ELFObjectFile<ELFType<support::big, 2, true>>(Obj, EC));
60+
R.reset(
61+
new ELFObjectFile<ELFType<support::big, 2, true>>(Obj.release(), EC));
5562
else
5663
return object_error::parse_failed;
5764
else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) {
5865
#if !LLVM_IS_UNALIGNED_ACCESS_FAST
5966
if (MaxAlignment >= 8)
60-
R.reset(new ELFObjectFile<ELFType<support::little, 8, true>>(Obj, EC));
67+
R.reset(new ELFObjectFile<ELFType<support::little, 8, true>>(
68+
Obj.release(), EC));
6169
else
6270
#endif
6371
if (MaxAlignment >= 2)
64-
R.reset(new ELFObjectFile<ELFType<support::little, 2, true>>(Obj, EC));
72+
R.reset(new ELFObjectFile<ELFType<support::little, 2, true>>(
73+
Obj.release(), EC));
6574
else
6675
return object_error::parse_failed;
6776
}

llvm/lib/Object/MachOObjectFile.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1811,22 +1811,21 @@ void MachOObjectFile::ReadULEB128s(uint64_t Index,
18111811
}
18121812
}
18131813

1814-
ErrorOr<ObjectFile *> ObjectFile::createMachOObjectFile(MemoryBuffer *Buffer) {
1814+
ErrorOr<ObjectFile *>
1815+
ObjectFile::createMachOObjectFile(std::unique_ptr<MemoryBuffer> &Buffer) {
18151816
StringRef Magic = Buffer->getBuffer().slice(0, 4);
18161817
std::error_code EC;
18171818
std::unique_ptr<MachOObjectFile> Ret;
18181819
if (Magic == "\xFE\xED\xFA\xCE")
1819-
Ret.reset(new MachOObjectFile(Buffer, false, false, EC));
1820+
Ret.reset(new MachOObjectFile(Buffer.release(), false, false, EC));
18201821
else if (Magic == "\xCE\xFA\xED\xFE")
1821-
Ret.reset(new MachOObjectFile(Buffer, true, false, EC));
1822+
Ret.reset(new MachOObjectFile(Buffer.release(), true, false, EC));
18221823
else if (Magic == "\xFE\xED\xFA\xCF")
1823-
Ret.reset(new MachOObjectFile(Buffer, false, true, EC));
1824+
Ret.reset(new MachOObjectFile(Buffer.release(), false, true, EC));
18241825
else if (Magic == "\xCF\xFA\xED\xFE")
1825-
Ret.reset(new MachOObjectFile(Buffer, true, true, EC));
1826-
else {
1827-
delete Buffer;
1826+
Ret.reset(new MachOObjectFile(Buffer.release(), true, true, EC));
1827+
else
18281828
return object_error::parse_failed;
1829-
}
18301829

18311830
if (EC)
18321831
return EC;

llvm/lib/Object/MachOUniversal.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ MachOUniversalBinary::ObjectForArch::getAsObjectFile() const {
7373
StringRef ParentData = Parent->getData();
7474
StringRef ObjectData = ParentData.substr(Header.offset, Header.size);
7575
std::string ObjectName = Parent->getFileName().str();
76-
MemoryBuffer *ObjBuffer = MemoryBuffer::getMemBuffer(
77-
ObjectData, ObjectName, false);
76+
std::unique_ptr<MemoryBuffer> ObjBuffer(
77+
MemoryBuffer::getMemBuffer(ObjectData, ObjectName, false));
7878
return ObjectFile::createMachOObjectFile(ObjBuffer);
7979
}
8080
return object_error::parse_failed;

llvm/lib/Object/Object.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ wrap(const relocation_iterator *SI) {
5959

6060
// ObjectFile creation
6161
LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) {
62-
ErrorOr<ObjectFile*> ObjOrErr(ObjectFile::createObjectFile(unwrap(MemBuf)));
62+
std::unique_ptr<MemoryBuffer> Buf(unwrap(MemBuf));
63+
ErrorOr<ObjectFile *> ObjOrErr(ObjectFile::createObjectFile(Buf));
64+
Buf.release();
6365
ObjectFile *Obj = ObjOrErr ? ObjOrErr.get() : nullptr;
6466
return wrap(Obj);
6567
}

0 commit comments

Comments
 (0)