1
Fork 0

Add -Z llvm_module_flag

Allow adding values to the `!llvm.module.flags` metadata for a generated
module.  The syntax is

`-Z llvm_module_flag=<name>:<type>:<value>:<behavior>`

Currently only u32 values are supported but the type is required to be
specified for forward compatibility.  The `behavior` element must match
one of the named LLVM metadata behaviors.viors.

This flag is expected to be perma-unstable.
This commit is contained in:
Paul Menage 2023-10-09 02:22:14 -07:00
parent 2c1b65ee14
commit 2e6b57541d
5 changed files with 68 additions and 0 deletions

View file

@ -429,6 +429,7 @@ mod desc {
pub const parse_remap_path_scope: &str = "comma separated list of scopes: `macro`, `diagnostics`, `unsplit-debuginfo`, `split-debuginfo`, `split-debuginfo-path`, `object`, `all`";
pub const parse_inlining_threshold: &str =
"either a boolean (`yes`, `no`, `on`, `off`, etc), or a non-negative number";
pub const parse_llvm_module_flag: &str = "<key>:<type>:<value>:<behavior>. Type must currently be `u32`. Behavior should be one of (`error`, `warning`, `require`, `override`, `append`, `appendunique`, `max`, `min`)";
}
mod parse {
@ -1331,6 +1332,33 @@ mod parse {
}
true
}
pub(crate) fn parse_llvm_module_flag(
slot: &mut Vec<(String, u32, String)>,
v: Option<&str>,
) -> bool {
let elements = v.unwrap_or_default().split(':').collect::<Vec<_>>();
let [key, md_type, value, behavior] = elements.as_slice() else {
return false;
};
if *md_type != "u32" {
// Currently we only support u32 metadata flags, but require the
// type for forward-compatibility.
return false;
}
let Ok(value) = value.parse::<u32>() else {
return false;
};
let behavior = behavior.to_lowercase();
let all_behaviors =
["error", "warning", "require", "override", "append", "appendunique", "max", "min"];
if !all_behaviors.contains(&behavior.as_str()) {
return false;
}
slot.push((key.to_string(), value, behavior));
true
}
}
options! {
@ -1631,6 +1659,8 @@ options! {
"link native libraries in the linker invocation (default: yes)"),
link_only: bool = (false, parse_bool, [TRACKED],
"link the `.rlink` file generated by `-Z no-link` (default: no)"),
llvm_module_flag: Vec<(String, u32, String)> = (Vec::new(), parse_llvm_module_flag, [TRACKED],
"a list of module flags to pass to LLVM (space separated)"),
llvm_plugins: Vec<String> = (Vec::new(), parse_list, [TRACKED],
"a list LLVM plugins to enable (space separated)"),
llvm_time_trace: bool = (false, parse_bool, [UNTRACKED],