You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译LLVM 15.0.4时遭遇invalid ‘static_cast’类型转换错误求助

解决LLVM 15.0.4编译时的invalid static_cast错误

错误信息

/home/pegasus/Documents/LLVM_Rust/CCR-master/llvm/lib/MC/MCAssembler.cpp: In member function ‘void llvm::MCAssembler::layout(llvm::MCAsmLayout&)’:
/home/pegasus/Documents/LLVM_Rust/CCR-master/llvm/lib/MC/MCAssembler.cpp:1221:28: error: invalid ‘static_cast’ from type ‘llvm::MCSection’ to type ‘llvm::MCSectionELF&’
 1221 |     MCSectionELF &ELFSec = static_cast<MCSectionELF &>(Sec);

问题原因

错误出现在直接用C++原生static_cast将基类MCSection强转为派生类MCSectionELF的引用。static_cast不会在运行时校验类型合法性,当Sec实际并非MCSectionELF类型时就会触发该错误。LLVM体系中MCSection是所有节类型的基类,MCSectionELF仅对应ELF格式的节,必须先确认类型再执行转换。

解决方案

使用LLVM提供的isa+cast(或dyn_cast)工具安全处理多态类型转换:

方法1:确定类型后用cast(适用于上下文已明确类型的场景)

如果已经通过MOFI->getObjectFileType() == llvm::MCObjectFileInfo::IsELF这类判断确认Sec是ELF节,直接用LLVM的cast替代static_cast:

// 放在ELF类型检查的代码块内执行
if (MOFI->getObjectFileType() == llvm::MCObjectFileInfo::IsELF) {
    MCSectionELF &ELFSec = llvm::cast<MCSectionELF&>(Sec);
    // 后续对ELFSec的操作逻辑
}

方法2:用dyn_cast动态校验(适用于不确定类型的场景)

若无法提前确定类型,用dyn_cast转换并检查结果有效性:

MCSectionELF *ELFSec = llvm::dyn_cast<MCSectionELF>(&Sec);
if (ELFSec) {
    // 对ELFSec指针的操作逻辑,比如 ELFSec->getFlags();
}

结合你的代码逻辑优化

你的代码中已经有ELF文件类型判断,可以把节类型转换放到该分支内,确保只有ELF节才执行转换:

// Update alignment size to reflect to the size of MF and MBB
if (MOFI->getObjectFileType() == llvm::MCObjectFileInfo::IsELF && 
    secName.find(".text") == 0 && (isa<MCAlignFragment>(&Frag)) && fragOffset > 0) {
    // 新增安全类型转换
    MCSectionELF &ELFSec = llvm::cast<MCSectionELF&>(Sec);
    // Push this alignment to the previous MBB and the MF that the MBB belongs to
    unsigned alignSize;
    std::string ID;
    if (isa<MCDataFragment>(*prevFrag))
        ID = static_cast<MCDataFragment*>(prevFrag)->getLastParentTag();
    if (isa<MCRelaxableFragment>(*prevFrag))
        ID = static_cast<MCRelaxableFragment*>(prevFrag)->getInst().getParent();
    
    alignSize = computeFragmentSize(Layout, Frag);
    MAI->updateByteCounter(ID, alignSize, 0, /*isAlign=*/ true, /*isInline=*/ false);
}

内容的提问来源于stack exchange,提问作者NobinPegasus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 07:25:32