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) 26 27func init() { 28 android.RegisterModuleType("llvm_tblgen", llvmTblgenFactory) 29} 30 31var ( 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 45type tblgenProperties struct { 46 In string 47 Outs []string 48} 49 50type tblgen struct { 51 android.ModuleBase 52 53 properties tblgenProperties 54 55 exportedHeaderDirs android.Paths 56 generatedHeaders android.Paths 57} 58 59var _ genrule.SourceFileGenerator = (*tblgen)(nil) 60 61func (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 90func 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, "GenSystemOperands.inc"): 114 return "-gen-searchable-tables" 115 case strings.HasSuffix(out, "GenEDInfo.inc"): 116 return "-gen-enhanced-disassembly-info" 117 case strings.HasSuffix(out, "GenFastISel.inc"): 118 return "-gen-fast-isel" 119 case strings.HasSuffix(out, "GenSubtargetInfo.inc"): 120 return "-gen-subtarget" 121 case strings.HasSuffix(out, "GenCallingConv.inc"): 122 return "-gen-callingconv" 123 case strings.HasSuffix(out, "GenIntrinsics.inc"): 124 return "-gen-intrinsics" 125 case strings.HasSuffix(out, "GenDecoderTables.inc"): 126 return "-gen-arm-decoder" 127 case strings.HasSuffix(out, "Options.inc"): 128 return "-gen-opt-parser-defs" 129 case out == "Attributes.inc", out == "AttributesCompatFunc.inc": 130 return "-gen-attrs" 131 case out == "Intrinsics.gen": 132 return "-gen-intrinsic" 133 } 134 135 ctx.ModuleErrorf("couldn't map output file %q to a generator", out) 136 return "" 137} 138 139func (t *tblgen) DepsMutator(ctx android.BottomUpMutatorContext) { 140} 141 142func (t *tblgen) GeneratedHeaderDirs() android.Paths { 143 return t.exportedHeaderDirs 144} 145 146func (t *tblgen) GeneratedSourceFiles() android.Paths { 147 return t.generatedHeaders 148} 149 150func llvmTblgenFactory() (blueprint.Module, []interface{}) { 151 t := &tblgen{} 152 153 return android.InitAndroidModule(t, &t.properties) 154} 155