1 // Copyright (C) 2016 The Android Open Source Project
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
7 // http://www.apache.org/licenses/LICENSE-2.0
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.
21 "android/soong/android"
22 "android/soong/genrule"
24 "github.com/google/blueprint"
28 android.RegisterModuleType("llvm_tblgen", llvmTblgenFactory)
32 pctx = android.NewPackageContext("android/soong/llvm")
34 llvmTblgen = pctx.HostBinToolVariable("llvmTblgen", "llvm-tblgen")
36 tblgenRule = pctx.StaticRule("tblgenRule", blueprint.RuleParams{
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")
45 type tblgenProperties struct {
53 properties tblgenProperties
55 exportedHeaderDirs android.Paths
56 generatedHeaders android.Paths
59 var _ genrule.SourceFileGenerator = (*tblgen)(nil)
61 func (t *tblgen) GenerateAndroidBuildActions(ctx android.ModuleContext) {
62 in := android.PathForModuleSrc(ctx, t.properties.In)
65 "-I " + ctx.ModuleDir(),
66 "-I external/llvm/include",
67 "-I external/llvm/lib/Target",
68 "-I " + filepath.Dir(in.String()),
71 for _, o := range t.properties.Outs {
72 out := android.PathForModuleGen(ctx, o)
73 generator := outToGenerator(ctx, o)
75 ctx.ModuleBuild(pctx, android.ModuleBuildParams{
79 Args: map[string]string{
80 "includes": strings.Join(includes, " "),
81 "generator": generator,
84 t.generatedHeaders = append(t.generatedHeaders, out)
87 t.exportedHeaderDirs = append(t.exportedHeaderDirs, android.PathForModuleGen(ctx, ""))
90 func outToGenerator(ctx android.ModuleContext, out string) string {
91 out = filepath.Base(out)
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, "GenSearchableTables.inc"):
114 return "-gen-searchable-tables"
115 case strings.HasSuffix(out, "GenSystemOperands.inc"):
116 return "-gen-searchable-tables"
117 case strings.HasSuffix(out, "GenSystemRegister.inc"):
118 return "-gen-searchable-tables"
119 case strings.HasSuffix(out, "InstCombineTables.inc"):
120 return "-gen-searchable-tables"
121 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"
129 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"
133 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"
139 case strings.HasSuffix(out, "GenRegisterBank.inc"):
140 return "-gen-register-bank"
141 case strings.HasSuffix(out, "GenGlobalISel.inc"):
142 return "-gen-global-isel"
143 case strings.HasSuffix(out, "X86GenEVEX2VEXTables.inc"):
144 return "-gen-x86-EVEX2VEX-tables"
145 case out == "Attributes.inc", out == "AttributesCompatFunc.inc":
147 case out == "IntrinsicEnums.inc":
148 return "-gen-intrinsic-enums"
149 case out == "IntrinsicImpl.inc":
150 return "-gen-intrinsic-impl"
153 ctx.ModuleErrorf("couldn't map output file %q to a generator", out)
157 func (t *tblgen) DepsMutator(ctx android.BottomUpMutatorContext) {
160 func (t *tblgen) GeneratedHeaderDirs() android.Paths {
161 return t.exportedHeaderDirs
164 func (t *tblgen) GeneratedSourceFiles() android.Paths {
165 return t.generatedHeaders
168 func llvmTblgenFactory() android.Module {
170 t.AddProperties(&t.properties)
171 android.InitAndroidModule(t)