annotate libc/utils/HdrGen/PublicAPICommand.cpp @ 252:1f2b6ac9f198 llvm-original

LLVM16-1
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 18 Aug 2023 09:04:13 +0900
parents c4bab56944e8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
1 //===-- Implementation of PublicAPICommand --------------------------------===//
150
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include "PublicAPICommand.h"
anatofuz
parents:
diff changeset
10
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
11 #include "utils/LibcTableGenUtil/APIIndexer.h"
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
12
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
13 #include "llvm/ADT/SmallVector.h"
150
anatofuz
parents:
diff changeset
14 #include "llvm/ADT/StringExtras.h"
anatofuz
parents:
diff changeset
15 #include "llvm/ADT/StringRef.h"
anatofuz
parents:
diff changeset
16 #include "llvm/Support/SourceMgr.h"
anatofuz
parents:
diff changeset
17 #include "llvm/TableGen/Record.h"
anatofuz
parents:
diff changeset
18
anatofuz
parents:
diff changeset
19 // Text blocks for macro definitions and type decls can be indented to
anatofuz
parents:
diff changeset
20 // suit the surrounding tablegen listing. We need to dedent such blocks
anatofuz
parents:
diff changeset
21 // before writing them out.
anatofuz
parents:
diff changeset
22 static void dedentAndWrite(llvm::StringRef Text, llvm::raw_ostream &OS) {
anatofuz
parents:
diff changeset
23 llvm::SmallVector<llvm::StringRef, 10> Lines;
anatofuz
parents:
diff changeset
24 llvm::SplitString(Text, Lines, "\n");
anatofuz
parents:
diff changeset
25 size_t shortest_indent = 1024;
anatofuz
parents:
diff changeset
26 for (llvm::StringRef L : Lines) {
anatofuz
parents:
diff changeset
27 llvm::StringRef Indent = L.take_while([](char c) { return c == ' '; });
anatofuz
parents:
diff changeset
28 size_t IndentSize = Indent.size();
anatofuz
parents:
diff changeset
29 if (Indent.size() == L.size()) {
anatofuz
parents:
diff changeset
30 // Line is all spaces so no point noting the indent.
anatofuz
parents:
diff changeset
31 continue;
anatofuz
parents:
diff changeset
32 }
anatofuz
parents:
diff changeset
33 if (IndentSize < shortest_indent)
anatofuz
parents:
diff changeset
34 shortest_indent = IndentSize;
anatofuz
parents:
diff changeset
35 }
anatofuz
parents:
diff changeset
36 for (llvm::StringRef L : Lines) {
anatofuz
parents:
diff changeset
37 if (L.size() >= shortest_indent)
anatofuz
parents:
diff changeset
38 OS << L.drop_front(shortest_indent) << '\n';
anatofuz
parents:
diff changeset
39 }
anatofuz
parents:
diff changeset
40 }
anatofuz
parents:
diff changeset
41
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
42 static std::string getTypeHdrName(const std::string &Name) {
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
43 llvm::SmallVector<llvm::StringRef> Parts;
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
44 llvm::SplitString(llvm::StringRef(Name), Parts);
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
45 return llvm::join(Parts.begin(), Parts.end(), "_");
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
46 }
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
47
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
48 namespace llvm_libc {
150
anatofuz
parents:
diff changeset
49
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
50 void writeAPIFromIndex(APIIndexer &G,
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
51 std::vector<std::string> EntrypointNameList,
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
52 llvm::raw_ostream &OS) {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
53 for (auto &Pair : G.MacroDefsMap) {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
54 const std::string &Name = Pair.first;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
55 if (G.MacroSpecMap.find(Name) == G.MacroSpecMap.end())
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
56 llvm::PrintFatalError(Name + " not found in any standard spec.\n");
150
anatofuz
parents:
diff changeset
57
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
58 llvm::Record *MacroDef = Pair.second;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
59 dedentAndWrite(MacroDef->getValueAsString("Defn"), OS);
150
anatofuz
parents:
diff changeset
60
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
61 OS << '\n';
150
anatofuz
parents:
diff changeset
62 }
anatofuz
parents:
diff changeset
63
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
64 for (auto &TypeName : G.RequiredTypes) {
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
65 if (G.TypeSpecMap.find(TypeName) == G.TypeSpecMap.end())
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
66 llvm::PrintFatalError(TypeName + " not found in any standard spec.\n");
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
67 OS << "#include <llvm-libc-types/" << getTypeHdrName(TypeName) << ".h>\n";
150
anatofuz
parents:
diff changeset
68 }
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
69 OS << '\n';
150
anatofuz
parents:
diff changeset
70
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
71 if (G.Enumerations.size() != 0)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
72 OS << "enum {" << '\n';
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
73 for (const auto &Name : G.Enumerations) {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
74 if (G.EnumerationSpecMap.find(Name) == G.EnumerationSpecMap.end())
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
75 llvm::PrintFatalError(
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
76 Name + " is not listed as an enumeration in any standard spec.\n");
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
77
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
78 llvm::Record *EnumerationSpec = G.EnumerationSpecMap[Name];
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
79 OS << " " << EnumerationSpec->getValueAsString("Name");
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
80 auto Value = EnumerationSpec->getValueAsString("Value");
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
81 if (Value == "__default__") {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
82 OS << ",\n";
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
83 } else {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
84 OS << " = " << Value << ",\n";
150
anatofuz
parents:
diff changeset
85 }
anatofuz
parents:
diff changeset
86 }
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
87 if (G.Enumerations.size() != 0)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
88 OS << "};\n\n";
150
anatofuz
parents:
diff changeset
89
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
90 OS << "__BEGIN_C_DECLS\n\n";
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
91 for (auto &Name : EntrypointNameList) {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
92 if (G.FunctionSpecMap.find(Name) == G.FunctionSpecMap.end()) {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
93 continue; // Functions that aren't in this header file are skipped as
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
94 // opposed to erroring out because the list of functions being
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
95 // iterated over is the complete list of functions with
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
96 // entrypoints. Thus this is filtering out the functions that
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
97 // don't go to this header file, whereas the other, similar
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
98 // conditionals above are more of a sanity check.
150
anatofuz
parents:
diff changeset
99 }
anatofuz
parents:
diff changeset
100
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
101 llvm::Record *FunctionSpec = G.FunctionSpecMap[Name];
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
102 llvm::Record *RetValSpec = FunctionSpec->getValueAsDef("Return");
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
103 llvm::Record *ReturnType = RetValSpec->getValueAsDef("ReturnType");
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
104
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
105 OS << G.getTypeAsString(ReturnType) << " " << Name << "(";
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
106
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
107 auto ArgsList = FunctionSpec->getValueAsListOfDefs("Args");
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
108 for (size_t i = 0; i < ArgsList.size(); ++i) {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
109 llvm::Record *ArgType = ArgsList[i]->getValueAsDef("ArgType");
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
110 OS << G.getTypeAsString(ArgType);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
111 if (i < ArgsList.size() - 1)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
112 OS << ", ";
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
113 }
150
anatofuz
parents:
diff changeset
114
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
115 OS << ") __NOEXCEPT;\n\n";
150
anatofuz
parents:
diff changeset
116 }
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
117
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
118 // Make another pass over entrypoints to emit object declarations.
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
119 for (const auto &Name : EntrypointNameList) {
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
120 if (G.ObjectSpecMap.find(Name) == G.ObjectSpecMap.end())
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
121 continue;
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
122 llvm::Record *ObjectSpec = G.ObjectSpecMap[Name];
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
123 auto Type = ObjectSpec->getValueAsString("Type");
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
124 OS << "extern " << Type << " " << Name << ";\n";
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
125 }
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
126 OS << "__END_C_DECLS\n";
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
127 }
150
anatofuz
parents:
diff changeset
128
anatofuz
parents:
diff changeset
129 void writePublicAPI(llvm::raw_ostream &OS, llvm::RecordKeeper &Records) {}
anatofuz
parents:
diff changeset
130
anatofuz
parents:
diff changeset
131 const char PublicAPICommand::Name[] = "public_api";
anatofuz
parents:
diff changeset
132
anatofuz
parents:
diff changeset
133 void PublicAPICommand::run(llvm::raw_ostream &OS, const ArgVector &Args,
anatofuz
parents:
diff changeset
134 llvm::StringRef StdHeader,
anatofuz
parents:
diff changeset
135 llvm::RecordKeeper &Records,
anatofuz
parents:
diff changeset
136 const Command::ErrorReporter &Reporter) const {
anatofuz
parents:
diff changeset
137 if (Args.size() != 0) {
anatofuz
parents:
diff changeset
138 Reporter.printFatalError("public_api command does not take any arguments.");
anatofuz
parents:
diff changeset
139 }
anatofuz
parents:
diff changeset
140
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
141 APIIndexer G(StdHeader, Records);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
142 writeAPIFromIndex(G, EntrypointNameList, OS);
150
anatofuz
parents:
diff changeset
143 }
anatofuz
parents:
diff changeset
144
anatofuz
parents:
diff changeset
145 } // namespace llvm_libc