登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
11月29日 Gitee Talk | 模力方舟 AI 沙龙深圳站:看懂算力到应用的下一个主战场!点击立即报名~
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
11
Star
40
Fork
36
openEuler
/
open-source-summer
代码
Issues
235
Pull Requests
4
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
llvm与gcc兼容性增强 —— 符号类型处理差异
待办的
#IC3XFV
开源之夏 2025
YangYang
创建于
2025-04-25 14:34
- 项目名称 llvm与gcc兼容性增强 —— 符号类型处理差异 - 项目描述: llvm和gcc是当下主流的C、C++编译器。应用使用不同编译器编译构建,可能遇到编译或者运行的兼容性问题。为降低客户在从gcc迁移至llvm过程中的人力投入,提升客户体验,需要在llvm编译器中对兼容性进行增强,支持对应场景的处理。不同编译器生成obj文件时,生成的函数/变量符号的类型可能存在差异,最终引发兼容性问题,例如: test.c ``` int global; void test() {} ``` main.c ``` int global; void test(); int main() { test(); } ``` 针对上述场景使用gcc9.3.0可以编译通过,使用LLVM17编译则会提示重复定义 ``` gcc test.c -c gcc main.c -c gcc test.o main.o ```  可以发现gcc和clang生成的`global`符号的属性不同  该现象是因为gcc默认打开了-fcommon。 此外还有如下场景: pi.h: ``` #ifndef PI_H #define PI_H namespace pi { template <class T> constexpr T value; template <> constexpr double value<double> = 3.14; template <> constexpr float value<float> = 3.14f; } // namespace pi #endif ``` func.cpp: ``` #include "pi.h" #include <iostream> void func() { double d = pi::value<double>; std::cout << "func: " << d << std::endl; } ``` main.cpp ``` #include <iostream> #include "pi.h" void func(); int main() { double d = pi::value<double>; std::cout << "main: " << d << std::endl; func(); return 0; } ``` 该场景同样gcc可以编译通过,但clang会在链接的时候报重复定义 ``` clang++ func.cpp main.cpp /usr/bin/ld: /tmp/main-83aea0.o:(.rodata+0x0): multiple definition of `pi::value<double>'; /tmp/func-bff22c.o:(.rodata+0x0): first defined here /usr/bin/ld: /tmp/main-83aea0.o:(.rodata+0x8): multiple definition of `pi::value<float>'; /tmp/func-bff22c.o:(.rodata+0x8): first defined here clang++: error: linker command failed with exit code 1 (use -v to see invocation) ``` 两者对于pi:value<double>生成的属性同样是有差异的  本地需要学生针对llvm与gcc生成符号属性的行为进行调研,并在LLVM中兼容gcc的行为,从而降低从gcc迁移至LLVM的成本。 - 项目难度 进阶。 - 技术领域标签:编译器 - 编程语言标签:C/C++ - 项目产出要求: 1,针对llvm与gcc生成符号属性的行为进行调研,输出调研报告。 2,在llvm中开发功能,根据调研发现的差异进行兼容,在对应功能打开时,保障llvm对符号属性的处理行为与gcc一致。 - 项目技术要求: 熟悉C++编程,熟悉编译器开发,有LLVM开发经验最佳 - 项目成果提交仓库: https://gitee.com/openeuler/llvm-project - 预估工时 2.5人月 - 项目备注 NA - 项目导师名字&导师邮箱:杨阳 yangyang305@huawei.com
- 项目名称 llvm与gcc兼容性增强 —— 符号类型处理差异 - 项目描述: llvm和gcc是当下主流的C、C++编译器。应用使用不同编译器编译构建,可能遇到编译或者运行的兼容性问题。为降低客户在从gcc迁移至llvm过程中的人力投入,提升客户体验,需要在llvm编译器中对兼容性进行增强,支持对应场景的处理。不同编译器生成obj文件时,生成的函数/变量符号的类型可能存在差异,最终引发兼容性问题,例如: test.c ``` int global; void test() {} ``` main.c ``` int global; void test(); int main() { test(); } ``` 针对上述场景使用gcc9.3.0可以编译通过,使用LLVM17编译则会提示重复定义 ``` gcc test.c -c gcc main.c -c gcc test.o main.o ```  可以发现gcc和clang生成的`global`符号的属性不同  该现象是因为gcc默认打开了-fcommon。 此外还有如下场景: pi.h: ``` #ifndef PI_H #define PI_H namespace pi { template <class T> constexpr T value; template <> constexpr double value<double> = 3.14; template <> constexpr float value<float> = 3.14f; } // namespace pi #endif ``` func.cpp: ``` #include "pi.h" #include <iostream> void func() { double d = pi::value<double>; std::cout << "func: " << d << std::endl; } ``` main.cpp ``` #include <iostream> #include "pi.h" void func(); int main() { double d = pi::value<double>; std::cout << "main: " << d << std::endl; func(); return 0; } ``` 该场景同样gcc可以编译通过,但clang会在链接的时候报重复定义 ``` clang++ func.cpp main.cpp /usr/bin/ld: /tmp/main-83aea0.o:(.rodata+0x0): multiple definition of `pi::value<double>'; /tmp/func-bff22c.o:(.rodata+0x0): first defined here /usr/bin/ld: /tmp/main-83aea0.o:(.rodata+0x8): multiple definition of `pi::value<float>'; /tmp/func-bff22c.o:(.rodata+0x8): first defined here clang++: error: linker command failed with exit code 1 (use -v to see invocation) ``` 两者对于pi:value<double>生成的属性同样是有差异的  本地需要学生针对llvm与gcc生成符号属性的行为进行调研,并在LLVM中兼容gcc的行为,从而降低从gcc迁移至LLVM的成本。 - 项目难度 进阶。 - 技术领域标签:编译器 - 编程语言标签:C/C++ - 项目产出要求: 1,针对llvm与gcc生成符号属性的行为进行调研,输出调研报告。 2,在llvm中开发功能,根据调研发现的差异进行兼容,在对应功能打开时,保障llvm对符号属性的处理行为与gcc一致。 - 项目技术要求: 熟悉C++编程,熟悉编译器开发,有LLVM开发经验最佳 - 项目成果提交仓库: https://gitee.com/openeuler/llvm-project - 预估工时 2.5人月 - 项目备注 NA - 项目导师名字&导师邮箱:杨阳 yangyang305@huawei.com
评论 (
1
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
负责人
未设置
标签
sig/sig-OSCourse
未设置
项目
未立项任务
未立项任务
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
未关联
master
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
预计工期
(小时)
参与者(1)
1
https://gitee.com/openeuler/open-source-summer.git
[email protected]
:openeuler/open-source-summer.git
openeuler
open-source-summer
open-source-summer
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册