|
|
@ -460,18 +460,12 @@ fn match_candidate<'target>(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
RelocationKind::EnumVariantExists | RelocationKind::EnumVariantValue => {
|
|
|
|
RelocationKind::EnumVariantExists | RelocationKind::EnumVariantValue => {
|
|
|
|
let target_id = candidate.btf.resolve_type(candidate.type_id)?;
|
|
|
|
let target_id = candidate.btf.resolve_type(candidate.type_id)?;
|
|
|
|
let target_ty = candidate.btf.type_by_id(target_id)?;
|
|
|
|
|
|
|
|
// the first accessor is guaranteed to have a name by construction
|
|
|
|
let match_enum = |iterator: &mut dyn Iterator<Item = u32>| {
|
|
|
|
let local_variant_name = local_spec.accessors[0].name.as_ref().unwrap();
|
|
|
|
// the first accessor is guaranteed to have a name by construction
|
|
|
|
|
|
|
|
let local_variant_name = local_spec.accessors[0].name.as_ref().unwrap();
|
|
|
|
fn match_enum<'a>(
|
|
|
|
|
|
|
|
iterator: impl Iterator<Item = (usize, u32)>,
|
|
|
|
for (index, name_offset) in iterator.enumerate() {
|
|
|
|
candidate: &Candidate<'_>,
|
|
|
|
|
|
|
|
local_variant_name: &str,
|
|
|
|
|
|
|
|
target_id: u32,
|
|
|
|
|
|
|
|
mut target_spec: AccessSpec<'a>,
|
|
|
|
|
|
|
|
) -> Result<Option<AccessSpec<'a>>, RelocationError> {
|
|
|
|
|
|
|
|
for (index, name_offset) in iterator {
|
|
|
|
|
|
|
|
let target_variant_name = candidate.btf.string_at(name_offset)?;
|
|
|
|
let target_variant_name = candidate.btf.string_at(name_offset)?;
|
|
|
|
if flavorless_name(local_variant_name) == flavorless_name(&target_variant_name)
|
|
|
|
if flavorless_name(local_variant_name) == flavorless_name(&target_variant_name)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -485,29 +479,15 @@ fn match_candidate<'target>(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Ok(None)
|
|
|
|
Ok(None)
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
match target_ty {
|
|
|
|
match candidate.btf.type_by_id(target_id)? {
|
|
|
|
BtfType::Enum(en) => match_enum(
|
|
|
|
BtfType::Enum(en) => {
|
|
|
|
en.variants
|
|
|
|
match_enum(&mut en.variants.iter().map(|member| member.name_offset))
|
|
|
|
.iter()
|
|
|
|
}
|
|
|
|
.map(|member| member.name_offset)
|
|
|
|
BtfType::Enum64(en) => {
|
|
|
|
.enumerate(),
|
|
|
|
match_enum(&mut en.variants.iter().map(|member| member.name_offset))
|
|
|
|
candidate,
|
|
|
|
}
|
|
|
|
local_variant_name,
|
|
|
|
|
|
|
|
target_id,
|
|
|
|
|
|
|
|
target_spec,
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
BtfType::Enum64(en) => match_enum(
|
|
|
|
|
|
|
|
en.variants
|
|
|
|
|
|
|
|
.iter()
|
|
|
|
|
|
|
|
.map(|member| member.name_offset)
|
|
|
|
|
|
|
|
.enumerate(),
|
|
|
|
|
|
|
|
candidate,
|
|
|
|
|
|
|
|
local_variant_name,
|
|
|
|
|
|
|
|
target_id,
|
|
|
|
|
|
|
|
target_spec,
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
_ => Ok(None),
|
|
|
|
_ => Ok(None),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|