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

国际物流网站制作模板简单免费制作手机网站

国际物流网站制作模板,简单免费制作手机网站,羊了个羊开发公司,网站设计的逻辑结构LLVM设计的核心是它的IR. 在把LLVMIR翻译特定汇编语言时,LLVM首先将程序变换为(DAG)有向无环图,以更易选指(SelectionDAG)容易,然后变换回三地址指令,来调度指令(MachineFunction). 为了看清驱动编译程序时,调用的后续工具,用-###命令行参数: $ clang -### hello.c -o hello…LLVM设计的核心是它的IR. 在把LLVMIR翻译特定汇编语言时,LLVM首先将程序变换为(DAG)有向无环图,以更易选指(SelectionDAG)容易,然后变换回三地址指令,来调度指令(MachineFunction). 为了看清驱动编译程序时,调用的后续工具,用-###命令行参数: $ clang -### hello.c -o hello部分工具: 1,opt:IR层次优化器.输入必须是LLVM位码(编码的LLVMIR)文件,输出文件也是该类型. 2,llc:通过具体后端把LLVM位码变换为目标机器汇编语言文件或目标文件.可通过参数选择优化级别,开启调试选项,开关目标指定优化. 3,llvm-mc:为多种(如ELF,MachO,PE)目标格式汇编指令生成目标文件.也可反汇编同样目标文件,输出等价的汇编信息和内部LLVM机器指令数据结构. 4,lli:为LLVMIR实现了解释器和JIT编译器. 5,llvm-link:连接若干LLVM位码,产生包含所有输入的单个LLVM位码. 6,llvm-as:把人类可读的LLVM汇编转换为LLVM位码. 7,llvm-dis:解码LLVM位码,生成LLVM汇编. 考虑简单的来自多个源文件多个函数组成的C程序.第一个源文件是main.c,代码如下: #include stdio.h int sum(int x, int y); int main() {int r sum(3, 4);printf(r %d\n, r);return 0; }第二个源文件是sum.c,代码如下: int sum(int x, int y) {return x y; }可用下面命令编译它: $ clang main.c sum.c -o sum然而,用独立工具也可实现相同结果.首先,用不同参数调用clang,让它为C源文件生成LLVM位码,然后不继续编译,就此停止: $ clang -emit-llvm -c main.c -o main.bc $ clang -emit-llvm -c sum.c -o sum.bc-emit-llvm参数,让clang根据输入参数是-c还是-S,生成LLVM位码或LLVM汇编文件. 示例中,-emit-llvm参数和-c,让clang生成LLVM位码格式的目标文件. 用-flto-c组合参数同样.如果想生成可读的LLVM汇编,用下面这对命令代替: $ clang -emit-llvm -S -c main.c -o main.ll $ clang -emit-llvm -S -c sum.c -o sum.ll注意,不用-emit-llvm或-flto参数时,-c参数用目标机器语言生成目标文件,而-S参数生成目标汇编语言文件.行为与GCC一样. 这里.bc和.ll分别是LLVM位码和汇编文件的扩展名. 为每个LLVM位码生成目标指定的目标文件,用系统链接器链接它们以生成可执行文件: $ llc -filetypeobj main.bc -o main.o $ llc -filetypeobj sum.bc -o sum.o $ clang main.o sum.o -o sum首先,链接这两个LLVM位码为一个最终的LLVM位码.然后,为该最终的位码生成目标指定目标文件,调用系统链接器生成可执行文件: $ llvm-link main.bc sum.bc -o sum.linked.bc $ llc -filetypeobj sum.linked.bc -o sum.linked.o $ clang sum.linked.o -o sum-filetypeobj参数指定输出目标文件,而不是输出汇编文件. 流程:CBCllc为.obj文件,再系统链接 流程:CBCllvm-link为.单个BC文件,再llc,再系统链接调用(llc)后端前,链接IR文件,用opt工具链接时优化 llc工具也可生成汇编输出,利用llvm-mc进一步汇编. LLVM基础库 1,libLLVMCore:包含所有LLVMIR相关的逻辑:IR构造(数据布局,指令,基本块,函数)和IR验证.还提供了趟管理器. 2,libLLVMAnalysis:包含若干IR分析趟,如别名分析,依赖分析,常量合并,循环信息,内存依赖分析,指令简化等. 3,libLLVMCodeGen:实现目标无关生成代码和机器级(低层版本LLVMIR)的分析和转换. 4,libLLVMTarget:通过抽象通用目标,访问目标机器信息.libLLVMCodeGen实现了通用后端算法,目标相关逻辑留给后面的库,而高层抽象提供交流通道. 5,libLLVMX86CodeGen:包含x86目标相关的生成代码信息,转换和分析趟,由它们构成了x86后端.注意,每个机器目标都有自己不同的库,如分别实现了ARM和MIPS后端的LLVMARMCodeGen和LLVMMipsCodeGen. 6,libLLVMSupport:包含实用工具.如错误处理,整数和浮点数处理,命令行解析,调试,文件支持,串操作等,这些是该库实现算法示例,LLVM的各个组件都用它们. 7,libclangDriver:包含一套C类.编译器驱动用它们理解类似GCC的命令行参数,以编译任务,为外部工具组织参数,以完成编译.根据目标平台,可用不同编译策略. 8,libclangAnalysis:这是一系列Clang提供的包括构造CFG和调用图,可达代码,安全格式化串等的前端架构分析. libclang libclang:(对比C的LLVM代码)它实现一套C接口以暴露Clang的前端功能:诊断报告,遍历AST,补全代码,光标和源码间映射. C接口相当简单,用C设计接口是为了更稳定,让其它语言(如Python),可很容易地使用Clang的功能. 它仅覆盖内部LLVM组件所用的C接口的子集. C实践 在基类中实现通用生成代码算法,继承和多态方法抽象不同后端共同任务.这样,每个具体后端专注实现它的特性,编写少量必需函数以覆盖父类通用操作. 如libLLVMCodeGen包含常见算法,libLLVMTarget包含具体机器抽象接口.下面的代码片演示了MIPS目标机器描述类是如何按LLVMTargetMachine类的子类声明的.此代码是LLVMMipsCodeGen库的一部分: class MipsTargetMachine : public LLVMTargetMachine {MipsSubtarget Subtarget;const DataLayout DL; ...另一例,目标无关的(所有后端公共的)分配寄存器器要知道哪些寄存器是保留而不能用于分配的. 此信息依赖具体目标,不能通用的父类中确定.这可调用MachineRegisterInfo::getReservedRegs()函数来确定,每个目标必须覆盖它. 下面演示了SPARC目标如何覆盖: BitVector SparcRegisterInfo::getReservedRegs(...) const {BitVector Reserved(getNumRegs());Reserved.set(SP::G1);Reserved.set(SP::G2); ...此代码中,通过位向量,SPARC后端说明了哪些寄存器不能用于通用分配寄存器. 调试编译器细节 尽量使用libLLVMSupport实现的断言. 查看ARM后端趟代码,它修改常量池布局,重新赋值. ARM程序常用该策略加载大型常量,因为单个大型的池距离指令太远,以致指令无法访问它,来解决受限的PC相对寻址机制.如下: //lib/Target/ARM/ARMConstantIsland趟.cpp const DataLayout TD *MF-getTarget().getDataLayout(); for (unsigned i 0, e CPs.size(); i ! e; i) {unsigned Size TD.getTypeAllocSize(CPs[i].getType());assert(Size 4 Too small constant pool entry);unsigned Align CPs[i].getAlignment();assert(isPowerOf2_32(Align) Invalid alignment);//验证所有常量池项是否都是对齐的倍数.如果不是,则要填充,以便指令保持一致.assert((Size % Align) 0 CP Entry not multiple of 4 bytes!);此代码遍历ARM常量池,期望它的每个字段遵守约束.注意如何用assert来控制数据语义. 插件式趟接口 趟是转换分析或优化.通过LLVMAPI可在编译生命期的不同阶段轻松注册任意趟. 趟管理器用来注册趟,调度趟,声明趟之间的依赖关系.因此,不同编译阶段都可取得PassManager类的实例. 如,目标可自由地在如分配寄存器前后,或输出汇编前等生成代码的若干位置,应用定制优化.如: //lib/Target/X86/X86TargetMachine.cpp bool X86PassConfig::addPreEmitPass() {...if (getOptLevel() ! CodeGenOpt::None getX86Subtarget().hasSSE2()) {addPass(createExecutionDependencyFixPass(X86::VR128RegClass));...}if (getOptLevel() ! CodeGenOpt::None getX86Subtarget().padShortFunctions()) {addPass(createX86PadShortFunctions());...}...注意后端如何根据具体目标信息,决定是否添加某个趟.添加第一个趟前,X86目标检查是否支持SSE2多媒体扩展. 对第二个趟,检查是否要求特殊填充. 编写第一个LLVM项目 创建一个程序,它读入位码文件,打印程序定义的函数名,函数基本块数量. 编写Makefile //注意制表符. LLVM_CONFIG llvm-config ifndef VERBOSE QUIET: endif SRC_DIR $(PWD) LDFLAGS$(shell $(LLVM_CONFIG) --ldflags) COMMON_FLAGS-Wall -Wextra CXXFLAGS$(COMMON_FLAGS) $(shell $(LLVM_CONFIG) --cxxflags) CPPFLAGS$(shell $(LLVM_CONFIG) --cppflags) -I$(SRC_DIR)第一部分定义了若干编译选项的Makefile变量.第一个变量决定llvm-config程序位置. llvm-config用来打印构建要链接LLVM库外部项目的有用信息. 如,定义C编译器的一系列选项时,注意请求Make来运行llvm-config-cxxflagsshell命令,让它打印编译LLVM项目的一系列选项. 这样,编译项目源码和LLVM源码兼容.最后把变量定义的一系列选项传递给编译器预处理器. HELLOhelloworld HELLO_OBJECTShello.o default: $(HELLO) %.o : $(SRC_DIR)/%.cppecho Compiling $*.cpp$(QUIET)$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $ $(HELLO) : $(HELLO_OBJECTS)echo Linking $$(QUIET)$(CXX) -o $ $(CXXFLAGS) $(LDFLAGS) $^ $(LLVM_CONFIG) --libs bitreader core support这里: llvm-config –libs bitreader core support-libs选项要求llvm-config提供链接器选项清单,来链接期望的LLVM库.这里,要求链接libLLVMBitReader,libLLVMCore,libLLVMSupport. 代码 完整给出趟代码.因为创建在LLVM趟基础设施上,代码相对较短. #include llvm/Bitcode/ReaderWriter.h #include llvm/IR/Function.h #include llvm/IR/Module.h #include llvm/Support/CommandLine.h #include llvm/Support/MemoryBuffer.h #include llvm/Support/raw_os_ostream.h #include llvm/Support/system_error.h #include iostream using namespace llvm; static cl::optstd::string FileName(cl::Positional, cl::desc(位码 file), cl::Required); int main(int argc, char** argv) {cl::ParseCommandLineOptions(argc, argv, LLVM hello world\n);LLVMContext context;std::string error;OwningPtrMemoryBuffer mb;MemoryBuffer::getFile(FileName, mb);Module *m ParseBitcodeFile(mb.get(), context, error);if (m0) {std::cerr 读位码错误: error std::end;return -1;}raw_os_ostream O(std::cout);for (Module::const_iterator i m-getFunctionList().begin(),e m-getFunctionList().end(); i ! e; i) {if (!i-isDeclaration()) {O i-getName() has i-size() basic block(s).\n;}}return 0; }程序利用cl(cl代表命令行)名字空间的llvm工具来实现命令行接口.调用ParseCommandLineOptions函数,并声明一个cl::optstd::string类型的全局变量,以此说明程序接收带位码文件名类型的单个串参数. 然后,实例化一个保存LLVM编译的从属数据的LLVMContext对象,来让LLVM线安.MemoryBuffer类对内存块定义了个只读接口. ParseBitcodeFile函数用它读取输入文件内容,并解析文件中的LLVMIR.错误检查完成后,遍历文件中模块的所有函数. LLVM模块类似翻译单元,它包含编码一切内容的位码文件,作为LLVM的顶端实体,下面是若干函数,然后基本块,最后是指令. 如果函数只是个声明,则忽略它.找到函数定义时,打印名字,及基本块数. 编译后,用-help参数运行,看一看已为你的程序准备好的LLVM命令行功能.然后,找个想变换为LLVMIR的C或C文件,变换,并再用程序分析. $ clang -c -emit-llvm mysource.c -o mysource.bc $ helloworld mysource.bc
http://www.hyszgw.com/news/93700.html

