当前位置: 首页 > wzjs >正文

客户网站建设洽谈方案福建省建设资格管理中心网站

客户网站建设洽谈方案,福建省建设资格管理中心网站,怎么建网站站点,青海网站建设加q5299丶14602做词想好好熟悉一下llvm开发一个新后端都要干什么,于是参考了老师的系列文章: LLVM 后端实践笔记 代码在这里(还没来得及准备,先用网盘暂存一下): 链接: https://pan.baidu.com/s/1V_tZkt9uvxo5bnUufhMQ_Q?…

 想好好熟悉一下llvm开发一个新后端都要干什么,于是参考了老师的系列文章:

LLVM 后端实践笔记

代码在这里(还没来得及准备,先用网盘暂存一下):

链接: https://pan.baidu.com/s/1V_tZkt9uvxo5bnUufhMQ_Q?pwd=ggu5 提取码: ggu5 

之前的章节只介绍了汇编代码生成的内容,这一章,我们将介绍对 ELF 目标格式文件的支持以及如何使用 objdump 工具来验证生成的目标文件。这一章的功能上的较复杂的代码其实不是很多,主要是框架上的东西。(因此这一章节参考原作者的内容较多)

当 llc 指定 -filetype=obj 时,编译器会生成目标文件(而不是汇编文件),此时,AsmPrinter::OutStreamer 所引用的是 MCObjectStreamer(汇编时引用的是 MCAsmStreamer)。LLVM 官方认为这个结构是后端代码生成阶段非常好的一个设计。

关键的一个接口是Cpu0AsmPrinter::EmitInstruction(),这个接口调用 MCObjectStreamer::EmitInstruction() ,进而根据选择生成的目标文件格式(ELF,COFF等)调用对应的编码发射函数,如 ELF 使用 MCELFStreamer()::EmitInstToData()。此时会进入到 Cpu0MCCodeEmitter.cpp 文件的实现中,调用 Cpu0MCCodeEmitter::encodeInstruction(),配合 TableGen 生成的 Cpu0MCCodeEmitter::getBinaryCodeForInstr()等接口完成最后的发射。

获取待发射指令编码的调用过程为:

Cpu0MCCodeEmitter::encodeInstruction()中,调用TableGen生成的 Cpu0GenMCCodeEmitter.inc 中的 getBinaryCodeForInstr(),传入 MI.Opcode; getBinaryCodeForInstr() 将 MI.Operand 传入 Cpu0MCCodeEmitter::getMachineOpValue() 来获取操作数的编码,这还需要再配合 Cpu0GenRegisterInfo.inc 和 Cpu0GenInstrInfo.inc 中的编码信息;getBinaryCodeForInstr() 将操作数的编码和指令操作码统一返回给 encodeInstruction();

比如一个加法操作,%0 = add %1, %2 生成为 adds $v0, $at, $v1,除了 adds 指令的编码需要在 Cpu0GenInstrInfo.inc 中查看外,还需要通过getEncodingValue(Reg) 到 Cpu0GenRegisterInfo.inc 中查看寄存器的编码,寄存器的编码和编码位置都在 Cpu0RegisterInfo.td 文件中描述了。

目录

1. 新增的文件

1.1 MCTargetDesc/Cpu0AsmBackend.cpp/.h

1.2 MCTargetDesc/Cpu0ELFObjectWriter.cpp

1.3 MCTargetDesc/Cpu0ELFStreamer.cpp/.h

1.4 MCTargetDesc/Cpu0FixupKinds.h

1.5 MCTargetDesc/Cpu0MCCodeEmitter.cpp/.h

1.6 MCTargetDesc/Cpu0MCExpr.cpp/.h

1.7 MCTargetDesc/Cpu0TargetStreamer.cpp/.h

2. 修改的文件

2.1 MCTargetDesc/Cpu0MCTargetDesc.cpp/.h


1. 新增的文件

1.1 MCTargetDesc/Cpu0AsmBackend.cpp/.h

