热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gcc参数_「博文精选」如何向riscvgcc中增加编译器内置宏

riscv-gcc工具,有内置的一些宏参数。我们可以根据这些内置的宏参数,判断编译器的行为。一、查看gcc内置宏参数这里以芯来科技发布的riscv-nu

riscv-gcc工具,有内置的一些宏参数。我们可以根据这些内置的宏参数,判断编译器的行为。

一、查看gcc内置宏参数

这里以芯来科技发布的riscv-nuclei-elf-gcc工具链为例。

使用以下命令,可以得到该工具的内置宏参数:

riscv-nuclei-elf-gcc -E -dM a.h | grep riscv

可以得到如下的一些宏参数

#define __riscv 1

#define __riscv_atomic 1

#define __riscv_cmodel_medlow 1

#define __riscv_fdiv 1

#define __riscv_float_abi_double 1

#define __riscv_flen 64

#define __riscv_compressed 1

#define __riscv_mul 1

#define __riscv_muldiv 1

#define __riscv_xlen 32

#define __riscv_fsqrt 1

#define __riscv_div 1

从内置宏参数,可以看出编译器,默认支持RV64IMAFDC指令集架构。

如果使用以下命令:

riscv-nuclei-elf-gcc -march=rv32gc -mabi=ilp32 -E -dM a.h | grep riscv

得到如下结果:

#define __riscv 1

#define __riscv_atomic 1

#define __riscv_cmodel_medlow 1

#define __riscv_float_abi_soft 1

#define __riscv_fdiv 1

#define __riscv_flen 64

#define __riscv_compressed 1

#define __riscv_mul 1

#define __riscv_muldiv 1

#define __riscv_xlen 32

#define __riscv_fsqrt 1

#define __riscv_div 1

从内置宏参数,可以看出编译器,支持RV32IMAFDC指令集架构。

二、增加内置宏参数

对于riscv,支持p扩展,该扩展,是针对于dsp应用。

如果我们想,当gcc的-march选项中,有指定p扩展指令集,那么编译器就内置__riscv_dsp宏。如果没有指定p扩展指令集,就不内置该__riscv_dsp宏。

这样的话,编写的dsp程序,就可以使用该宏判断,是否支持p扩展指令。

下面简述一下,如何实现该功能,也就是如何根据所传参指令集架构参数,增加内置宏参数。

这里,主要是参考riscv-gcc的如下commit:

https://github.com/riscv/riscv-gcc/commit/06ab742f982d23488ec2d8c0266cb720fe775f7c

该commit,是往riscv-gcc中增加RV32E的支持。

三、修改riscv.opt

首先是修改 gcc/config/riscv/riscv.opt文件,在其中,增加DSP宏。

b988160eb9de9a7e2a171f200cfa1d6b.png

gcc的脚本工具,会处理该文件,通过Mask展开,定义新的宏参数。

  • MASK_DSP

  • TARGET_DSP

在编译目录下的 gcc/options.h 文件中,有该宏参数定义。

TARGET和MASK宏的定义

#define MASK_DIV (1U <<0)

#define MASK_EXPLICIT_RELOCS (1U <<1)

#define MASK_FDIV (1U <<2)

#define MASK_SAVE_RESTORE (1U <<3)

#define MASK_STRICT_ALIGN (1U <<4)

#define MASK_64BIT (1U <<5)

#define MASK_ATOMIC (1U <<6)

#define MASK_DOUBLE_FLOAT (1U <<7)

#define MASK_DSP (1U <<8)

#define MASK_HARD_FLOAT (1U <<9)

#define MASK_MUL (1U <<10)

#define MASK_RVC (1U <<11)

#define MASK_RVE (1U <<12)

#define TARGET_DIV ((target_flags & MASK_DIV) !&#61; 0)

#define TARGET_DIV_P(target_flags) (((target_flags) & MASK_DIV) !&#61; 0)

#define TARGET_EXPLICIT_RELOCS ((target_flags & MASK_EXPLICIT_RELOCS) !&#61; 0)

