16
16
using namespace llvm ;
17
17
using namespace llvm ::object;
18
18
19
- struct LLVMRustArchiveMember {
19
+ struct RustArchiveMember {
20
20
const char *filename;
21
21
const char *name;
22
22
Archive::Child child;
23
23
24
- LLVMRustArchiveMember (): filename(NULL ), name(NULL ),
24
+ RustArchiveMember (): filename(NULL ), name(NULL ),
25
25
#if LLVM_VERSION_MINOR >= 8
26
26
child (NULL , NULL , NULL )
27
27
#else
28
28
child (NULL , NULL )
29
29
#endif
30
30
{}
31
- ~LLVMRustArchiveMember () {}
31
+ ~RustArchiveMember () {}
32
32
};
33
33
34
- typedef OwningBinary<Archive> RustArchive;
35
34
36
- extern " C" void *
35
+ struct RustArchiveIterator {
36
+ Archive::child_iterator cur;
37
+ Archive::child_iterator end;
38
+ #if LLVM_VERSION_MINOR >= 9
39
+ Error err;
40
+ #endif
41
+ };
42
+
43
+ enum class LLVMRustArchiveKind {
44
+ Other,
45
+ GNU,
46
+ MIPS64,
47
+ BSD,
48
+ COFF,
49
+ };
50
+
51
+ static Archive::Kind
52
+ from_rust (LLVMRustArchiveKind kind)
53
+ {
54
+ switch (kind) {
55
+ case LLVMRustArchiveKind::GNU:
56
+ return Archive::K_GNU;
57
+ case LLVMRustArchiveKind::MIPS64:
58
+ return Archive::K_MIPS64;
59
+ case LLVMRustArchiveKind::BSD:
60
+ return Archive::K_BSD;
61
+ case LLVMRustArchiveKind::COFF:
62
+ return Archive::K_COFF;
63
+ default :
64
+ abort ();
65
+ }
66
+ }
67
+
68
+ typedef OwningBinary<Archive> *LLVMRustArchiveRef;
69
+ typedef RustArchiveMember *LLVMRustArchiveMemberRef;
70
+ typedef Archive::Child *LLVMRustArchiveChildRef;
71
+ typedef Archive::Child const *LLVMRustArchiveChildConstRef;
72
+ typedef RustArchiveIterator *LLVMRustArchiveIteratorRef;
73
+
74
+ extern " C" LLVMRustArchiveRef
37
75
LLVMRustOpenArchive (char *path) {
38
76
ErrorOr<std::unique_ptr<MemoryBuffer>> buf_or = MemoryBuffer::getFile (path,
39
77
-1 ,
@@ -66,20 +104,12 @@ LLVMRustOpenArchive(char *path) {
66
104
}
67
105
68
106
extern " C" void
69
- LLVMRustDestroyArchive (RustArchive * ar) {
107
+ LLVMRustDestroyArchive (LLVMRustArchiveRef ar) {
70
108
delete ar;
71
109
}
72
110
73
- struct RustArchiveIterator {
74
- Archive::child_iterator cur;
75
- Archive::child_iterator end;
76
- #if LLVM_VERSION_MINOR >= 9
77
- Error err;
78
- #endif
79
- };
80
-
81
- extern " C" RustArchiveIterator*
82
- LLVMRustArchiveIteratorNew (RustArchive *ra) {
111
+ extern " C" LLVMRustArchiveIteratorRef
112
+ LLVMRustArchiveIteratorNew (LLVMRustArchiveRef ra) {
83
113
Archive *ar = ra->getBinary ();
84
114
RustArchiveIterator *rai = new RustArchiveIterator ();
85
115
#if LLVM_VERSION_MINOR <= 8
@@ -95,8 +125,8 @@ LLVMRustArchiveIteratorNew(RustArchive *ra) {
95
125
return rai;
96
126
}
97
127
98
- extern " C" const Archive::Child*
99
- LLVMRustArchiveIteratorNext (RustArchiveIterator * rai) {
128
+ extern " C" LLVMRustArchiveChildConstRef
129
+ LLVMRustArchiveIteratorNext (LLVMRustArchiveIteratorRef rai) {
100
130
#if LLVM_VERSION_MINOR >= 9
101
131
if (rai->err ) {
102
132
LLVMRustSetLastError (toString (std::move (rai->err )).c_str ());
@@ -122,17 +152,17 @@ LLVMRustArchiveIteratorNext(RustArchiveIterator *rai) {
122
152
}
123
153
124
154
extern " C" void
125
- LLVMRustArchiveChildFree (Archive::Child * child) {
155
+ LLVMRustArchiveChildFree (LLVMRustArchiveChildRef child) {
126
156
delete child;
127
157
}
128
158
129
159
extern " C" void
130
- LLVMRustArchiveIteratorFree (RustArchiveIterator * rai) {
160
+ LLVMRustArchiveIteratorFree (LLVMRustArchiveIteratorRef rai) {
131
161
delete rai;
132
162
}
133
163
134
164
extern " C" const char *
135
- LLVMRustArchiveChildName (const Archive::Child * child, size_t *size) {
165
+ LLVMRustArchiveChildName (LLVMRustArchiveChildConstRef child, size_t *size) {
136
166
ErrorOr<StringRef> name_or_err = child->getName ();
137
167
if (name_or_err.getError ())
138
168
return NULL ;
@@ -142,7 +172,7 @@ LLVMRustArchiveChildName(const Archive::Child *child, size_t *size) {
142
172
}
143
173
144
174
extern " C" const char *
145
- LLVMRustArchiveChildData (Archive::Child * child, size_t *size) {
175
+ LLVMRustArchiveChildData (LLVMRustArchiveChildRef child, size_t *size) {
146
176
StringRef buf;
147
177
ErrorOr<StringRef> buf_or_err = child->getBuffer ();
148
178
if (buf_or_err.getError ()) {
@@ -154,9 +184,10 @@ LLVMRustArchiveChildData(Archive::Child *child, size_t *size) {
154
184
return buf.data ();
155
185
}
156
186
157
- extern " C" LLVMRustArchiveMember*
158
- LLVMRustArchiveMemberNew (char *Filename, char *Name, Archive::Child *child) {
159
- LLVMRustArchiveMember *Member = new LLVMRustArchiveMember;
187
+ extern " C" LLVMRustArchiveMemberRef
188
+ LLVMRustArchiveMemberNew (char *Filename, char *Name,
189
+ LLVMRustArchiveChildRef child) {
190
+ RustArchiveMember *Member = new RustArchiveMember;
160
191
Member->filename = Filename;
161
192
Member->name = Name;
162
193
if (child)
@@ -165,22 +196,23 @@ LLVMRustArchiveMemberNew(char *Filename, char *Name, Archive::Child *child) {
165
196
}
166
197
167
198
extern " C" void
168
- LLVMRustArchiveMemberFree (LLVMRustArchiveMember * Member) {
199
+ LLVMRustArchiveMemberFree (LLVMRustArchiveMemberRef Member) {
169
200
delete Member;
170
201
}
171
202
172
- extern " C" int
203
+ extern " C" LLVMRustResult
173
204
LLVMRustWriteArchive (char *Dst,
174
205
size_t NumMembers,
175
- const LLVMRustArchiveMember * *NewMembers,
206
+ const LLVMRustArchiveMemberRef *NewMembers,
176
207
bool WriteSymbtab,
177
- Archive::Kind Kind ) {
208
+ LLVMRustArchiveKind rust_kind ) {
178
209
179
210
#if LLVM_VERSION_MINOR <= 8
180
211
std::vector<NewArchiveIterator> Members;
181
212
#else
182
213
std::vector<NewArchiveMember> Members;
183
214
#endif
215
+ auto Kind = from_rust (rust_kind);
184
216
185
217
for (size_t i = 0 ; i < NumMembers; i++) {
186
218
auto Member = NewMembers[i];
@@ -190,7 +222,7 @@ LLVMRustWriteArchive(char *Dst,
190
222
Expected<NewArchiveMember> MOrErr = NewArchiveMember::getFile (Member->filename , true );
191
223
if (!MOrErr) {
192
224
LLVMRustSetLastError (toString (MOrErr.takeError ()).c_str ());
193
- return - 1 ;
225
+ return LLVMRustResult::Failure ;
194
226
}
195
227
Members.push_back (std::move (*MOrErr));
196
228
#elif LLVM_VERSION_MINOR == 8
@@ -205,7 +237,7 @@ LLVMRustWriteArchive(char *Dst,
205
237
Expected<NewArchiveMember> MOrErr = NewArchiveMember::getOldMember (Member->child , true );
206
238
if (!MOrErr) {
207
239
LLVMRustSetLastError (toString (MOrErr.takeError ()).c_str ());
208
- return - 1 ;
240
+ return LLVMRustResult::Failure ;
209
241
}
210
242
Members.push_back (std::move (*MOrErr));
211
243
#endif
@@ -217,7 +249,7 @@ LLVMRustWriteArchive(char *Dst,
217
249
auto pair = writeArchive (Dst, Members, WriteSymbtab, Kind, true );
218
250
#endif
219
251
if (!pair.second )
220
- return 0 ;
252
+ return LLVMRustResult::Success ;
221
253
LLVMRustSetLastError (pair.second .message ().c_str ());
222
- return - 1 ;
254
+ return LLVMRustResult::Failure ;
223
255
}
0 commit comments