• LLVM学习笔记(59)


    4.4.1. 数据布局信息

    在X86TargetMachine构造函数的222行,computeDataLayout()给出X86目标机器的各种数据布局信息:

    117     static std::string computeDataLayout(const Triple &TT) {

    118       // X86 is little endian

    119       std::string Ret = "e";

    120    

    121       Ret += DataLayout::getManglingComponent(TT);

    122       // X86 and x32 have 32 bit pointers.

    123       if ((TT.isArch64Bit() &&

    124            (TT.getEnvironment() == Triple::GNUX32 || TT.isOSNaCl())) ||

    125           !TT.isArch64Bit())

    126         Ret += "-p:32:32";

    127    

    128       // Some ABIs align 64 bit integers and doubles to 64 bits, others to 32.

    129       if (TT.isArch64Bit() || TT.isOSWindows() || TT.isOSNaCl())

    130         Ret += "-i64:64";

    131       else if (TT.isOSIAMCU())

    132         Ret += "-i64:32-f64:32";

    133       else

    134         Ret += "-f64:32:64";

    135    

    136       // Some ABIs align long double to 128 bits, others to 32.

    137       if (TT.isOSNaCl() || TT.isOSIAMCU())

    138         ; // No f80

    139       else if (TT.isArch64Bit() || TT.isOSDarwin())

    140         Ret += "-f80:128";

    141       else

    142         Ret += "-f80:32";

    143    

    144       if (TT.isOSIAMCU())

    145         Ret += "-f128:32";

    146    

    147       // The registers can hold 8, 16, 32 or, in x86-64, 64 bits.

    148       if (TT.isArch64Bit())

    149         Ret += "-n8:16:32:64";

    150       else

    151         Ret += "-n8:16:32";

    152    

    153       // The stack is aligned to 32 bits on some ABIs and 128 bits on others.

    154       if (!TT.isArch64Bit() && TT.isOSWindows() || TT.isOSIAMCU())

    155         Ret += "-a:0:32-S32";

    156       else

    157         Ret += "-S128";

    158    

    159       return Ret;

    160     }

    computeDataLayout()根据Triple值确定目标机器的各种数据布局,这个函数返回一个对此进行描述的字符串。这个字符串接着交给TargetMachine构造函数,由其中的DataLayout类型的成员DL对该字符串进行解析。显然字符串的好处是容易调试。

    4.4.2. 目标文件格式

    在X86TargetMachine构造函数104行的TLOF是一个std::unique_ptr智能指针,createTLOF()根据编译器的triple值确定具体的目标文件格式。

    95       static std::unique_ptr createTLOF(const Triple &TT) {

    96         if (TT.isOSBinFormatMachO()) {

    97           if (TT.getArch() == Triple::x86_64)

    98             return make_unique();

    99           return make_unique();

    100       }

    101    

    102       if (TT.isOSFreeBSD())

    103         return llvm::make_unique();

    104       if (TT.isOSLinux() || TT.isOSNaCl() || TT.isOSIAMCU())

    105         return make_unique();

    106       if (TT.isOSSolaris())

    107         return llvm::make_unique();

    108       if (TT.isOSFuchsia())

    109         return llvm::make_unique();

    110       if (TT.isOSBinFormatELF())

    111         return make_unique();

    112       if (TT.isOSBinFormatCOFF())

    113         return make_unique();

    114       llvm_unreachable("unknown subtarget type");

    115     }

    以TargetLoweringObjectFile为基类,LLVM定义了上述所示的若干目标文件格式对象。

  • 相关阅读:
    flutter开发实战-TweenSequence实现动画序列
    Redis分布式锁这样用,有坑?
    基于ARIMA-BP组合模型的货运量预测研究
    灵活用工平台的优势在哪里?
    kubernetes kubelet 配置
    RISC-V反汇编调试记录分享
    HBR推荐 丨验证决策、回归产品——2022年企业需要适应这两大转变
    非root权限下run qemu-kvm
    Elasticsearch 创建索引mapping修改、修复
    两独立样本率的非劣效性试验-样本量计算
  • 原文地址:https://blog.csdn.net/wuhui_gdnt/article/details/134270002