1*700637cbSDimitry Andric //===-- RPCServerHeaderEmitter.cpp ----------------------------------------===// 2*700637cbSDimitry Andric // 3*700637cbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*700637cbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*700637cbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*700637cbSDimitry Andric // 7*700637cbSDimitry Andric //===----------------------------------------------------------------------===// 8*700637cbSDimitry Andric 9*700637cbSDimitry Andric #include "RPCServerHeaderEmitter.h" 10*700637cbSDimitry Andric #include "RPCCommon.h" 11*700637cbSDimitry Andric 12*700637cbSDimitry Andric #include "clang/AST/AST.h" 13*700637cbSDimitry Andric #include "clang/AST/Mangle.h" 14*700637cbSDimitry Andric #include "clang/Frontend/CompilerInstance.h" 15*700637cbSDimitry Andric 16*700637cbSDimitry Andric #include "llvm/ADT/StringRef.h" 17*700637cbSDimitry Andric #include "llvm/Support/ToolOutputFile.h" 18*700637cbSDimitry Andric #include "llvm/Support/raw_ostream.h" 19*700637cbSDimitry Andric 20*700637cbSDimitry Andric using namespace clang; 21*700637cbSDimitry Andric using namespace lldb_rpc_gen; 22*700637cbSDimitry Andric EmitMethod(const Method & method)23*700637cbSDimitry Andricvoid RPCServerHeaderEmitter::EmitMethod(const Method &method) { 24*700637cbSDimitry Andric // We'll be using the mangled name in order to disambiguate 25*700637cbSDimitry Andric // overloaded methods. 26*700637cbSDimitry Andric const std::string &MangledName = method.MangledName; 27*700637cbSDimitry Andric 28*700637cbSDimitry Andric EmitLine("class " + MangledName + 29*700637cbSDimitry Andric " : public rpc_common::RPCFunctionInstance {"); 30*700637cbSDimitry Andric EmitLine("public:"); 31*700637cbSDimitry Andric IndentLevel++; 32*700637cbSDimitry Andric EmitConstructor(MangledName); 33*700637cbSDimitry Andric EmitDestructor(MangledName); 34*700637cbSDimitry Andric EmitHandleRPCCall(); 35*700637cbSDimitry Andric IndentLevel--; 36*700637cbSDimitry Andric EmitLine("};"); 37*700637cbSDimitry Andric } 38*700637cbSDimitry Andric EmitHandleRPCCall()39*700637cbSDimitry Andricvoid RPCServerHeaderEmitter::EmitHandleRPCCall() { 40*700637cbSDimitry Andric EmitLine("bool HandleRPCCall(rpc_common::Connection &connection, " 41*700637cbSDimitry Andric "rpc_common::RPCStream &send, rpc_common::RPCStream &response) " 42*700637cbSDimitry Andric "override;"); 43*700637cbSDimitry Andric } 44*700637cbSDimitry Andric EmitConstructor(const std::string & MangledName)45*700637cbSDimitry Andricvoid RPCServerHeaderEmitter::EmitConstructor(const std::string &MangledName) { 46*700637cbSDimitry Andric EmitLine(MangledName + "() : RPCFunctionInstance(\"" + MangledName + 47*700637cbSDimitry Andric "\") {}"); 48*700637cbSDimitry Andric } 49*700637cbSDimitry Andric EmitDestructor(const std::string & MangledName)50*700637cbSDimitry Andricvoid RPCServerHeaderEmitter::EmitDestructor(const std::string &MangledName) { 51*700637cbSDimitry Andric EmitLine("~" + MangledName + "() override {}"); 52*700637cbSDimitry Andric } 53*700637cbSDimitry Andric GetHeaderGuard()54*700637cbSDimitry Andricstd::string RPCServerHeaderEmitter::GetHeaderGuard() { 55*700637cbSDimitry Andric const std::string UpperFilenameNoExt = 56*700637cbSDimitry Andric llvm::sys::path::stem( 57*700637cbSDimitry Andric llvm::sys::path::filename(OutputFile->getFilename())) 58*700637cbSDimitry Andric .upper(); 59*700637cbSDimitry Andric return "GENERATED_LLDB_RPC_SERVER_" + UpperFilenameNoExt + "_H"; 60*700637cbSDimitry Andric } 61*700637cbSDimitry Andric Begin()62*700637cbSDimitry Andricvoid RPCServerHeaderEmitter::Begin() { 63*700637cbSDimitry Andric const std::string HeaderGuard = GetHeaderGuard(); 64*700637cbSDimitry Andric EmitLine("#ifndef " + HeaderGuard); 65*700637cbSDimitry Andric EmitLine("#define " + HeaderGuard); 66*700637cbSDimitry Andric EmitLine(""); 67*700637cbSDimitry Andric EmitLine("#include <lldb-rpc/common/RPCFunction.h>"); 68*700637cbSDimitry Andric EmitLine(""); 69*700637cbSDimitry Andric EmitLine("namespace rpc_server {"); 70*700637cbSDimitry Andric } 71*700637cbSDimitry Andric End()72*700637cbSDimitry Andricvoid RPCServerHeaderEmitter::End() { 73*700637cbSDimitry Andric EmitLine("} // namespace rpc_server"); 74*700637cbSDimitry Andric EmitLine("#endif // " + GetHeaderGuard()); 75*700637cbSDimitry Andric } 76