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