Cailin000 2021-05-17 14:07 采纳率: 0%
浏览 38

怎么使用python 调用 clang的接口生成llvm ir的bitcode文件?

怎么使用python 调用 clang的接口生成llvm ir的bitcode文件?以及怎么讲生成的bitcode文件中的行与源代码的行进行映射?

  • 写回答

1条回答 默认 最新

  • R1chArd_TvT 2023-04-14 10:15
    关注

    import subprocess

    clang_cmd = ['clang', '-S', '-emit-llvm', 'example.c', '-o', 'example.ll']
    subprocess.run(clang_cmd)

    llc_cmd = ['llc', 'example.ll', '-o', 'example.bc']
    subprocess.run(llc_cmd)

    dwarfdump_cmd = ['llvm-dwarfdump', '--debug-line', 'example.bc']
    dwarfdump_output = subprocess.check_output(dwarfdump_cmd, universal_newlines=True)
    
    # 解析 dwarfdump 的输出并创建一个行号映射字典
    line_mapping = {}
    for line in dwarfdump_output.splitlines():
        if 'Line table' in line:
            # 获取文件名和行号
            file_name, _, line_no_str = line.split()[-3:]
            line_no = int(line_no_str)
    
            # 添加到映射字典
            line_mapping[line_no] = file_name
    
    # 使用行号映射字典将 bitcode 文件中的行映射到源代码行
    with open('example.bc', 'rb') as f:
        bc_data = f.read()
    
    bc_lines = bc_data.decode('utf-8').splitlines()
    for i, bc_line in enumerate(bc_lines):
        # 获取行号
        line_no_str = bc_line.split(':')[0]
        line_no = int(line_no_str)
    
        # 查找映射文件名
        if line_no in line_mapping:
            file_name = line_mapping[line_no]
    
            # 输出源代码行号和 bitcode 行号的对应关系
            print(f'{file_name}:{line_no} -> example.bc:{i+1}')
    
    
    
    评论

报告相同问题?

悬赏问题

  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)