//===- targets.go - target data -------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file contains functions for retrieving target-specific data. // //===----------------------------------------------------------------------===// package irgen import ( "fmt" "strings" "llvm.org/llvm/bindings/go/llvm" ) // llvmDataLayout returns the data layout string // representation for the specified LLVM triple. func llvmDataLayout(triple string) (string, error) { // Triples are several fields separated by '-' characters. // The first field is the architecture. The architecture's // canonical form may include a '-' character, which would // have been translated to '_' for inclusion in a triple. arch := parseArch(triple[:strings.IndexRune(triple, '-')]) for target := llvm.FirstTarget(); target.C != nil; target = target.NextTarget() { if arch == target.Name() { machine := target.CreateTargetMachine( triple, "", "", llvm.CodeGenLevelDefault, llvm.RelocDefault, llvm.CodeModelDefault, ) targetData := machine.CreateTargetData() targetDataLayout := targetData.String() targetData.Dispose() machine.Dispose() return targetDataLayout, nil } } return "", fmt.Errorf("Invalid target triple: %s", triple) } // Based on parseArch from LLVM's lib/Support/Triple.cpp. // This is used to match the target machine type. func parseArch(arch string) string { switch arch { case "i386", "i486", "i586", "i686", "i786", "i886", "i986": return "x86" case "amd64", "x86_64": return "x86-64" case "powerpc": return "ppc" case "powerpc64", "ppu": return "ppc64" case "mblaze": return "mblaze" case "arm", "xscale": return "arm" case "thumb": return "thumb" case "spu", "cellspu": return "cellspu" case "msp430": return "msp430" case "mips", "mipseb", "mipsallegrex": return "mips" case "mipsel", "mipsallegrexel": return "mipsel" case "mips64", "mips64eb": return "mips64" case "mipsel64": return "mipsel64" case "r600", "hexagon", "sparc", "sparcv9", "tce", "xcore", "nvptx", "nvptx64", "le32", "amdil": return arch } if strings.HasPrefix(arch, "armv") { return "arm" } else if strings.HasPrefix(arch, "thumbv") { return "thumb" } return "unknown" }