xref: /aosp_15_r20/external/clang/soong/tblgen.go (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// Copyright (C) 2016 The Android Open Source Project
2*67e74705SXin Li//
3*67e74705SXin Li// Licensed under the Apache License, Version 2.0 (the "License");
4*67e74705SXin Li// you may not use this file except in compliance with the License.
5*67e74705SXin Li// You may obtain a copy of the License at
6*67e74705SXin Li//
7*67e74705SXin Li//     http://www.apache.org/licenses/LICENSE-2.0
8*67e74705SXin Li//
9*67e74705SXin Li// Unless required by applicable law or agreed to in writing, software
10*67e74705SXin Li// distributed under the License is distributed on an "AS IS" BASIS,
11*67e74705SXin Li// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*67e74705SXin Li// See the License for the specific language governing permissions and
13*67e74705SXin Li// limitations under the License.
14*67e74705SXin Li
15*67e74705SXin Lipackage clang
16*67e74705SXin Li
17*67e74705SXin Liimport (
18*67e74705SXin Li	"path/filepath"
19*67e74705SXin Li	"strings"
20*67e74705SXin Li
21*67e74705SXin Li	"android/soong/android"
22*67e74705SXin Li	"android/soong/genrule"
23*67e74705SXin Li
24*67e74705SXin Li	"github.com/google/blueprint"
25*67e74705SXin Li	"github.com/google/blueprint/proptools"
26*67e74705SXin Li)
27*67e74705SXin Li
28*67e74705SXin Lifunc init() {
29*67e74705SXin Li	android.RegisterModuleType("clang_tblgen", clangTblgenFactory)
30*67e74705SXin Li}
31*67e74705SXin Li
32*67e74705SXin Livar (
33*67e74705SXin Li	pctx = android.NewPackageContext("android/soong/clang")
34*67e74705SXin Li
35*67e74705SXin Li	clangTblgen = pctx.HostBinToolVariable("clangTblgen", "clang-tblgen")
36*67e74705SXin Li
37*67e74705SXin Li	tblgenRule = pctx.StaticRule("tblgenRule", blueprint.RuleParams{
38*67e74705SXin Li		Depfile:     "${out}.d",
39*67e74705SXin Li		Deps:        blueprint.DepsGCC,
40*67e74705SXin Li		Command:     "${clangTblgen} ${includes} ${genopt} -d ${out}.d -o ${out} ${in}",
41*67e74705SXin Li		CommandDeps: []string{"${clangTblgen}"},
42*67e74705SXin Li		Description: "Clang TableGen $in => $out",
43*67e74705SXin Li	}, "includes", "genopt")
44*67e74705SXin Li)
45*67e74705SXin Li
46*67e74705SXin Litype tblgenProperties struct {
47*67e74705SXin Li	In   *string
48*67e74705SXin Li	Outs []string
49*67e74705SXin Li}
50*67e74705SXin Li
51*67e74705SXin Litype tblgen struct {
52*67e74705SXin Li	android.ModuleBase
53*67e74705SXin Li
54*67e74705SXin Li	properties tblgenProperties
55*67e74705SXin Li
56*67e74705SXin Li	exportedHeaderDirs android.Paths
57*67e74705SXin Li	generatedHeaders   android.Paths
58*67e74705SXin Li}
59*67e74705SXin Li
60*67e74705SXin Livar _ genrule.SourceFileGenerator = (*tblgen)(nil)
61*67e74705SXin Li
62*67e74705SXin Lifunc (t *tblgen) GenerateAndroidBuildActions(ctx android.ModuleContext) {
63*67e74705SXin Li	in := android.PathForModuleSrc(ctx, proptools.String(t.properties.In))
64*67e74705SXin Li
65*67e74705SXin Li	includes := []string{
66*67e74705SXin Li		"-I " + ctx.ModuleDir(),
67*67e74705SXin Li		"-I external/llvm/include",
68*67e74705SXin Li		"-I external/llvm/lib/Target",
69*67e74705SXin Li		"-I external/clang/include",
70*67e74705SXin Li		"-I " + filepath.Dir(in.String()),
71*67e74705SXin Li	}
72*67e74705SXin Li
73*67e74705SXin Li	for _, o := range t.properties.Outs {
74*67e74705SXin Li		out := android.PathForModuleGen(ctx, o)
75*67e74705SXin Li		generator := outToGenerator(ctx, o)
76*67e74705SXin Li
77*67e74705SXin Li		ctx.ModuleBuild(pctx, android.ModuleBuildParams{
78*67e74705SXin Li			Rule:   tblgenRule,
79*67e74705SXin Li			Input:  in,
80*67e74705SXin Li			Output: out,
81*67e74705SXin Li			Args: map[string]string{
82*67e74705SXin Li				"includes": strings.Join(includes, " "),
83*67e74705SXin Li				"genopt":   generator,
84*67e74705SXin Li			},
85*67e74705SXin Li		})
86*67e74705SXin Li		t.generatedHeaders = append(t.generatedHeaders, out)
87*67e74705SXin Li	}
88*67e74705SXin Li
89*67e74705SXin Li	t.exportedHeaderDirs = append(t.exportedHeaderDirs, android.PathForModuleGen(ctx, ""))
90*67e74705SXin Li}
91*67e74705SXin Li
92*67e74705SXin Lifunc outToGenerator(ctx android.ModuleContext, out string) string {
93*67e74705SXin Li	out = filepath.Base(out)
94*67e74705SXin Li	switch {
95*67e74705SXin Li	case out == "AttrDump.inc":
96*67e74705SXin Li		return "-gen-clang-attr-dump"
97*67e74705SXin Li	case out == "AttrImpl.inc":
98*67e74705SXin Li		return "-gen-clang-attr-impl"
99*67e74705SXin Li	case out == "AttrHasAttributeImpl.inc":
100*67e74705SXin Li		return "-gen-clang-attr-has-attribute-impl"
101*67e74705SXin Li	case out == "AttrList.inc":
102*67e74705SXin Li		return "-gen-clang-attr-list"
103*67e74705SXin Li	case out == "AttrSpellingListIndex.inc":
104*67e74705SXin Li		return "-gen-clang-attr-spelling-index"
105*67e74705SXin Li	case out == "AttrPCHRead.inc":
106*67e74705SXin Li		return "-gen-clang-attr-pch-read"
107*67e74705SXin Li	case out == "AttrPCHWrite.inc":
108*67e74705SXin Li		return "-gen-clang-attr-pch-write"
109*67e74705SXin Li	case out == "Attrs.inc":
110*67e74705SXin Li		return "-gen-clang-attr-classes"
111*67e74705SXin Li	case out == "AttrParserStringSwitches.inc":
112*67e74705SXin Li		return "-gen-clang-attr-parser-string-switches"
113*67e74705SXin Li	case out == "AttrVisitor.inc":
114*67e74705SXin Li		return "-gen-clang-attr-ast-visitor"
115*67e74705SXin Li	case out == "AttrParsedAttrKinds.inc":
116*67e74705SXin Li		return "-gen-clang-attr-parsed-attr-kinds"
117*67e74705SXin Li	case out == "AttrParsedAttrImpl.inc":
118*67e74705SXin Li		return "-gen-clang-attr-parsed-attr-impl"
119*67e74705SXin Li	case out == "AttrParsedAttrList.inc":
120*67e74705SXin Li		return "-gen-clang-attr-parsed-attr-list"
121*67e74705SXin Li	case out == "AttrTemplateInstantiate.inc":
122*67e74705SXin Li		return "-gen-clang-attr-template-instantiate"
123*67e74705SXin Li	case out == "Checkers.inc":
124*67e74705SXin Li		return "-gen-clang-sa-checkers"
125*67e74705SXin Li	case out == "CommentCommandInfo.inc":
126*67e74705SXin Li		return "-gen-clang-comment-command-info"
127*67e74705SXin Li	case out == "CommentCommandList.inc":
128*67e74705SXin Li		return "-gen-clang-comment-command-list"
129*67e74705SXin Li	case out == "CommentHTMLNamedCharacterReferences.inc":
130*67e74705SXin Li		return "-gen-clang-comment-html-named-character-references"
131*67e74705SXin Li	case out == "CommentHTMLTagsProperties.inc":
132*67e74705SXin Li		return "-gen-clang-comment-html-tags-properties"
133*67e74705SXin Li	case out == "CommentHTMLTags.inc":
134*67e74705SXin Li		return "-gen-clang-comment-html-tags"
135*67e74705SXin Li	case out == "CommentNodes.inc":
136*67e74705SXin Li		return "-gen-clang-comment-nodes"
137*67e74705SXin Li	case strings.HasPrefix(out, "Diagnostic") && strings.HasSuffix(out, "Kinds.inc"):
138*67e74705SXin Li		component := strings.TrimPrefix(strings.TrimSuffix(out, "Kinds.inc"), "Diagnostic")
139*67e74705SXin Li		return "-gen-clang-diags-defs -clang-component=" + component
140*67e74705SXin Li	case out == "DiagnosticGroups.inc":
141*67e74705SXin Li		return "-gen-clang-diag-groups"
142*67e74705SXin Li	case out == "DiagnosticIndexName.inc":
143*67e74705SXin Li		return "-gen-clang-diag-groups"
144*67e74705SXin Li	case out == "DeclNodes.inc":
145*67e74705SXin Li		return "-gen-clang-decl-nodes"
146*67e74705SXin Li	case out == "StmtNodes.inc":
147*67e74705SXin Li		return "-gen-clang-stmt-nodes"
148*67e74705SXin Li	case out == "arm_neon.inc":
149*67e74705SXin Li		return "-gen-arm-neon-sema"
150*67e74705SXin Li	case out == "arm_neon.h":
151*67e74705SXin Li		return "-gen-arm-neon"
152*67e74705SXin Li	}
153*67e74705SXin Li
154*67e74705SXin Li	ctx.ModuleErrorf("couldn't map output file %q to a generator", out)
155*67e74705SXin Li	return ""
156*67e74705SXin Li}
157*67e74705SXin Li
158*67e74705SXin Lifunc (t *tblgen) DepsMutator(ctx android.BottomUpMutatorContext) {
159*67e74705SXin Li}
160*67e74705SXin Li
161*67e74705SXin Lifunc (t *tblgen) GeneratedHeaderDirs() android.Paths {
162*67e74705SXin Li	return t.exportedHeaderDirs
163*67e74705SXin Li}
164*67e74705SXin Li
165*67e74705SXin Lifunc (t *tblgen) GeneratedSourceFiles() android.Paths {
166*67e74705SXin Li	return nil
167*67e74705SXin Li}
168*67e74705SXin Li
169*67e74705SXin Lifunc (t *tblgen) GeneratedDeps() android.Paths {
170*67e74705SXin Li	return t.generatedHeaders
171*67e74705SXin Li}
172*67e74705SXin Li
173*67e74705SXin Lifunc clangTblgenFactory() android.Module {
174*67e74705SXin Li	t := &tblgen{}
175*67e74705SXin Li
176*67e74705SXin Li	t.AddProperties(&t.properties)
177*67e74705SXin Li	android.InitAndroidModule(t)
178*67e74705SXin Li	return t
179*67e74705SXin Li}
180