• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (C) 2016 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package llvm
16
17import (
18	"path/filepath"
19	"strings"
20
21	"android/soong/android"
22	"android/soong/genrule"
23
24	"github.com/google/blueprint"
25	"github.com/google/blueprint/proptools"
26)
27
28func init() {
29	android.RegisterModuleType("llvm_tblgen", llvmTblgenFactory)
30}
31
32var (
33	pctx = android.NewPackageContext("android/soong/llvm")
34
35	llvmTblgen = pctx.HostBinToolVariable("llvmTblgen", "llvm-tblgen")
36
37	tblgenRule = pctx.StaticRule("tblgenRule", blueprint.RuleParams{
38		Depfile:     "${out}.d",
39		Deps:        blueprint.DepsGCC,
40		Command:     "${llvmTblgen} ${includes} ${genopt} -d ${depfile} -o ${out} ${in}",
41		CommandDeps: []string{"${llvmTblgen}"},
42		Description: "LLVM TableGen $in => $out",
43	}, "includes", "depfile", "genopt")
44)
45
46type tblgenProperties struct {
47	In   *string
48	Outs []string
49}
50
51type tblgen struct {
52	android.ModuleBase
53
54	properties tblgenProperties
55
56	exportedHeaderDirs android.Paths
57	generatedHeaders   android.Paths
58}
59
60var _ genrule.SourceFileGenerator = (*tblgen)(nil)
61
62func (t *tblgen) GenerateAndroidBuildActions(ctx android.ModuleContext) {
63	in := android.PathForModuleSrc(ctx, proptools.String(t.properties.In))
64
65	includes := []string{
66		"-I " + ctx.ModuleDir(),
67		"-I external/llvm/include",
68		"-I external/llvm/lib/Target",
69		"-I " + filepath.Dir(in.String()),
70	}
71
72	for _, o := range t.properties.Outs {
73		out := android.PathForModuleGen(ctx, o)
74		generator := outToGenerator(ctx, o)
75
76		ctx.ModuleBuild(pctx, android.ModuleBuildParams{
77			Rule:   tblgenRule,
78			Input:  in,
79			Output: out,
80			Args: map[string]string{
81				"includes": strings.Join(includes, " "),
82				"genopt":   generator,
83			},
84		})
85		t.generatedHeaders = append(t.generatedHeaders, out)
86	}
87
88	t.exportedHeaderDirs = append(t.exportedHeaderDirs, android.PathForModuleGen(ctx, ""))
89}
90
91func outToGenerator(ctx android.ModuleContext, out string) string {
92	out = filepath.Base(out)
93	switch {
94	case strings.HasSuffix(out, "GenRegisterInfo.inc"):
95		return "-gen-register-info"
96	case strings.HasSuffix(out, "GenInstrInfo.inc"):
97		return "-gen-instr-info"
98	case strings.HasSuffix(out, "GenAsmWriter.inc"):
99		return "-gen-asm-writer"
100	case strings.HasSuffix(out, "GenAsmWriter1.inc"):
101		return "-gen-asm-writer -asmwriternum=1"
102	case strings.HasSuffix(out, "GenAsmMatcher.inc"):
103		return "-gen-asm-matcher"
104	case strings.HasSuffix(out, "GenCodeEmitter.inc"):
105		return "-gen-emitter"
106	case strings.HasSuffix(out, "GenMCCodeEmitter.inc"):
107		return "-gen-emitter"
108	case strings.HasSuffix(out, "GenMCPseudoLowering.inc"):
109		return "-gen-pseudo-lowering"
110	case strings.HasSuffix(out, "GenDAGISel.inc"):
111		return "-gen-dag-isel"
112	case strings.HasSuffix(out, "GenDisassemblerTables.inc"):
113		return "-gen-disassembler"
114	case strings.HasSuffix(out, "GenSystemOperands.inc"):
115		return "-gen-searchable-tables"
116	case strings.HasSuffix(out, "GenEDInfo.inc"):
117		return "-gen-enhanced-disassembly-info"
118	case strings.HasSuffix(out, "GenFastISel.inc"):
119		return "-gen-fast-isel"
120	case strings.HasSuffix(out, "GenSubtargetInfo.inc"):
121		return "-gen-subtarget"
122	case strings.HasSuffix(out, "GenCallingConv.inc"):
123		return "-gen-callingconv"
124	case strings.HasSuffix(out, "GenIntrinsics.inc"):
125		return "-gen-intrinsics"
126	case strings.HasSuffix(out, "GenDecoderTables.inc"):
127		return "-gen-arm-decoder"
128	case strings.HasSuffix(out, "Options.inc"):
129		return "-gen-opt-parser-defs"
130	case out == "Attributes.inc", out == "AttributesCompatFunc.inc":
131		return "-gen-attrs"
132	case out == "Intrinsics.gen":
133		return "-gen-intrinsic"
134	}
135
136	ctx.ModuleErrorf("couldn't map output file %q to a generator", out)
137	return ""
138}
139
140func (t *tblgen) DepsMutator(ctx android.BottomUpMutatorContext) {
141}
142
143func (t *tblgen) GeneratedHeaderDirs() android.Paths {
144	return t.exportedHeaderDirs
145}
146
147func (t *tblgen) GeneratedSourceFiles() android.Paths {
148	return nil
149}
150
151func (t *tblgen) GeneratedDeps() android.Paths {
152	return t.generatedHeaders
153}
154
155func llvmTblgenFactory() android.Module {
156	t := &tblgen{}
157	t.AddProperties(&t.properties)
158	android.InitAndroidModule(t)
159	return t
160}
161