Skip to content

Commit 2a1bbde

Browse files
committed
single file bitcode output
1 parent 7958e9e commit 2a1bbde

File tree

1 file changed

+72
-4
lines changed

1 file changed

+72
-4
lines changed

source/api/_bitcode/BitcodeGenerator.cpp

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ namespace clang {
1919
namespace mrdox {
2020
namespace bitcode {
2121

22-
class Builder : public Corpus::Visitor
22+
class MultiFileBuilder : public Corpus::Visitor
2323
{
2424
Corpus const& corpus_;
2525
Reporter& R_;
@@ -28,7 +28,7 @@ class Builder : public Corpus::Visitor
2828
Config::WorkGroup wg_;
2929

3030
public:
31-
Builder(
31+
MultiFileBuilder(
3232
llvm::StringRef outputPath,
3333
Corpus const& corpus,
3434
Reporter& R)
@@ -108,14 +108,82 @@ class Builder : public Corpus::Visitor
108108

109109
//------------------------------------------------
110110

111+
class SingleFileBuilder : public Corpus::Visitor
112+
{
113+
Corpus const& corpus_;
114+
Reporter& R_;
115+
llvm::raw_ostream& os_;
116+
llvm::raw_fd_ostream* fd_os_;
117+
118+
public:
119+
SingleFileBuilder(
120+
llvm::raw_ostream& os,
121+
llvm::raw_fd_ostream* fd_os,
122+
Corpus const& corpus,
123+
Reporter& R)
124+
: corpus_(corpus)
125+
, R_(R)
126+
, os_(os)
127+
, fd_os_(fd_os)
128+
{
129+
}
130+
131+
llvm::Error
132+
build()
133+
{
134+
corpus_.visit(globalNamespaceID, *this);
135+
return llvm::Error::success();
136+
}
137+
138+
template<class T>
139+
void build(T const& I)
140+
{
141+
auto bc = writeBitcode(I);
142+
os_.write(bc.data.data(), bc.data.size());
143+
}
144+
145+
bool visit(NamespaceInfo const& I) override
146+
{
147+
corpus_.visit(I.Children, *this);
148+
return true;
149+
}
150+
151+
bool visit(RecordInfo const& I) override
152+
{
153+
build(I);
154+
corpus_.visit(I.Children, *this);
155+
return true;
156+
}
157+
158+
bool visit(FunctionInfo const& I) override
159+
{
160+
build(I);
161+
return true;
162+
}
163+
164+
bool visit(TypedefInfo const& I) override
165+
{
166+
build(I);
167+
return true;
168+
}
169+
170+
bool visit(EnumInfo const& I) override
171+
{
172+
build(I);
173+
return true;
174+
}
175+
};
176+
177+
//------------------------------------------------
178+
111179
llvm::Error
112180
BitcodeGenerator::
113181
buildPages(
114182
llvm::StringRef outputPath,
115183
Corpus const& corpus,
116184
Reporter& R) const
117185
{
118-
return Builder(outputPath, corpus, R).build();
186+
return MultiFileBuilder(outputPath, corpus, R).build();
119187
}
120188

121189
llvm::Error
@@ -126,7 +194,7 @@ buildSinglePage(
126194
Reporter& R,
127195
llvm::raw_fd_ostream* fd_os) const
128196
{
129-
return makeError("single-page bitcode not supported");
197+
return SingleFileBuilder(os, fd_os, corpus, R).build();
130198
}
131199

132200
} // xml

0 commit comments

Comments
 (0)