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 15package llvm 16 17import ( 18 "path/filepath" 19 "strings" 20 21 "android/soong/android" 22 "android/soong/genrule" 23 24 "github.com/google/blueprint" 25 "github.com/google/blueprint/proptools" 26) 27 28func init() { 29 android.RegisterModuleType("llvm_tblgen", llvmTblgenFactory) 30} 31 32var ( 33 pctx = android.NewPackageContext("android/soong/llvm") 34 35 llvmTblgen = pctx.HostBinToolVariable("llvmTblgen", "llvm-tblgen") 36 37 tblgenRule = pctx.StaticRule("tblgenRule", blueprint.RuleParams{ 38 Depfile: "${out}.d", 39 Deps: blueprint.DepsGCC, 40 Command: "${llvmTblgen} ${includes} ${genopt} -d ${depfile} -o ${out} ${in}", 41 CommandDeps: []string{"${llvmTblgen}"}, 42 Description: "LLVM TableGen $in => $out", 43 }, "includes", "depfile", "genopt") 44) 45 46type tblgenProperties struct { 47 In *string 48 Outs []string 49} 50 51type tblgen struct { 52 android.ModuleBase 53 54 properties tblgenProperties 55 56 exportedHeaderDirs android.Paths 57 generatedHeaders android.Paths 58} 59 60var _ genrule.SourceFileGenerator = (*tblgen)(nil) 61 62func (t *tblgen) GenerateAndroidBuildActions(ctx android.ModuleContext) { 63 in := android.PathForModuleSrc(ctx, proptools.String(t.properties.In)) 64 65 includes := []string{ 66 "-I " + ctx.ModuleDir(), 67 "-I external/llvm/include", 68 "-I external/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: tblgenRule, 78 Input: in, 79 Output: out, 80 Args: map[string]string{ 81 "includes": strings.Join(includes, " "), 82 "genopt": generator, 83 }, 84 }) 85 t.generatedHeaders = append(t.generatedHeaders, out) 86 } 87 88 t.exportedHeaderDirs = append(t.exportedHeaderDirs, android.PathForModuleGen(ctx, "")) 89} 90 91func 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, "GenSystemOperands.inc"): 115 return "-gen-searchable-tables" 116 case strings.HasSuffix(out, "GenEDInfo.inc"): 117 return "-gen-enhanced-disassembly-info" 118 case strings.HasSuffix(out, "GenFastISel.inc"): 119 return "-gen-fast-isel" 120 case strings.HasSuffix(out, "GenSubtargetInfo.inc"): 121 return "-gen-subtarget" 122 case strings.HasSuffix(out, "GenCallingConv.inc"): 123 return "-gen-callingconv" 124 case strings.HasSuffix(out, "GenIntrinsics.inc"): 125 return "-gen-intrinsics" 126 case strings.HasSuffix(out, "GenDecoderTables.inc"): 127 return "-gen-arm-decoder" 128 case strings.HasSuffix(out, "Options.inc"): 129 return "-gen-opt-parser-defs" 130 case out == "Attributes.inc", out == "AttributesCompatFunc.inc": 131 return "-gen-attrs" 132 case out == "Intrinsics.gen": 133 return "-gen-intrinsic" 134 } 135 136 ctx.ModuleErrorf("couldn't map output file %q to a generator", out) 137 return "" 138} 139 140func (t *tblgen) DepsMutator(ctx android.BottomUpMutatorContext) { 141} 142 143func (t *tblgen) GeneratedHeaderDirs() android.Paths { 144 return t.exportedHeaderDirs 145} 146 147func (t *tblgen) GeneratedSourceFiles() android.Paths { 148 return nil 149} 150 151func (t *tblgen) GeneratedDeps() android.Paths { 152 return t.generatedHeaders 153} 154 155func llvmTblgenFactory() android.Module { 156 t := &tblgen{} 157 t.AddProperties(&t.properties) 158 android.InitAndroidModule(t) 159 return t 160} 161