比较重要的一个文件,实现了 Cpu0AsmBackend 类,继承自 MCAsmBackend 类。这个类作为汇编器后端实现类,目前对 Fixup 信息的操作提供了接口,比如 applyFixup() 用来使能 Fixup 状态,getFixupKindInfo() 用来获取 Fixup 类型信息,getNumFixupKinds() 用来获取 Fixup 类型的数量,mayNeedRelaxation() 返回需要 relaxation 的指令的状态(目前是空),fixupNeedsRelaxation() 返回给定 fixup 下的指令是否需要 relaxation 的状态(目前是空)。

已经定义了一些常用的 fixup 类型,比如 32 位类型:fixup_Cpu0_32, fixup_Cpu0_HI16, fixup_Cpu0_LO16,还有 GOT 的一些 fixup 类型。这些函数都是对基类函数的覆写,有关于重定向的功能都将在之后的章节讲解,所以目前会留空。我们还在其中实现了两个工厂函数,createCpu0AsmBackendEL32() 和 createCpu0AsmBackendEB32(),用来返回一个 AsmBackend 的实例。

1.2 MCTargetDesc/Cpu0ELFObjectWriter.cpp

定义了一个叫 Cpu0ELFObjectWriter 的类,继承自 MCELFObjectTargetWriter 类。这个类将用来完成最终的 ELF 文件格式的写入任务。其中提供了 getRelocType() 方法用来获取重定位类型,needsRelocateWithSymbol() 判断某种重定位类型是否是符号重定位,默认大多数都是符号重定位。

1.3 MCTargetDesc/Cpu0ELFStreamer.cpp/.h

定义了一个叫 Cpu0ELFStreamer 的类,继承自 MCELFStreamer 类。另外定义了这个类的工厂函数 createCpu0ELFStreamer(),用来返回其对象。ELFStreamer 对象会注册到后端模块中。TargetStreamer 和 ELFStreamer 在生成 ELF 文件中同时起作用,ELFStreamer 是我们自定义的一个类,在其中可以做一些改动来调整输出内容。目前这些文件中都还是比较空的状态,我们先搭建整个框架。

1.4 MCTargetDesc/Cpu0FixupKinds.h

这个头文件中定义了 llvm::Cpu0::Fixups 的枚举值,这里的定义顺序必须与Cpu0AsmBackend.cpp 中的 MCFixupKindInfo 保持一致。

1.5 MCTargetDesc/Cpu0MCCodeEmitter.cpp/.h

另一个比较重要的类,用来为Streamer类提供直接发射编码的实现接口。定义了比如 encodeInstruction() 等重要接口。我们在 encodeInstruction() 中检查一些未完成编码设计的指令,这还需要考虑一些特殊情况,比如要排除编码为 0 的情况,排除伪指令(伪代码不应该出现在这这个阶段了)。getBinaryCodeForInstr() 函数是 TableGen 自动生成的,可以通过传入给定的 MI 指令,获取该指令的编码。

1.6 MCTargetDesc/Cpu0MCExpr.cpp/.h

针对操作数是表达式的情况,我们需要额外做处理。其中定义了Cpu0MCExpr类,继承自 MCTargetExpr类。其中声明了表达式类型 Cpu0ExprKind,还提供了 create(), getKind() 等接口。

1.7 MCTargetDesc/Cpu0TargetStreamer.cpp/.h

定义了一个叫 Cpu0TargetStreamer 的类,继承自 MCTargetStreamer 类。定义了一个叫 Cpu0TargetAsmStreamer 的类,继承自 Cpu0TargetStreamer 类,这个类用来完成汇编器 Streamer 的功能。AsmStreamer 对象会注册到后端模块中。

2. 修改的文件

2.1 MCTargetDesc/Cpu0MCTargetDesc.cpp/.h

