166d00febSPaula Toth //===-- "main" function of libc-hdrgen ------------------------------------===//
2b47f9eb5SSiva Chandra Reddy //
3b47f9eb5SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b47f9eb5SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
5b47f9eb5SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b47f9eb5SSiva Chandra Reddy //
7b47f9eb5SSiva Chandra Reddy //===----------------------------------------------------------------------===//
8b47f9eb5SSiva Chandra Reddy
9b47f9eb5SSiva Chandra Reddy #include "Generator.h"
10b47f9eb5SSiva Chandra Reddy
11b47f9eb5SSiva Chandra Reddy #include "llvm/ADT/StringRef.h"
12b47f9eb5SSiva Chandra Reddy #include "llvm/Support/CommandLine.h"
13b47f9eb5SSiva Chandra Reddy #include "llvm/TableGen/Main.h"
14b47f9eb5SSiva Chandra Reddy
15b47f9eb5SSiva Chandra Reddy #include <string>
16b47f9eb5SSiva Chandra Reddy #include <unordered_map>
17b47f9eb5SSiva Chandra Reddy
18b47f9eb5SSiva Chandra Reddy namespace {
19b47f9eb5SSiva Chandra Reddy
20b47f9eb5SSiva Chandra Reddy llvm::cl::opt<std::string>
21b47f9eb5SSiva Chandra Reddy HeaderDefFile("def", llvm::cl::desc("Path to the .h.def file."),
22b47f9eb5SSiva Chandra Reddy llvm::cl::value_desc("<filename>"), llvm::cl::Required);
23b47f9eb5SSiva Chandra Reddy llvm::cl::opt<std::string> StandardHeader(
24b47f9eb5SSiva Chandra Reddy "header",
25b47f9eb5SSiva Chandra Reddy llvm::cl::desc("The standard header file which is to be generated."),
26b47f9eb5SSiva Chandra Reddy llvm::cl::value_desc("<header file>"));
27*f6bf2823SMichael Jones llvm::cl::list<std::string> EntrypointNamesOption(
28*f6bf2823SMichael Jones "e", llvm::cl::value_desc("<list of entrypoints>"),
29*f6bf2823SMichael Jones llvm::cl::desc(
30*f6bf2823SMichael Jones "Each --e is one entrypoint (generated from entrypoints.txt)"),
31*f6bf2823SMichael Jones llvm::cl::OneOrMore);
32b47f9eb5SSiva Chandra Reddy llvm::cl::list<std::string> ReplacementValues(
330570de73SKazuaki Ishizaki "args", llvm::cl::desc("Command separated <argument name>=<value> pairs."),
34b47f9eb5SSiva Chandra Reddy llvm::cl::value_desc("<name=value>[,name=value]"));
35b47f9eb5SSiva Chandra Reddy
ParseArgValuePairs(std::unordered_map<std::string,std::string> & Map)36b47f9eb5SSiva Chandra Reddy void ParseArgValuePairs(std::unordered_map<std::string, std::string> &Map) {
37b47f9eb5SSiva Chandra Reddy for (std::string &R : ReplacementValues) {
38b47f9eb5SSiva Chandra Reddy auto Pair = llvm::StringRef(R).split('=');
39b9826408SSiva Chandra Reddy Map[std::string(Pair.first)] = std::string(Pair.second);
40b47f9eb5SSiva Chandra Reddy }
41b47f9eb5SSiva Chandra Reddy }
42b47f9eb5SSiva Chandra Reddy
43b47f9eb5SSiva Chandra Reddy } // anonymous namespace
44b47f9eb5SSiva Chandra Reddy
45b47f9eb5SSiva Chandra Reddy namespace llvm_libc {
46b47f9eb5SSiva Chandra Reddy
HeaderGeneratorMain(llvm::raw_ostream & OS,llvm::RecordKeeper & Records)47b47f9eb5SSiva Chandra Reddy bool HeaderGeneratorMain(llvm::raw_ostream &OS, llvm::RecordKeeper &Records) {
48b47f9eb5SSiva Chandra Reddy std::unordered_map<std::string, std::string> ArgMap;
49b47f9eb5SSiva Chandra Reddy ParseArgValuePairs(ArgMap);
50*f6bf2823SMichael Jones Generator G(HeaderDefFile, EntrypointNamesOption, StandardHeader, ArgMap);
51b47f9eb5SSiva Chandra Reddy G.generate(OS, Records);
52b47f9eb5SSiva Chandra Reddy
53b47f9eb5SSiva Chandra Reddy return false;
54b47f9eb5SSiva Chandra Reddy }
55b47f9eb5SSiva Chandra Reddy
56b47f9eb5SSiva Chandra Reddy } // namespace llvm_libc
57b47f9eb5SSiva Chandra Reddy
main(int argc,char * argv[])58b47f9eb5SSiva Chandra Reddy int main(int argc, char *argv[]) {
59b47f9eb5SSiva Chandra Reddy llvm::cl::ParseCommandLineOptions(argc, argv);
60b47f9eb5SSiva Chandra Reddy return TableGenMain(argv[0], &llvm_libc::HeaderGeneratorMain);
61b47f9eb5SSiva Chandra Reddy }
62