OSDN Git Service

0b9a2c702a937b654847aeebd6e92b82744b93bd
[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 llvm
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("llvm_tblgen", llvmTblgenFactory)
29 }
30
31 var (
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
45 type tblgenProperties struct {
46         In   string
47         Outs []string
48 }
49
50 type tblgen struct {
51         android.ModuleBase
52
53         properties tblgenProperties
54
55         exportedHeaderDirs android.Paths
56         generatedHeaders   android.Paths
57 }
58
59 var _ genrule.SourceFileGenerator = (*tblgen)(nil)
60
61 func (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
90 func 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, "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":
146                 return "-gen-attrs"
147         case out == "IntrinsicEnums.inc":
148                 return "-gen-intrinsic-enums"
149         case out == "IntrinsicImpl.inc":
150                 return "-gen-intrinsic-impl"
151         }
152
153         ctx.ModuleErrorf("couldn't map output file %q to a generator", out)
154         return ""
155 }
156
157 func (t *tblgen) DepsMutator(ctx android.BottomUpMutatorContext) {
158 }
159
160 func (t *tblgen) GeneratedHeaderDirs() android.Paths {
161         return t.exportedHeaderDirs
162 }
163
164 func (t *tblgen) GeneratedSourceFiles() android.Paths {
165         return t.generatedHeaders
166 }
167
168 func llvmTblgenFactory() android.Module {
169         t := &tblgen{}
170         t.AddProperties(&t.properties)
171         android.InitAndroidModule(t)
172         return t
173 }