OSDN Git Service

3f5b1486503338db8dec2f6eab1d306a13a52e7d
[android-x86/external-llvm-project.git] / llvm / soong / tblgen.go
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
15 package llvm12
16
17 import (
18         "path/filepath"
19         "strings"
20
21         "android/soong/android"
22         "android/soong/genrule"
23
24         "github.com/google/blueprint"
25 )
26
27 func init() {
28         android.RegisterModuleType("llvm12_tblgen", llvm12TblgenFactory)
29 }
30
31 var (
32         pctx = android.NewPackageContext("android/soong/llvm12")
33
34         llvm12Tblgen = pctx.HostBinToolVariable("llvm12Tblgen", "llvm12-tblgen")
35
36         tblgenRule12 = pctx.StaticRule("tblgenRule12", blueprint.RuleParams{
37                 Depfile:     "${out}.d",
38                 Deps:        blueprint.DepsGCC,
39                 Command:     "${llvm12Tblgen} ${includes} ${generator} -d ${depfile} -o ${out} ${in}",
40                 CommandDeps: []string{"${llvm12Tblgen}"},
41                 Description: "LLVM12 TableGen $in => $out",
42                 Restat:      true,
43         }, "includes", "depfile", "generator")
44 )
45
46 type tblgenProperties struct {
47         In   string
48         Outs []string
49 }
50
51 type tblgen struct {
52         android.ModuleBase
53
54         properties tblgenProperties
55
56         exportedHeaderDirs android.Paths
57         generatedHeaders   android.Paths
58 }
59
60 var _ genrule.SourceFileGenerator = (*tblgen)(nil)
61
62 func (t *tblgen) GenerateAndroidBuildActions(ctx android.ModuleContext) {
63         in := android.PathForModuleSrc(ctx, t.properties.In)
64
65         includes := []string{
66                 "-I " + ctx.ModuleDir(),
67                 "-I external/llvm-project/llvm/include",
68                 "-I external/llvm-project/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:   tblgenRule12,
78                         Input:  in,
79                         Output: out,
80                         Args: map[string]string{
81                                 "includes":  strings.Join(includes, " "),
82                                 "generator": generator,
83                         },
84                 })
85                 t.generatedHeaders = append(t.generatedHeaders, out)
86         }
87
88         t.exportedHeaderDirs = append(t.exportedHeaderDirs, android.PathForModuleGen(ctx, ""))
89 }
90
91 func 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, "GenSearchableTables.inc"):
115                 return "-gen-searchable-tables"
116         case strings.HasSuffix(out, "GenSystemOperands.inc"):
117                 return "-gen-searchable-tables"
118         case strings.HasSuffix(out, "GenSystemRegister.inc"):
119                 return "-gen-searchable-tables"
120         case strings.HasSuffix(out, "InstCombineTables.inc"):
121                 return "-gen-searchable-tables"
122         case strings.HasSuffix(out, "GenEDInfo.inc"):
123                 return "-gen-enhanced-disassembly-info"
124         case strings.HasSuffix(out, "GenFastISel.inc"):
125                 return "-gen-fast-isel"
126         case strings.HasSuffix(out, "GenSubtargetInfo.inc"):
127                 return "-gen-subtarget"
128         case strings.HasSuffix(out, "GenCallingConv.inc"):
129                 return "-gen-callingconv"
130         case strings.HasSuffix(out, "GenIntrinsicEnums.inc"):
131                 return "-gen-intrinsic-enums"
132         case strings.HasSuffix(out, "GenIntrinsicImpl.inc"):
133                 return "-gen-intrinsic-impl"
134         case strings.HasSuffix(out, "GenDecoderTables.inc"):
135                 return "-gen-arm-decoder"
136         case strings.HasSuffix(out, "Options.inc"):
137                 return "-gen-opt-parser-defs"
138         case strings.HasSuffix(out, "GenDFAPacketizer.inc"):
139                 return "-gen-dfa-packetizer"
140         case strings.HasSuffix(out, "GenRegisterBank.inc"):
141                 return "-gen-register-bank"
142         case strings.HasSuffix(out, "AArch64GenPreLegalizeGICombiner.inc"):
143                 return "-gen-global-isel-combiner -combiners=\"AArch64PreLegalizerCombinerHelper\""
144         case strings.HasSuffix(out, "AArch64GenPostLegalizeGICombiner.inc"):
145                 return "-gen-global-isel-combiner -combiners=\"AArch64PostLegalizerCombinerHelper\""
146         case strings.HasSuffix(out, "AArch64GenPostLegalizeGILowering.inc"):
147                 return "-gen-global-isel-combiner -combiners=\"AArch64PostLegalizerLoweringHelper\""
148         case strings.HasSuffix(out, "AMDGPUGenPreLegalizeGICombiner.inc"):
149                 return "-gen-global-isel-combiner -combiners=\"AMDGPUPreLegalizerCombinerHelper\""
150         case strings.HasSuffix(out, "AMDGPUGenPostLegalizeGICombiner.inc"):
151                 return "-gen-global-isel-combiner -combiners=\"AMDGPUPostLegalizerCombinerHelper\""
152         case strings.HasSuffix(out, "AMDGPUGenRegBankGICombiner.inc"):
153                 return "-gen-global-isel-combiner -combiners=\"AMDGPURegBankCombinerHelper\""
154         case strings.HasSuffix(out, "GenGlobalISel.inc"):
155                 return "-gen-global-isel"
156         case strings.HasSuffix(out, "X86GenEVEX2VEXTables.inc"):
157                 return "-gen-x86-EVEX2VEX-tables"
158         case out == "Attributes.inc", out == "AttributesCompatFunc.inc":
159                 return "-gen-attrs"
160         case out == "IntrinsicEnums.inc":
161                 return "-gen-intrinsic-enums"
162         case out == "IntrinsicImpl.inc":
163                 return "-gen-intrinsic-impl"
164         case out == "IntrinsicsAArch64.h":
165                 return "-gen-intrinsic-enums -intrinsic-prefix=aarch64"
166         case out == "IntrinsicsAMDGPU.h":
167                 return "-gen-intrinsic-enums -intrinsic-prefix=amdgcn"
168         case out == "IntrinsicsARM.h":
169                 return "-gen-intrinsic-enums -intrinsic-prefix=arm"
170         case out == "IntrinsicsBPF.h":
171                 return "-gen-intrinsic-enums -intrinsic-prefix=bpf"
172         case out == "IntrinsicsHexagon.h":
173                 return "-gen-intrinsic-enums -intrinsic-prefix=hexagon"
174         case out == "IntrinsicsMips.h":
175                 return "-gen-intrinsic-enums -intrinsic-prefix=mips"
176         case out == "IntrinsicsNVPTX.h":
177                 return "-gen-intrinsic-enums -intrinsic-prefix=nvvm"
178         case out == "IntrinsicsPowerPC.h":
179                 return "-gen-intrinsic-enums -intrinsic-prefix=ppc"
180         case out == "IntrinsicsR600.h":
181                 return "-gen-intrinsic-enums -intrinsic-prefix=r600"
182         case out == "IntrinsicsRISCV.h":
183                 return "-gen-intrinsic-enums -intrinsic-prefix=riscv"
184         case out == "IntrinsicsS390.h":
185                 return "-gen-intrinsic-enums -intrinsic-prefix=s390"
186         case out == "IntrinsicsWebAssembly.h":
187                 return "-gen-intrinsic-enums -intrinsic-prefix=wasm"
188         case out == "IntrinsicsX86.h":
189                 return "-gen-intrinsic-enums -intrinsic-prefix=x86"
190         case out == "IntrinsicsXCore.h":
191                 return "-gen-intrinsic-enums -intrinsic-prefix=xcore"
192         case out == "IntrinsicsVE.h":
193                 return "-gen-intrinsic-enums -intrinsic-prefix=ve"
194         case out == "OMP.h.inc":
195                 return "--gen-directive-decl"
196         case out == "OMP.cpp.inc":
197                 return "--gen-directive-gen"
198         case out == "OMP.cpp":
199                 return "--gen-directive-impl"
200         }
201
202         ctx.ModuleErrorf("couldn't map output file %q to a generator", out)
203         return ""
204 }
205
206 func (t *tblgen) DepsMutator(ctx android.BottomUpMutatorContext) {
207 }
208
209 func (t *tblgen) GeneratedHeaderDirs() android.Paths {
210         return t.exportedHeaderDirs
211 }
212
213 func (t *tblgen) GeneratedSourceFiles() android.Paths {
214         return nil
215 }
216
217 func (t *tblgen) GeneratedDeps() android.Paths {
218         return t.generatedHeaders
219 }
220
221 func llvm12TblgenFactory() android.Module {
222         t := &tblgen{}
223         t.AddProperties(&t.properties)
224         android.InitAndroidModule(t)
225         return t
226 }