OSDN Git Service

android: add 'Restat: true' to tblgenRule definition (llvm90)
[android-x86/external-llvm.git] / 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 llvm90
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("llvm90_tblgen", llvm90TblgenFactory)
29 }
30
31 var (
32         pctx = android.NewPackageContext("android/soong/llvm90")
33
34         llvm90Tblgen = pctx.HostBinToolVariable("llvm90Tblgen", "llvm90-tblgen")
35
36         tblgenRule90 = pctx.StaticRule("tblgenRule90", blueprint.RuleParams{
37                 Depfile:     "${out}.d",
38                 Deps:        blueprint.DepsGCC,
39                 Command:     "${llvm90Tblgen} ${includes} ${generator} -d ${depfile} -o ${out} ${in}",
40                 CommandDeps: []string{"${llvm90Tblgen}"},
41                 Description: "LLVM90 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/llvm90/include",
68                 "-I external/llvm90/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:   tblgenRule90,
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-tgt-intrinsic-enums"
132         case strings.HasSuffix(out, "GenIntrinsicImpl.inc"):
133                 return "-gen-tgt-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, "GenGlobalISel.inc"):
143                 return "-gen-global-isel"
144         case strings.HasSuffix(out, "X86GenEVEX2VEXTables.inc"):
145                 return "-gen-x86-EVEX2VEX-tables"
146         case out == "Attributes.inc", out == "AttributesCompatFunc.inc":
147                 return "-gen-attrs"
148         case out == "IntrinsicEnums.inc":
149                 return "-gen-intrinsic-enums"
150         case out == "IntrinsicImpl.inc":
151                 return "-gen-intrinsic-impl"
152         }
153
154         ctx.ModuleErrorf("couldn't map output file %q to a generator", out)
155         return ""
156 }
157
158 func (t *tblgen) DepsMutator(ctx android.BottomUpMutatorContext) {
159 }
160
161 func (t *tblgen) GeneratedHeaderDirs() android.Paths {
162         return t.exportedHeaderDirs
163 }
164
165 func (t *tblgen) GeneratedSourceFiles() android.Paths {
166         return nil
167 }
168
169 func (t *tblgen) GeneratedDeps() android.Paths {
170         return t.generatedHeaders
171 }
172
173 func llvm90TblgenFactory() android.Module {
174         t := &tblgen{}
175         t.AddProperties(&t.properties)
176         android.InitAndroidModule(t)
177         return t
178 }