1fb26025575421f179020b812c4e9e958812a3deeChandler Carruth//===--- MacroBuilder.h - CPP Macro building utility ------------*- C++ -*-===// 2103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth// 3103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth// The LLVM Compiler Infrastructure 4103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth// 5103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth// This file is distributed under the University of Illinois Open Source 6103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth// License. See LICENSE.TXT for details. 7103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth// 8103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth//===----------------------------------------------------------------------===// 92f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// 102f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// \file 112f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// \brief Defines the clang::MacroBuilder utility class. 122f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// 13103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth//===----------------------------------------------------------------------===// 14103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth 15103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth#ifndef LLVM_CLANG_BASIC_MACROBUILDER_H 16103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth#define LLVM_CLANG_BASIC_MACROBUILDER_H 17103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth 189946fc735d7285f2195f89635370f534afd9877eDmitri Gribenko#include "clang/Basic/LLVM.h" 19103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth#include "llvm/ADT/Twine.h" 20103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth#include "llvm/Support/raw_ostream.h" 21103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth 22103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruthnamespace clang { 23103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth 24103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruthclass MacroBuilder { 258cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner raw_ostream &Out; 26103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruthpublic: 278cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner MacroBuilder(raw_ostream &Output) : Out(Output) {} 28103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth 29809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett /// Append a \#define line for macro of the form "\#define Name Value\n". 308cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void defineMacro(const Twine &Name, const Twine &Value = "1") { 31103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth Out << "#define " << Name << ' ' << Value << '\n'; 32103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth } 33103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth 3401005984f77d8a9c256da2f1f38a04c2edf0337aJames Dennett /// Append a \#undef line for Name. Name should be of the form XXX 3501005984f77d8a9c256da2f1f38a04c2edf0337aJames Dennett /// and we emit "\#undef XXX". 368cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void undefineMacro(const Twine &Name) { 37103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth Out << "#undef " << Name << '\n'; 38103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth } 39103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth 40103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth /// Directly append Str and a newline to the underlying buffer. 418cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner void append(const Twine &Str) { 42103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth Out << Str << '\n'; 43103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth } 44103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth}; 45103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth 46103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth} // end namespace clang 47103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth 48103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth#endif 49