forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			103 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
| //===- 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"
 | |
| )
 | |
| 
 | |
| // PNaClTriple is the LLVM target triple that should be used to compile
 | |
| // modules to be compatible with PNaCl (Portable Native Client).
 | |
| const PNaClTriple = "armv7-none-linux-gnueabi"
 | |
| 
 | |
| // Below are the target data representation constants generated by clang.
 | |
| // For unknown targets, we enumerate all targets known to LLVM and use
 | |
| // the first one with a matching architecture.
 | |
| const (
 | |
| 	x86TargetData = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
 | |
| )
 | |
| 
 | |
| // 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, '-')])
 | |
| 	switch arch {
 | |
| 	case "x86-64":
 | |
| 		return x86TargetData, nil
 | |
| 	}
 | |
| 	for target := llvm.FirstTarget(); target.C != nil; target = target.NextTarget() {
 | |
| 		if arch == target.Name() {
 | |
| 			machine := target.CreateTargetMachine(
 | |
| 				triple, "", "",
 | |
| 				llvm.CodeGenLevelDefault,
 | |
| 				llvm.RelocDefault,
 | |
| 				llvm.CodeModelDefault,
 | |
| 			)
 | |
| 			target := machine.TargetData().String()
 | |
| 			machine.Dispose()
 | |
| 			return target, 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"
 | |
| }
 |