aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorYiannis Tsiouris <[email protected]>2014-03-26 17:44:43 +0200
committerYiannis Tsiouris <[email protected]>2014-03-30 23:21:06 +0300
commit87a01aa0c1a32f821e2f6305b70ee83faa0890f0 (patch)
treeea227db640048da1d9af412e459a3f39b671fa07 /lib
parent4503158956b9f7357551c349f3e1095acdfb80f8 (diff)
downloadotp-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')
-rw-r--r--lib/hipe/main/hipe.erl32
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.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%