]>
git.proxmox.com Git - rustc.git/blob - src/rustllvm/ArchiveWrapper.cpp
1 // Copyright 2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
13 #include "llvm/Object/Archive.h"
15 #if LLVM_VERSION_MINOR >= 7
16 #include "llvm/Object/ArchiveWriter.h"
20 using namespace llvm::object
;
22 struct LLVMRustArchiveMember
{
27 LLVMRustArchiveMember(): filename(NULL
), name(NULL
), child(NULL
, NULL
) {}
28 ~LLVMRustArchiveMember() {}
31 #if LLVM_VERSION_MINOR >= 6
32 typedef OwningBinary
<Archive
> RustArchive
;
33 #define GET_ARCHIVE(a) ((a)->getBinary())
35 typedef Archive RustArchive
;
36 #define GET_ARCHIVE(a) (a)
40 LLVMRustOpenArchive(char *path
) {
41 ErrorOr
<std::unique_ptr
<MemoryBuffer
>> buf_or
= MemoryBuffer::getFile(path
,
45 LLVMRustSetLastError(buf_or
.getError().message().c_str());
49 #if LLVM_VERSION_MINOR >= 6
50 ErrorOr
<std::unique_ptr
<Archive
>> archive_or
=
51 Archive::create(buf_or
.get()->getMemBufferRef());
54 LLVMRustSetLastError(archive_or
.getError().message().c_str());
58 OwningBinary
<Archive
> *ret
= new OwningBinary
<Archive
>(
59 std::move(archive_or
.get()), std::move(buf_or
.get()));
62 Archive
*ret
= new Archive(std::move(buf_or
.get()), err
);
64 LLVMRustSetLastError(err
.message().c_str());
73 LLVMRustDestroyArchive(RustArchive
*ar
) {
77 struct RustArchiveIterator
{
78 Archive::child_iterator cur
;
79 Archive::child_iterator end
;
82 extern "C" RustArchiveIterator
*
83 LLVMRustArchiveIteratorNew(RustArchive
*ra
) {
84 Archive
*ar
= GET_ARCHIVE(ra
);
85 RustArchiveIterator
*rai
= new RustArchiveIterator();
86 rai
->cur
= ar
->child_begin();
87 rai
->end
= ar
->child_end();
91 extern "C" const Archive::Child
*
92 LLVMRustArchiveIteratorNext(RustArchiveIterator
*rai
) {
93 if (rai
->cur
== rai
->end
)
95 const Archive::Child
*cur
= rai
->cur
.operator->();
96 Archive::Child
*ret
= new Archive::Child(*cur
);
102 LLVMRustArchiveChildFree(Archive::Child
*child
) {
107 LLVMRustArchiveIteratorFree(RustArchiveIterator
*rai
) {
111 extern "C" const char*
112 LLVMRustArchiveChildName(const Archive::Child
*child
, size_t *size
) {
113 ErrorOr
<StringRef
> name_or_err
= child
->getName();
114 if (name_or_err
.getError())
116 StringRef name
= name_or_err
.get();
121 extern "C" const char*
122 LLVMRustArchiveChildData(Archive::Child
*child
, size_t *size
) {
124 #if LLVM_VERSION_MINOR >= 7
125 ErrorOr
<StringRef
> buf_or_err
= child
->getBuffer();
126 if (buf_or_err
.getError()) {
127 LLVMRustSetLastError(buf_or_err
.getError().message().c_str());
130 buf
= buf_or_err
.get();
132 buf
= child
->getBuffer();
138 extern "C" LLVMRustArchiveMember
*
139 LLVMRustArchiveMemberNew(char *Filename
, char *Name
, Archive::Child
*child
) {
140 LLVMRustArchiveMember
*Member
= new LLVMRustArchiveMember
;
141 Member
->filename
= Filename
;
144 Member
->child
= *child
;
149 LLVMRustArchiveMemberFree(LLVMRustArchiveMember
*Member
) {
154 LLVMRustWriteArchive(char *Dst
,
156 const LLVMRustArchiveMember
**NewMembers
,
158 Archive::Kind Kind
) {
159 #if LLVM_VERSION_MINOR >= 7
160 std::vector
<NewArchiveIterator
> Members
;
162 for (size_t i
= 0; i
< NumMembers
; i
++) {
163 auto Member
= NewMembers
[i
];
164 assert(Member
->name
);
165 if (Member
->filename
) {
166 Members
.push_back(NewArchiveIterator(Member
->filename
, Member
->name
));
168 Members
.push_back(NewArchiveIterator(Member
->child
, Member
->name
));
171 auto pair
= writeArchive(Dst
, Members
, WriteSymbtab
, Kind
, true);
174 LLVMRustSetLastError(pair
.second
.message().c_str());
176 LLVMRustSetLastError("writing archives not supported with this LLVM version");