#define TARGET_EXPLICIT_RELOCS_P(target_flags) (((target_flags) & MASK_EXPLICIT_RELOCS) !&#61; 0)

#define TARGET_FDIV ((target_flags & MASK_FDIV) !&#61; 0)

#define TARGET_FDIV_P(target_flags) (((target_flags) & MASK_FDIV) !&#61; 0)

#define TARGET_SAVE_RESTORE ((target_flags & MASK_SAVE_RESTORE) !&#61; 0)

#define TARGET_SAVE_RESTORE_P(target_flags) (((target_flags) & MASK_SAVE_RESTORE) !&#61; 0)

#define TARGET_STRICT_ALIGN ((target_flags & MASK_STRICT_ALIGN) !&#61; 0)

#define TARGET_STRICT_ALIGN_P(target_flags) (((target_flags) & MASK_STRICT_ALIGN) !&#61; 0)

#define TARGET_64BIT ((target_flags & MASK_64BIT) !&#61; 0)

#define TARGET_ATOMIC ((target_flags & MASK_ATOMIC) !&#61; 0)

#define TARGET_DOUBLE_FLOAT ((target_flags & MASK_DOUBLE_FLOAT) !&#61; 0)

#define TARGET_DSP ((target_flags & MASK_DSP) !&#61; 0)

#define TARGET_HARD_FLOAT ((target_flags & MASK_HARD_FLOAT) !&#61; 0)

#define TARGET_MUL ((target_flags & MASK_MUL) !&#61; 0)

#define TARGET_RVC ((target_flags & MASK_RVC) !&#61; 0)

#define TARGET_RVE ((target_flags & MASK_RVE) !&#61; 0)

这里的options.h文件&#xff0c;是gcc的内置脚本生成的&#xff0c;目前我还没有研究清楚该脚本是如何工作生成的。

四、修改riscv-common.c

得到上述的宏之后&#xff0c;需要修改gcc/common/config/riscv/riscv-common.c文件。

在riscv_parse_arch_string函数中&#xff0c;就会分析传入的--march参数&#xff0c;然后设置flags&#xff0c;给flags加上对应的TARGET支持。

模仿c扩展的支持&#xff0c;增加p扩展的支持。

static void

riscv_parse_arch_string (const char *isa, int *flags, location_t loc)

