1adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik//=== FileOutputBuffer.h - File Output Buffer -------------------*- C++ -*-===//
2adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik//
3adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik//                     The LLVM Compiler Infrastructure
4adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik//
5adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik// This file is distributed under the University of Illinois Open Source
6adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik// License. See LICENSE.TXT for details.
7adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik//
8adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik//===----------------------------------------------------------------------===//
9adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik//
10adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik// Utility for creating a in-memory buffer that will be written to a file.
11adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik//
12adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik//===----------------------------------------------------------------------===//
13adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik
14adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik#ifndef LLVM_SUPPORT_FILEOUTPUTBUFFER_H
15adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik#define LLVM_SUPPORT_FILEOUTPUTBUFFER_H
16adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik
17adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik#include "llvm/ADT/SmallString.h"
18adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik#include "llvm/ADT/StringRef.h"
19adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik#include "llvm/Support/DataTypes.h"
206bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer#include "llvm/Support/FileSystem.h"
21adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik
22adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledziknamespace llvm {
23adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik/// FileOutputBuffer - This interface provides simple way to create an in-memory
246bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer/// buffer which will be written to a file. During the lifetime of these
25adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik/// objects, the content or existence of the specified file is undefined. That
26adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik/// is, creating an OutputBuffer for a file may immediately remove the file.
276bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer/// If the FileOutputBuffer is committed, the target file's content will become
286bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer/// the buffer content at the time of the commit.  If the FileOutputBuffer is
29adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik/// not committed, the file will be deleted in the FileOutputBuffer destructor.
30adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzikclass FileOutputBuffer {
31adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzikpublic:
32adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik
33adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  enum  {
34adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik    F_executable = 1  /// set the 'x' bit on the resulting file
356bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer  };
36adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik
37adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  /// Factory method to create an OutputBuffer object which manages a read/write
38adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  /// buffer of the specified size. When committed, the buffer will be written
396bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer  /// to the file at the specified path.
40cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  static std::error_code create(StringRef FilePath, size_t Size,
41cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                std::unique_ptr<FileOutputBuffer> &Result,
42cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                unsigned Flags = 0);
43adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik
44adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  /// Returns a pointer to the start of the buffer.
456bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer  uint8_t *getBufferStart() {
466bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer    return (uint8_t*)Region->data();
47adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  }
486bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer
49adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  /// Returns a pointer to the end of the buffer.
506bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer  uint8_t *getBufferEnd() {
516bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer    return (uint8_t*)Region->data() + Region->size();
52adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  }
536bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer
54adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  /// Returns size of the buffer.
55adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  size_t getBufferSize() const {
566bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer    return Region->size();
57adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  }
586bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer
59adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  /// Returns path where file will show up if buffer is committed.
60adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  StringRef getPath() const {
61adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik    return FinalPath;
62adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  }
636bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer
646bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer  /// Flushes the content of the buffer to its file and deallocates the
65adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  /// buffer.  If commit() is not called before this object's destructor
66adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  /// is called, the file is deleted in the destructor. The optional parameter
67adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  /// is used if it turns out you want the file size to be smaller than
68adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  /// initially requested.
69cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::error_code commit(int64_t NewSmallerSize = -1);
706bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer
71adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  /// If this object was previously committed, the destructor just deletes
72adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  /// this object.  If this object was not committed, the destructor
73adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  /// deallocates the buffer and the target file is never written.
74adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  ~FileOutputBuffer();
75adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik
76fc601db2ed899d800ea0a50f7ecf7de2a820cbc1Craig Topperprivate:
77fc601db2ed899d800ea0a50f7ecf7de2a820cbc1Craig Topper  FileOutputBuffer(const FileOutputBuffer &) LLVM_DELETED_FUNCTION;
78fc601db2ed899d800ea0a50f7ecf7de2a820cbc1Craig Topper  FileOutputBuffer &operator=(const FileOutputBuffer &) LLVM_DELETED_FUNCTION;
796bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer
806bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer  FileOutputBuffer(llvm::sys::fs::mapped_file_region *R,
816bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer                   StringRef Path, StringRef TempPath);
826bc86018d189e9ab62d30ef8190bac961dd22248Michael J. Spencer
8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::unique_ptr<llvm::sys::fs::mapped_file_region> Region;
84adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  SmallString<128>    FinalPath;
85adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik  SmallString<128>    TempPath;
86adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik};
87adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik} // end namespace llvm
88adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik
89adfe2637b839efe041165f27c9ad57e3befb2be0Nick Kledzik#endif
90