xref: /freebsd/contrib/llvm-project/lldb/tools/lldb-rpc/lldb-rpc-gen/server/RPCServerHeaderEmitter.cpp (revision 700637cbb5e582861067a11aaca4d053546871d2)
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)23 void 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()39 void 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)45 void RPCServerHeaderEmitter::EmitConstructor(const std::string &MangledName) {
46   EmitLine(MangledName + "() : RPCFunctionInstance(\"" + MangledName +
47            "\") {}");
48 }
49 
EmitDestructor(const std::string & MangledName)50 void RPCServerHeaderEmitter::EmitDestructor(const std::string &MangledName) {
51   EmitLine("~" + MangledName + "() override {}");
52 }
53 
GetHeaderGuard()54 std::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()62 void 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()72 void RPCServerHeaderEmitter::End() {
73   EmitLine("} // namespace rpc_server");
74   EmitLine("#endif // " + GetHeaderGuard());
75 }
76