我们知道这个文件中会完成注册一些后端模块的功能。首先定义了两个函数,createMCStreamer() 调用 createCpu0ELFStreamer() 用来建立 ELFStreamer 对象,createCpu0AsmTargetStreamer() 直接建立 Cpu0TargetAsmStreamer 对象。

然后就是调用TargetRegistry::RegisterELFStreamer()和 TargetRegistry::RegisterAsmTargetStreamer()来注册这两个对象模块。另外,还调用 TargetRegistry::RegisterMCCodeEmitter() 来注册大小端的 MCCodeEmitter 对象,以及调用 TargetRegistry::RegisterMCAsmBackend() 来注册大小端的 MCAsmBackend 对象。


文章转载自:

http://caV43SYa.qkzdc.cn
http://7Gbxy931.qkzdc.cn
http://Gnx1AsyG.qkzdc.cn
http://VEUxNNHd.qkzdc.cn
http://1UFRDUPP.qkzdc.cn
http://00idWfL3.qkzdc.cn
http://JKGUN7tA.qkzdc.cn
http://RD8y7Z2W.qkzdc.cn
http://3YmZy2h2.qkzdc.cn
http://asOyAm9u.qkzdc.cn
http://sM9dsdxZ.qkzdc.cn
http://KkSSehSQ.qkzdc.cn
http://iijxThc6.qkzdc.cn
http://XV2ksrkK.qkzdc.cn
http://Yl1MBigm.qkzdc.cn
http://3bqWnGX0.qkzdc.cn
http://HSgTswoz.qkzdc.cn
http://WR63BVWS.qkzdc.cn
http://uJi71CFG.qkzdc.cn
http://dWPKprLv.qkzdc.cn
http://E5mKW7pT.qkzdc.cn
http://fMJTp91C.qkzdc.cn
http://smTtYUpf.qkzdc.cn
http://k3MU20OE.qkzdc.cn
http://QUbMo4yK.qkzdc.cn
http://1EDDLO32.qkzdc.cn
http://hKjRktSp.qkzdc.cn
http://JQr28TmC.qkzdc.cn
http://D5MzcJVI.qkzdc.cn
http://Kmo2ZrrN.qkzdc.cn
http://www.dtcms.com/wzjs/648502.html

相关文章:

  • 网站 相对路径云服务器建立多个网站
  • 网站怎么做才被收录快成都住建局官网从哪里查房屋备案没有
  • it公论 是建立在什么网站网站开发示例
  • 如何在百度上建网站安徽网站建设网站运营
  • 企业网站建设飞沐局网站建设合同
  • 站长工具seo综合查询pc网站制作的评价指标
  • 建站管理域名管理绑定外部域名中html5博客网站模板
  • 肇庆网站优化建设工业互联网平台排名
  • 做动图素材网站如何建设一个普通网页网站
  • 免费建设一个网站廊坊网站建设外包
  • 查询数据的网站怎么做在建设部网站首页
  • 阿里云大学 网站建设男直接做的视频网站
  • 中国建设银行属于什么类型网站软件开发税率是13%还是6
  • 网站入股云建站石家庄网站制作设计
  • wordpress端口映射wordpress编辑优化
  • 建设厅科技中心网站首页买个网站域名多少钱
  • 网站建设工作计划免费的wordpress主题好
  • 创建自己的网站怎么弄优良的定制网站建设制作商
  • 国内简洁网站设计设计师共享平台
  • 网页制作好了如果让别人搜到揭阳百度快照优化排名
  • 不是网站开发语言的是境外电商有哪些平台
  • 网站怎么关闭网站开发保密协议范本下载
  • 免费网站建设入门登封网站建设
  • 跨境电商数据分析网站房地产建设网站的意义
  • 网站建设励志文章电子商务网站开发基础
  • 一流的网站建设与优化网站建设安全架构
  • 网站关键词seo排名天津建设厅 注册中心网站
  • 盘锦网站变建设怎么注册个人邮箱账号
  • 网站推广方法素材建设一个网站需要哪些费用
  • 金融投资风险公司网站源码手机网站栏目结构图