{

riscv_subset_list *subset_list;

subset_list &#61; riscv_subset_list::parse (isa, loc);

if (!subset_list)

return;

if (subset_list->xlen &#61;&#61; 32)

*flags &&#61; ~MASK_64BIT;

else if (subset_list->xlen &#61;&#61; 64)

*flags |&#61; MASK_64BIT;

*flags &&#61; ~MASK_RVE;

if (subset_list->lookup ("e"))

*flags |&#61; MASK_RVE;

*flags &&#61; ~MASK_MUL;

if (subset_list->lookup ("m"))

*flags |&#61; MASK_MUL;

*flags &&#61; ~MASK_ATOMIC;

if (subset_list->lookup ("a"))

*flags |&#61; MASK_ATOMIC;

*flags &&#61; ~(MASK_HARD_FLOAT | MASK_DOUBLE_FLOAT);

if (subset_list->lookup ("f"))

*flags |&#61; MASK_HARD_FLOAT;

if (subset_list->lookup ("d"))

*flags |&#61; MASK_DOUBLE_FLOAT;

*flags &&#61; ~MASK_RVC;

if (subset_list->lookup ("c"))

*flags |&#61; MASK_RVC;

*flags &&#61; ~MASK_DSP;

if (subset_list->lookup ("p"))

*flags |&#61; MASK_DSP;

if (current_subset_list)

delete current_subset_list;

current_subset_list &#61; subset_list;

}

通过调用subset_list的lookup函数&#xff0c;查看是否有传入对应的指令集架构。如果有的话&#xff0c;在flags中&#xff0c;将对应的MASK给设置上。

五、修改riscv-c.c

修改 gcc/config/riscv/riscv-c.c 文件。增加内置宏。

该文件中的riscv_cpu_cpp_builtins函数&#xff0c;就是增加内置宏参数的函数。

void

riscv_cpu_cpp_builtins (cpp_reader *pfile)

{

builtin_define ("__riscv");

if (TARGET_RVC)

builtin_define ("__riscv_compressed");

if (TARGET_RVE)

builtin_define ("__riscv_32e");

if (TARGET_ATOMIC)

builtin_define ("__riscv_atomic");

if (TARGET_MUL)

builtin_define ("__riscv_mul");

if (TARGET_DIV)

builtin_define ("__riscv_div");

if (TARGET_DIV && TARGET_MUL)

builtin_define ("__riscv_muldiv");

if (TARGET_DSP)

builtin_define ("__riscv_dsp");

builtin_define_with_int_value ("__riscv_xlen



推荐阅读
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 上次我们总结了React代码构建后的webpack模块组织关系,今天来介绍一下Babel编译JSX生成目标代码的一些规则,并且写一个简单的解析器,模拟整个生成的过程。我们还是拿最简 ... [详细]
  • 编译原理c语言词法分析器,用C语言实现一个真正的词法分析器
    词法分析,是编译器的第一个模块,也是最简单的模块。最简单,指的是相对于编译器这种大型程序而言,与一般的代码相比还是有点复杂的 ... [详细]
  • Matlab中利用mex编译Opencv实现画板绘图功能
    图形绘制是标记和可视化数据的重要方法.通过在Matlab中集成画板绘图功能,可为科学计算提供便利.1设置Matlab支持Opencv编译操作系统:麒麟14.04(基于Ubu ... [详细]
  • 这篇文章将为大家详细讲解有关C#开发技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。C#开发技 ... [详细]
  • 贴图的支持及设置:关于贴图分辨率的支持及设置的用户指南
    http:hi.baidu.comdbfr2011818itemeef1eac8df31a2d69744520b贴图分辨率虚幻引擎3支持的贴图分辨率是从1x1到4096x4096 ... [详细]
  • Linux提权之suid篇
    Linux提权之suid篇不知攻,焉知防一个在安服路上摸索的大三生,记录平时学习笔记suid前言:1.只有可以执行的二进制程序文件才 ... [详细]
  • IDEA实用插件Lombok
    LombokLombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。通常,我们所定义的对象和b ... [详细]
  • 下面是一个用openssl实现获取https网页内容的demo,整个流程比较简单,主要封装的API如下staticinthttps_init(http ... [详细]
  • [ipsec][strongswan]strongswan源码分析(五)plugin的配置文件的添加方法与管理架构解析
    我们知道,strongswan是基于插件式管理的。不同的插件有不同的配置文件,在这下面,我们以netlink的插件为例:etcstrongswan.dcharonkernel-ne ... [详细]
  • [USACO 2006 November Gold] 玉米地Corn Fields
    题目描述  FarmerJohn新买了一块长方形的牧场,这块牧场被划分成M行N列(1<M<12;1<N<12),每一格都是一块正方形的土地。FJ打 ... [详细]
  • 3357: [Usaco2004]等差数列
    3357:[Usaco2004]等差数列TimeLimit:10SecMemoryLimit:128MBSubmit:321Solved:153[Submit][Status][D ... [详细]
  • 编译linux搭建vs2015,使用Vs2015开发linux(centos7)程序
    1.首先下载vs2015withupdate32.然后下载VisualCforLinuxDevelopment3.在centos7上yuminstallopenssh-server ... [详细]
  • 系统管理部分软件包管理进程管理服务管理磁盘管理系统管理之软件包管理软件包的安装方式yumapt方式rpmdpkg方式编译安装方式二进制安装方式rpm安装方式增删改查安装:-ivh查 ... [详细]
  • Smali代码注入
    以下的内容是对官方MIUIV4移植教程的补充,其中一些工具的使用就不在这里赘述,请大家参考官方教程。好的,话不多说,进入正题 ... [详细]
author-avatar
BaoBao佳佳佳
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有