• 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)
26
27func init() {
28	android.RegisterModuleType("llvm_tblgen", llvmTblgenFactory)
29}
30
31var (
32	pctx = android.NewPackageContext("android/soong/llvm")
33
34	llvmTblgen = pctx.HostBinToolVariable("llvmTblgen", "llvm-tblgen")
35
36	tblgenRule = pctx.StaticRule("tblgenRule", blueprint.RuleParams{
37		Depfile:     "${out}.d",
38		Deps:        blueprint.DepsGCC,
39		Command:     "${llvmTblgen} ${includes} ${generator} -d ${depfile} -o ${out} ${in}",
40		CommandDeps: []string{"${llvmTblgen}"},
41		Description: "LLVM TableGen $in => $out",
42	}, "includes", "depfile", "generator")
43)
44
45type tblgenProperties struct {
46	In   string
47	Outs []string
48}
49
50type tblgen struct {
51	android.ModuleBase
52
53	properties tblgenProperties
54
55	exportedHeaderDirs android.Paths
56	generatedHeaders   android.Paths
57}
58
59var _ genrule.SourceFileGenerator = (*tblgen)(nil)
60
61func (t *tblgen) GenerateAndroidBuildActions(ctx android.ModuleContext) {
62	in := android.PathForModuleSrc(ctx, t.properties.In)
63
64	includes := []string{
65		"-I " + ctx.ModuleDir(),
66		"-I external/llvm/include",
67		"-I external/llvm/lib/Target",
68		"-I " + filepath.Dir(in.String()),
69	}
70
71	for _, o := range t.properties.Outs {
72		out := android.PathForModuleGen(ctx, o)
73		generator := outToGenerator(ctx, o)
74
75		ctx.ModuleBuild(pctx, android.ModuleBuildParams{
76			Rule:   tblgenRule,
77			Input:  in,
78			Output: out,
79			Args: map[string]string{
80				"includes":  strings.Join(includes, " "),
81				"generator": generator,
82			},
83		})
84		t.generatedHeaders = append(t.generatedHeaders, out)
85	}
86
87	t.exportedHeaderDirs = append(t.exportedHeaderDirs, android.PathForModuleGen(ctx, ""))
88}
89
90func outToGenerator(ctx android.ModuleContext, out string) string {
91	out = filepath.Base(out)
92	switch {
93	case strings.HasSuffix(out, "GenRegisterInfo.inc"):
94		return "-gen-register-info"
95	case strings.HasSuffix(out, "GenInstrInfo.inc"):
96		return "-gen-instr-info"
97	case strings.HasSuffix(out, "GenAsmWriter.inc"):
98		return "-gen-asm-writer"
99	case strings.HasSuffix(out, "GenAsmWriter1.inc"):
100		return "-gen-asm-writer -asmwriternum=1"
101	case strings.HasSuffix(out, "GenAsmMatcher.inc"):
102		return "-gen-asm-matcher"
103	case strings.HasSuffix(out, "GenCodeEmitter.inc"):
104		return "-gen-emitter"
105	case strings.HasSuffix(out, "GenMCCodeEmitter.inc"):
106		return "-gen-emitter"
107	case strings.HasSuffix(out, "GenMCPseudoLowering.inc"):
108		return "-gen-pseudo-lowering"
109	case strings.HasSuffix(out, "GenDAGISel.inc"):
110		return "-gen-dag-isel"
111	case strings.HasSuffix(out, "GenDisassemblerTables.inc"):
112		return "-gen-disassembler"
113	case strings.HasSuffix(out, "GenSystemOperands.inc"):
114		return "-gen-searchable-tables"
115	case strings.HasSuffix(out, "GenEDInfo.inc"):
116		return "-gen-enhanced-disassembly-info"
117	case strings.HasSuffix(out, "GenFastISel.inc"):
118		return "-gen-fast-isel"
119	case strings.HasSuffix(out, "GenSubtargetInfo.inc"):
120		return "-gen-subtarget"
121	case strings.HasSuffix(out, "GenCallingConv.inc"):
122		return "-gen-callingconv"
123	case strings.HasSuffix(out, "GenIntrinsics.inc"):
124		return "-gen-intrinsics"
125	case strings.HasSuffix(out, "GenDecoderTables.inc"):
126		return "-gen-arm-decoder"
127	case strings.HasSuffix(out, "Options.inc"):
128		return "-gen-opt-parser-defs"
129	case out == "Attributes.inc", out == "AttributesCompatFunc.inc":
130		return "-gen-attrs"
131	case out == "Intrinsics.gen":
132		return "-gen-intrinsic"
133	}
134
135	ctx.ModuleErrorf("couldn't map output file %q to a generator", out)
136	return ""
137}
138
139func (t *tblgen) DepsMutator(ctx android.BottomUpMutatorContext) {
140}
141
142func (t *tblgen) GeneratedHeaderDirs() android.Paths {
143	return t.exportedHeaderDirs
144}
145
146func (t *tblgen) GeneratedSourceFiles() android.Paths {
147	return t.generatedHeaders
148}
149
150func llvmTblgenFactory() (blueprint.Module, []interface{}) {
151	t := &tblgen{}
152
153	return android.InitAndroidModule(t, &t.properties)
154}
155