相关文章:

  • 不同类型网站比较及网站域名设计大连做网站qq群
  • 网站更换运营商要重新备案网站出现搜索
  • 在东莞找工作上哪个网站装企工长网站开发
  • 企业网站系统排名免费引流推广怎么做
  • 会网站开发学UI商务信息网
  • 网站外包项目天堂软件
  • 公司网站开发制作矢量插画的网站
  • 风铃网站代做做现货需要关注的网站
  • 怎样写营销策划方案南阳网站优化渠道
  • 奉贤深圳网站建设公司企业网站的建立网络虚拟社区时对于企业
  • 高端的电影网站阿里巴巴网站建设规划
  • 如何建设黔货出山电子商务网站小学学校网站建设培训资料
  • linux 配置网站域名网站建设有关表格
  • 旅游分销网站建设方案郑州网站开发公司哪家好
  • 外贸网站 wordpress个人网站建设方案策划书
  • 百度网盘可以做网站吗?学习建网站玩网站建设学习
  • 企业管理小程序淘宝seo优化是什么
  • 兰州发布紧急通知seo指导
  • 联邦快递网站建设的目标网站开发培训 从0
  • 昆明网站建设推广公司哪家好网站建设分哪几个版块
  • 深圳响应式网站找哪里哪里免费做网站
  • 医院网站建设方案计划书中国空间站叫什么
  • 青岛做网站推广公司荣成建设局网站
  • 沈阳网站关键词优化服务好同步显示一个wordpress
  • 娄底优秀网站建设管理咨询公司如何开发客户
  • 建设银行租房网站网站策划ps
  • 培训网站 建做网站还是移动开发
  • 优惠网站代理怎么做怎么做好销售
  • 月光博客 网站模板做方案的网站
  • 百度多久收录网站聚美优品网的网站建设情况