blob: 743d6b656910fef3cea5ebf44cecce558bfc8afb [file] [log] [blame]
Mauro Rossi4bdf3032018-08-25 12:44:44 +02001// 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
Mauro Rossi6f676672019-02-23 13:23:31 +010015package llvm80
Mauro Rossi4bdf3032018-08-25 12:44:44 +020016
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() {
Mauro Rossi6f676672019-02-23 13:23:31 +010028 android.RegisterModuleType("llvm80_tblgen", llvm80TblgenFactory)
Mauro Rossi4bdf3032018-08-25 12:44:44 +020029}
30
31var (
Mauro Rossi6f676672019-02-23 13:23:31 +010032 pctx = android.NewPackageContext("android/soong/llvm80")
Mauro Rossi4bdf3032018-08-25 12:44:44 +020033
Mauro Rossi6f676672019-02-23 13:23:31 +010034 llvm80Tblgen = pctx.HostBinToolVariable("llvm80Tblgen", "llvm80-tblgen")
Mauro Rossi4bdf3032018-08-25 12:44:44 +020035
Mauro Rossi6f676672019-02-23 13:23:31 +010036 tblgenRule80 = pctx.StaticRule("tblgenRule80", blueprint.RuleParams{
Mauro Rossi4bdf3032018-08-25 12:44:44 +020037 Depfile: "${out}.d",
38 Deps: blueprint.DepsGCC,
Mauro Rossi6f676672019-02-23 13:23:31 +010039 Command: "${llvm80Tblgen} ${includes} ${generator} -d ${depfile} -o ${out} ${in}",
40 CommandDeps: []string{"${llvm80Tblgen}"},
41 Description: "LLVM80 TableGen $in => $out",
Mauro Rossi4bdf3032018-08-25 12:44:44 +020042 }, "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(),
Mauro Rossi6f676672019-02-23 13:23:31 +010066 "-I external/llvm80/include",
67 "-I external/llvm80/lib/Target",
Mauro Rossi4bdf3032018-08-25 12:44:44 +020068 "-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{
Mauro Rossi6f676672019-02-23 13:23:31 +010076 Rule: tblgenRule80,
Mauro Rossi4bdf3032018-08-25 12:44:44 +020077 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"
Mauro Rossice0a45c2018-09-01 18:36:23 +0200113 case strings.HasSuffix(out, "GenSearchableTables.inc"):
114 return "-gen-searchable-tables"
Mauro Rossi4bdf3032018-08-25 12:44:44 +0200115 case strings.HasSuffix(out, "GenSystemOperands.inc"):
116 return "-gen-searchable-tables"
Mauro Rossic8ac4112018-09-01 13:25:45 +0200117 case strings.HasSuffix(out, "GenSystemRegister.inc"):
118 return "-gen-searchable-tables"
Mauro Rossi6c1d7232018-09-01 17:24:18 +0200119 case strings.HasSuffix(out, "InstCombineTables.inc"):
120 return "-gen-searchable-tables"
Mauro Rossi4bdf3032018-08-25 12:44:44 +0200121 case strings.HasSuffix(out, "GenEDInfo.inc"):
122 return "-gen-enhanced-disassembly-info"
123 case strings.HasSuffix(out, "GenFastISel.inc"):
124 return "-gen-fast-isel"
125 case strings.HasSuffix(out, "GenSubtargetInfo.inc"):
126 return "-gen-subtarget"
127 case strings.HasSuffix(out, "GenCallingConv.inc"):
128 return "-gen-callingconv"
Mauro Rossi64fcb242018-09-01 16:24:14 +0200129 case strings.HasSuffix(out, "GenIntrinsicEnums.inc"):
130 return "-gen-tgt-intrinsic-enums"
131 case strings.HasSuffix(out, "GenIntrinsicImpl.inc"):
132 return "-gen-tgt-intrinsic-impl"
Mauro Rossi4bdf3032018-08-25 12:44:44 +0200133 case strings.HasSuffix(out, "GenDecoderTables.inc"):
134 return "-gen-arm-decoder"
135 case strings.HasSuffix(out, "Options.inc"):
136 return "-gen-opt-parser-defs"
137 case strings.HasSuffix(out, "GenDFAPacketizer.inc"):
138 return "-gen-dfa-packetizer"
Mauro Rossi77cabda2018-08-25 23:45:24 +0200139 case strings.HasSuffix(out, "GenRegisterBank.inc"):
140 return "-gen-register-bank"
141 case strings.HasSuffix(out, "GenGlobalISel.inc"):
142 return "-gen-global-isel"
Mauro Rossi832aaeb2018-09-01 01:45:32 +0200143 case strings.HasSuffix(out, "X86GenEVEX2VEXTables.inc"):
144 return "-gen-x86-EVEX2VEX-tables"
Mauro Rossi6062a8e2018-09-01 16:10:24 +0200145 case out == "Attributes.inc", out == "AttributesCompatFunc.inc":
Mauro Rossi4bdf3032018-08-25 12:44:44 +0200146 return "-gen-attrs"
Mauro Rossi64fcb242018-09-01 16:24:14 +0200147 case out == "IntrinsicEnums.inc":
148 return "-gen-intrinsic-enums"
149 case out == "IntrinsicImpl.inc":
150 return "-gen-intrinsic-impl"
Mauro Rossi4bdf3032018-08-25 12:44:44 +0200151 }
152
153 ctx.ModuleErrorf("couldn't map output file %q to a generator", out)
154 return ""
155}
156
157func (t *tblgen) DepsMutator(ctx android.BottomUpMutatorContext) {
158}
159
160func (t *tblgen) GeneratedHeaderDirs() android.Paths {
161 return t.exportedHeaderDirs
162}
163
164func (t *tblgen) GeneratedSourceFiles() android.Paths {
Dan Willemsen65653032018-02-21 18:47:18 -0800165 return nil
166}
167
168func (t *tblgen) GeneratedDeps() android.Paths {
Mauro Rossi4bdf3032018-08-25 12:44:44 +0200169 return t.generatedHeaders
170}
171
Mauro Rossi6f676672019-02-23 13:23:31 +0100172func llvm80TblgenFactory() android.Module {
Mauro Rossi4bdf3032018-08-25 12:44:44 +0200173 t := &tblgen{}
174 t.AddProperties(&t.properties)
175 android.InitAndroidModule(t)
176 return t
177}