mirror of
https://github.com/danog/gllvm.git
synced 2024-11-26 23:34:51 +01:00
added rudimentary flang support as gfortran
This commit is contained in:
parent
796fa51feb
commit
50c32bbd09
@ -34,7 +34,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/SRI-CSL/gllvm/shared"
|
"github.com/alexbernat/gllvm/shared"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/SRI-CSL/gllvm/shared"
|
"github.com/alexbernat/gllvm/shared"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/SRI-CSL/gllvm/shared"
|
"github.com/alexbernat/gllvm/shared"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
54
cmd/gfortran/main.go
Normal file
54
cmd/gfortran/main.go
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
//
|
||||||
|
// OCCAM
|
||||||
|
//
|
||||||
|
// Copyright (c) 2017, SRI International
|
||||||
|
//
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright notice, this
|
||||||
|
// list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other materials provided with the distribution.
|
||||||
|
//
|
||||||
|
// * Neither the name of SRI International nor the names of its contributors may
|
||||||
|
// be used to endorse or promote products derived from this software without
|
||||||
|
// specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/alexbernat/gllvm/shared"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
shared.LogInfo("Entering fortran %v\n", os.Args[1:])
|
||||||
|
// Parse command line
|
||||||
|
args := os.Args
|
||||||
|
args = args[1:]
|
||||||
|
|
||||||
|
exitCode := shared.Compile(args, "flang")
|
||||||
|
|
||||||
|
shared.LogDebug("Calling %v returned %v\n", os.Args, exitCode)
|
||||||
|
|
||||||
|
//important to pretend to look like the actual wrapped command
|
||||||
|
os.Exit(exitCode)
|
||||||
|
|
||||||
|
}
|
@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "github.com/SRI-CSL/gllvm/shared"
|
import "github.com/alexbernat/gllvm/shared"
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
|
4
go.mod
4
go.mod
@ -1,3 +1,5 @@
|
|||||||
module github.com/SRI-CSL/gllvm
|
module github.com/alexbernat/gllvm
|
||||||
|
|
||||||
go 1.16
|
go 1.16
|
||||||
|
|
||||||
|
require github.com/SRI-CSL/gllvm v1.3.0
|
||||||
|
@ -385,6 +385,11 @@ func GetCompilerExecName(compiler string) string {
|
|||||||
return filepath.Join(LLVMToolChainBinDir, LLVMCXXName)
|
return filepath.Join(LLVMToolChainBinDir, LLVMCXXName)
|
||||||
}
|
}
|
||||||
return filepath.Join(LLVMToolChainBinDir, compiler)
|
return filepath.Join(LLVMToolChainBinDir, compiler)
|
||||||
|
case "flang":
|
||||||
|
if LLVMFName != "" {
|
||||||
|
return filepath.Join(LLVMToolChainBinDir, LLVMCCName)
|
||||||
|
}
|
||||||
|
return filepath.Join(LLVMToolChainBinDir, compiler)
|
||||||
default:
|
default:
|
||||||
LogError("The compiler %s is not supported by this tool.", compiler)
|
LogError("The compiler %s is not supported by this tool.", compiler)
|
||||||
return ""
|
return ""
|
||||||
|
@ -59,6 +59,9 @@ var LLVMCCName string
|
|||||||
//LLVMCXXName is the user configured name of the clang++ compiler.
|
//LLVMCXXName is the user configured name of the clang++ compiler.
|
||||||
var LLVMCXXName string
|
var LLVMCXXName string
|
||||||
|
|
||||||
|
//LLVMFName is the user configered name of the flang compiler.
|
||||||
|
var LLVMFName string
|
||||||
|
|
||||||
//LLVMARName is the user configured name of the llvm-ar.
|
//LLVMARName is the user configured name of the llvm-ar.
|
||||||
var LLVMARName string
|
var LLVMARName string
|
||||||
|
|
||||||
@ -93,6 +96,7 @@ const (
|
|||||||
envpath = "LLVM_COMPILER_PATH"
|
envpath = "LLVM_COMPILER_PATH"
|
||||||
envcc = "LLVM_CC_NAME"
|
envcc = "LLVM_CC_NAME"
|
||||||
envcxx = "LLVM_CXX_NAME"
|
envcxx = "LLVM_CXX_NAME"
|
||||||
|
envf = "LLVM_F_NAME"
|
||||||
envar = "LLVM_AR_NAME"
|
envar = "LLVM_AR_NAME"
|
||||||
envlnk = "LLVM_LINK_NAME"
|
envlnk = "LLVM_LINK_NAME"
|
||||||
envcfg = "WLLVM_CONFIGURE_ONLY"
|
envcfg = "WLLVM_CONFIGURE_ONLY"
|
||||||
@ -116,7 +120,7 @@ func init() {
|
|||||||
|
|
||||||
// PrintEnvironment is used for printing the aspects of the environment that concern us
|
// PrintEnvironment is used for printing the aspects of the environment that concern us
|
||||||
func PrintEnvironment() {
|
func PrintEnvironment() {
|
||||||
vars := []string{envpath, envcc, envcxx, envar, envlnk, envcfg, envbc, envlvl, envfile, envobjcopy, envld, envbcgen, envltolink}
|
vars := []string{envpath, envcc, envcxx, envf, envar, envlnk, envcfg, envbc, envlvl, envfile, envobjcopy, envld, envbcgen, envltolink}
|
||||||
|
|
||||||
informUser("\nLiving in this environment:\n\n")
|
informUser("\nLiving in this environment:\n\n")
|
||||||
for _, v := range vars {
|
for _, v := range vars {
|
||||||
@ -135,6 +139,7 @@ func ResetEnvironment() {
|
|||||||
LLVMToolChainBinDir = ""
|
LLVMToolChainBinDir = ""
|
||||||
LLVMCCName = ""
|
LLVMCCName = ""
|
||||||
LLVMCXXName = ""
|
LLVMCXXName = ""
|
||||||
|
LLVMFName = ""
|
||||||
LLVMARName = ""
|
LLVMARName = ""
|
||||||
LLVMLINKName = ""
|
LLVMLINKName = ""
|
||||||
LLVMConfigureOnly = ""
|
LLVMConfigureOnly = ""
|
||||||
@ -152,6 +157,7 @@ func FetchEnvironment() {
|
|||||||
LLVMToolChainBinDir = os.Getenv(envpath)
|
LLVMToolChainBinDir = os.Getenv(envpath)
|
||||||
LLVMCCName = os.Getenv(envcc)
|
LLVMCCName = os.Getenv(envcc)
|
||||||
LLVMCXXName = os.Getenv(envcxx)
|
LLVMCXXName = os.Getenv(envcxx)
|
||||||
|
LLVMFName = os.Getenv(envf)
|
||||||
LLVMARName = os.Getenv(envar)
|
LLVMARName = os.Getenv(envar)
|
||||||
LLVMLINKName = os.Getenv(envlnk)
|
LLVMLINKName = os.Getenv(envlnk)
|
||||||
|
|
||||||
|
@ -59,6 +59,14 @@ then you will need to set the environment variable LLVM_CXX_NAME to
|
|||||||
the appropriate string. For example if your clang++ is called ++clang
|
the appropriate string. For example if your clang++ is called ++clang
|
||||||
then LLVM_CC_NAME should be set to ++clang.
|
then LLVM_CC_NAME should be set to ++clang.
|
||||||
|
|
||||||
|
`
|
||||||
|
const explainLLVMFNAME = `
|
||||||
|
|
||||||
|
If your flang compiler is not called flang, but something else,
|
||||||
|
then you will need to set the environment variable LLVM_F_NAME to
|
||||||
|
the appropriate string. For example if your flang is called flang-7
|
||||||
|
then LLVM_F_NAME should be set to flang-7.
|
||||||
|
|
||||||
`
|
`
|
||||||
|
|
||||||
const explainLLVMCOMPILERPATH = `
|
const explainLLVMCOMPILERPATH = `
|
||||||
@ -170,16 +178,26 @@ func checkCompilers() bool {
|
|||||||
|
|
||||||
cxx := GetCompilerExecName("clang++")
|
cxx := GetCompilerExecName("clang++")
|
||||||
cxxOK, cxxVersion, _ := checkExecutable(cxx, "-v")
|
cxxOK, cxxVersion, _ := checkExecutable(cxx, "-v")
|
||||||
if !ccOK {
|
if !cxxOK {
|
||||||
informUser("The CXX compiler %s was not found or not executable.\nBetter not try using gclang++!\n", cxx)
|
informUser("The CXX compiler %s was not found or not executable.\nBetter not try using gclang++!\n", cxx)
|
||||||
informUser(explainLLVMCOMPILERPATH)
|
informUser(explainLLVMCOMPILERPATH)
|
||||||
informUser(explainLLVMCXXNAME)
|
informUser(explainLLVMCXXNAME)
|
||||||
} else {
|
} else {
|
||||||
informUser("The CXX compiler %s is:\n\n\t%s\n\n", cxx, extractLine(cxxVersion, 0))
|
informUser("The CXX compiler %s is:\n\n\t%s\n\n", cxx, extractLine(cxxVersion, 0))
|
||||||
}
|
}
|
||||||
|
f := GetCompilerExecName("flang")
|
||||||
|
fOK, fVersion, _ := checkExecutable(f, "-v")
|
||||||
|
if !fOK {
|
||||||
|
informUser("The Fortran compiler %s was not found or not executable.\nBetter not try using gfortran!\n", cxx)
|
||||||
|
informUser(explainLLVMCOMPILERPATH)
|
||||||
|
informUser(explainLLVMFNAME)
|
||||||
|
} else {
|
||||||
|
informUser("The Fortran compiler %s is:\n\n\t%s\n\n", f, extractLine(fVersion, 0))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//FIXME: why "or" rather than "and"? BECAUSE: if you only need CC, not having CXX is not an error.
|
//FIXME: why "or" rather than "and"? BECAUSE: if you only need CC, not having CXX is not an error.
|
||||||
return ccOK || cxxOK
|
return ccOK || cxxOK || fOK
|
||||||
}
|
}
|
||||||
|
|
||||||
func extractLine(version string, n int) string {
|
func extractLine(version string, n int) string {
|
||||||
|
Loading…
Reference in New Issue
Block a user