1*76a0374bSGordon Henriksen //===-- BitWriter.cpp -----------------------------------------------------===//
2*76a0374bSGordon Henriksen //
3*76a0374bSGordon Henriksen //                     The LLVM Compiler Infrastructure
4*76a0374bSGordon Henriksen //
5*76a0374bSGordon Henriksen // This file was developed by the LLVM research group and is distributed under
6*76a0374bSGordon Henriksen // the University of Illinois Open Source License. See LICENSE.TXT for details.
7*76a0374bSGordon Henriksen //
8*76a0374bSGordon Henriksen //===----------------------------------------------------------------------===//
9*76a0374bSGordon Henriksen 
10*76a0374bSGordon Henriksen #include "llvm-c/BitWriter.h"
11*76a0374bSGordon Henriksen #include "llvm/CHelpers.h"
12*76a0374bSGordon Henriksen #include "llvm/Bitcode/ReaderWriter.h"
13*76a0374bSGordon Henriksen #include <fstream>
14*76a0374bSGordon Henriksen 
15*76a0374bSGordon Henriksen using namespace llvm;
16*76a0374bSGordon Henriksen 
17*76a0374bSGordon Henriksen 
18*76a0374bSGordon Henriksen /*===-- Operations on modules ---------------------------------------------===*/
19*76a0374bSGordon Henriksen 
20*76a0374bSGordon Henriksen int LLVMWriteBitcodeToFile(LLVMModuleRef M, const char *Path) {
21*76a0374bSGordon Henriksen   std::ofstream OS(Path);
22*76a0374bSGordon Henriksen 
23*76a0374bSGordon Henriksen   if (!OS.fail())
24*76a0374bSGordon Henriksen     WriteBitcodeToFile(unwrap(M), OS);
25*76a0374bSGordon Henriksen 
26*76a0374bSGordon Henriksen   if (OS.fail())
27*76a0374bSGordon Henriksen     return -1;
28*76a0374bSGordon Henriksen 
29*76a0374bSGordon Henriksen   return 0;
30*76a0374bSGordon Henriksen }
31*76a0374bSGordon Henriksen 
32*76a0374bSGordon Henriksen #ifdef __GNUC__
33*76a0374bSGordon Henriksen #include <ext/stdio_filebuf.h>
34*76a0374bSGordon Henriksen 
35*76a0374bSGordon Henriksen // FIXME: Control this with configure? Provide some portable abstraction in
36*76a0374bSGordon Henriksen // libSystem? As is, the user will just get a linker error if they use this on
37*76a0374bSGordon Henriksen // non-GCC. Some C++ stdlibs even have ofstream::ofstream(int fd).
38*76a0374bSGordon Henriksen int LLVMWriteBitcodeToFileHandle(LLVMModuleRef M, int FileHandle) {
39*76a0374bSGordon Henriksen   __gnu_cxx::stdio_filebuf<char> Buffer(FileHandle, std::ios_base::out);
40*76a0374bSGordon Henriksen   std::ostream OS(&Buffer);
41*76a0374bSGordon Henriksen 
42*76a0374bSGordon Henriksen   if (!OS.fail())
43*76a0374bSGordon Henriksen     WriteBitcodeToFile(unwrap(M), OS);
44*76a0374bSGordon Henriksen 
45*76a0374bSGordon Henriksen   if (OS.fail())
46*76a0374bSGordon Henriksen     return -1;
47*76a0374bSGordon Henriksen 
48*76a0374bSGordon Henriksen   return 0;
49*76a0374bSGordon Henriksen }
50*76a0374bSGordon Henriksen 
51*76a0374bSGordon Henriksen #endif
52