Hexagon LLVM编译架构介绍(16)
4 从 GCC 移植代码
4.1 概述
本章描述了将以前仅使用 GCC 构建的应用程序移植到 LLVM 时经常遇到的问题。
它涵盖以下主题:
- 命令选项
- 错误和警告
- 函数声明
- 转换为不兼容的类型
- 数组大小
- 对齐属性
- 保留寄存器
- 内联与外部内联
注意:
有关 GCC 兼容性的更多信息,请参阅第 6 章。
4.2 命令选项
LLVM 支持许多但不是全部 GCC 命令选项。 不支持的选项要么被忽略,要么用警告或错误消息标记:大多数会收到警告消息。
有关更多信息,请参阅第 3.4.5 节。
4.3 错误和警告
LLVM 严格遵守 C99 语言标准。 因此,您在编译 GCC 代码时可能会遇到新的错误和警告。
要在移植到 LLVM 时处理这些消息,请考虑以下步骤:
- 删除命令选项 -Werror 如果正在使用它(因为它将所有警告转换为错误)。
- 使用 LLVM 诊断选项将特定错误转换为警告。 有关更多信息,请参阅 http://clang.llvm.org/docs/UsersManual.html#cl_diagnostics。
- 更新代码以消除剩余的错误和警告。
4.4 函数声明
LLVM 对函数声明强制执行 C99 规则。 特别是:
- 声明为非void 返回类型的函数必须返回该类型的值。
- 假定在声明之前引用的函数返回 int 类型的值。 如果函数随后被声明为返回某种其他类型,它将被标记为错误。
- 具有 inline 属性的函数声明假定存在该函数的单独定义,其中不包括 inline 属性。 如果程序中没有出现这样的定义,就会发生链接时错误。
要在移植到 LLVM 时满足这些限制,请考虑以下步骤:
- 每当函数定义未返回其声明类型的值时,使用选项 -Wreturn-type 生成警告。
- 使用 -Wimplicit-function-declaration 在声明之前使用函数时生成警告。
- 更新代码以消除剩余的错误和警告。
有关内联的更多信息,请参阅 http://clang.llvm.org/compatibility.html#inline。
可以在以下位置找到对不同内联方法的讨论
http://www.greenend.org.uk/rjk/tech/inline.html。
4.5 转换为不兼容的类型
LLVM 强制执行严格别名的 C99 规则。
在 C 语言中,引用同一内存位置的两个指针被称为互为别名。 因为通过别名指针的任何存储都可能修改由其指针别名之一引用的数据,所以指针别名会限制编译器的能力
生成优化代码。
在严格别名中,防止指向不同类型的指针相互别名。 编译器用错误消息标记指针别名。
请注意,严格别名有一些例外:
- 任何指针类型都可以转换为 char* 或 void* 。
- char* 或void* 可以转换为任何指针类型。
- 指向仅因符号不同而不同的类型的指针(例如, int 与 unsigned int )可以是别名。
要在移植到 LLVM 时满足严格别名,请考虑以下步骤:
- 使用选项 -Wcast-align 在检测到指针别名时生成警告。
- 更新代码以消除产生的警告。