added rudimentary flang support as gfortran

This commit is contained in:
Alex Bernat 2021-05-25 00:10:27 +00:00
parent 796fa51feb
commit 50c32bbd09
9 changed files with 93 additions and 8 deletions

View File

@ -34,7 +34,7 @@
package main package main
import ( import (
"github.com/SRI-CSL/gllvm/shared" "github.com/alexbernat/gllvm/shared"
"os" "os"
) )

View File

@ -34,7 +34,7 @@
package main package main
import ( import (
"github.com/SRI-CSL/gllvm/shared" "github.com/alexbernat/gllvm/shared"
"os" "os"
) )

View File

@ -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
View 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)
}

View File

@ -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
View File

@ -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

View File

@ -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 ""

View File

@ -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)

View File

@ -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 {