【问题标题】:making function global scope like a compiler intrinsic使函数全局范围像编译器内在
【发布时间】:2021-01-01 14:41:38
【问题描述】:

我使用的是 arm 编译器固有的函数,但不是 GCC(即 arm 的 __strex)。我将 strex 函数用作内联函数的一部分。使用 arm 编译器可以正常工作。我有两个项目,使用 arm 编译器的目标和使用 GCC 的测试项目。使用 GCC,我无法通过我尝试过的许多变通方法来编译它。我一直无法在范围内获取变量。由于该函数是内联的,这意味着目标文件期望该函数在该文件的范围内。我不想修改目标以包含仅用于编译测试项目的头文件。有没有办法通过链接器或编译器属性创建一个函数,它的行为很像一个在整个代码库中具有全局范围的内在函数?

【问题讨论】:

  • 没有声明,编译器不会知道你的函数。没有定义,编译器无法内联函数。

标签: c++ unit-testing arm intrinsics globals


【解决方案1】:

我不想修改目标 [file] 以包含仅用于编译测试项目的头文件。

你不需要修改它。使用-include some/header/file.h GCC 标志以非侵入方式包含额外的标头。

然后您可以创建函数inline 并将其放入标题中,或者在其他地方定义它。

【讨论】:

  • 你也按照我的需要回答了它。把它给了第一个及时的人。谢谢!
  • @Michael:这个答案是在我之前发布的;我花了额外的时间链接 GCC 文档。看到你的问题,我们俩很快就有了相同的想法,我敢肯定。
【解决方案2】:

需要为编译器声明的函数才能内联它。如果由于某种原因您不想修改任何源代码,请修改您的构建以使用命令行选项进行编译。

如果您可以将其定义为 CPP 宏,则一种可能性是像 -D__strex=something 这样的预处理器选项。

或者更有可能使用 GCC 的 -include foo.h option 来包含一个 .h,它提供了您需要的任何内在函数的正确定义。 (它默认搜索#include "..." 路径,而不是#include <...>)。

-include file

处理文件,就好像“#include "file"" 出现在主要源文件的第一行。但是,搜索的第一个目录 file 是预处理器的工作目录,而不是包含主源文件的目录。如果在那里找不到,那就是 在 "#include "..."" 搜索链的其余部分中正常搜索。


GCC 确实有一些指令的内在函数。不过,关于 LL/SC 指令的 IDK,例如 strex;这会很棘手,因为您可以将 放在 ldrexstrex 之间而不使其总是失败的限制。如果调试模式进行额外的加载/存储,它们之间的任意 C 的内在函数可能导致代码仅在发布模式下工作。

例如https://github.com/ARMmbed/core-util/issues/76 建议项目远离这些内在函数并使用 GNU C __atomic 内置函数。考虑自己做同样的事情,例如使用__atomic_add_fetch 代替手动__ldrex__strexhttps://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 2012-02-18
    • 2015-03-22
    • 2013-07-13
    • 2012-07-05
    相关资源
    最近更新 更多