diff options
author | Yiannis Tsiouris <[email protected]> | 2014-03-26 17:44:43 +0200 |
---|---|---|
committer | Yiannis Tsiouris <[email protected]> | 2014-03-30 23:21:06 +0300 |
commit | 87a01aa0c1a32f821e2f6305b70ee83faa0890f0 (patch) | |
tree | ea227db640048da1d9af412e459a3f39b671fa07 /lib/hipe | |
parent | 4503158956b9f7357551c349f3e1095acdfb80f8 (diff) | |
download | otp-87a01aa0c1a32f821e2f6305b70ee83faa0890f0.tar.gz otp-87a01aa0c1a32f821e2f6305b70ee83faa0890f0.tar.bz2 otp-87a01aa0c1a32f821e2f6305b70ee83faa0890f0.zip |
Check for required LLVM version or issue error
This checks that a required LLVM version (i.e. 3.4 or greater) appears in $PATH
when 'to_llvm' flag is used; in case of failure, abort compilation with an
error.
Diffstat (limited to 'lib/hipe')
-rw-r--r-- | lib/hipe/main/hipe.erl | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/lib/hipe/main/hipe.erl b/lib/hipe/main/hipe.erl index d47eced6d8..539ce883c0 100644 --- a/lib/hipe/main/hipe.erl +++ b/lib/hipe/main/hipe.erl @@ -200,6 +200,7 @@ compile_core/4, file/1, file/2, + llvm_support_available/0, load/1, help/0, help_hiper/0, @@ -648,7 +649,18 @@ run_compiler_1(DisasmFun, IcodeFun, Options) -> %% The full option expansion is not done %% until the DisasmFun returns. {Code, CompOpts} = DisasmFun(Options), - Opts = expand_options(Options ++ CompOpts), + Opts0 = expand_options(Options ++ CompOpts), + Opts = + case proplists:get_bool(to_llvm, Opts0) andalso + not llvm_support_available() of + true -> + ?error_msg("No LLVM version 3.4 or greater " + "found in $PATH; aborting " + "native code compilation.\n", []), + ?EXIT(cant_find_required_llvm_version); + false -> + Opts0 + end, check_options(Opts), ?when_option(verbose, Options, ?debug_msg("Options: ~p.\n",[Opts])), @@ -1537,4 +1549,22 @@ check_options(Opts) -> ok end. +-spec llvm_support_available() -> boolean(). + +llvm_support_available() -> + get_llvm_version() >= 3.4. + +get_llvm_version() -> + OptStr = os:cmd("opt -version"), + SubStr = "LLVM version ", N = length(SubStr), + case string:str(OptStr, SubStr) of + 0 -> % No opt available + 0.0; + S -> + case string:to_float(string:sub_string(OptStr, S + N)) of + {error, _} -> 0.0; %XXX: Assumes no revision numbers in versioning + {Float, _} -> Float + end + end. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |