0

我有一个具有两个功能的 Ada 源文件:

procedure Ghdl_Psl_Assert_Failed
  (Str : Std_String_Ptr; Severity : Integer; Loc : Ghdl_Location_Ptr) is
begin
  Do_Report ("psl assertion", Str, "Assertion violation", Severity, Loc);
end Ghdl_Psl_Assert_Failed;

procedure Ghdl_Psl_Assume_Failed (Loc : Ghdl_Location_Ptr) is
begin
  Do_Report ("psl assumption", null, "Assumption violation",
             Error_Severity, Loc);
end Ghdl_Psl_Assume_Failed;

这两个函数都导出为 C 风格的符号,如下所示:

pragma Export (C, Ghdl_Psl_Assert_Failed, "__ghdl_psl_assert_failed");
pragma Export (C, Ghdl_Psl_Assume_Failed, "__ghdl_psl_assume_failed");

我像这样构建文件,至少对于一个测试用例,以显示问题:

g++ -c -Isrc/ghdl -g -I- src/ghdl/grt-lib.adb

当我nm用来查看符号表时,我看到它__ghdl_psl_assert_failed出现了,但__ghdl_psl_assume_failed没有。

编译器似乎以某种方式Ghdl_Psl_Assume_Failed()忽略了它,但除此之外我没有任何线索。当另一个源文件抱怨无法找到该函数时,我看到该错误出现在我的项目的完整构建中:

g++ -c -Isrc/ghdl/ -Isrc/clib -Isrc/zlib -Isrc/nuttx/nuttx/include -Isrc/nuttx/nuttx/uclibc/include/uClibc++ -Isrc/nuttx/nuttx/include/cxx -Isrc/nuttx/nuttx/include/nuttx/lib -Isrc/ghdl -g -I- -o /home/jon/controlix/bin/src/ghdl/ghdlrun.o src/ghdl/ghdlrun.adb
ghdlrun.adb:345:19: "Ghdl_Psl_Assume_Failed" not declared in "Lib"
gnatmake: "src/ghdl/ghdlrun.adb" compilation error

有任何想法吗?看起来这个问题在原始 GHDL 构建系统中不存在,但我必须使用我的项目的构建系统,它不使用 GHDL 使用的标准 GNAT 项目构建系统。

4

2 回答 2

2

用户 tgif 建议使用带有 -v 的命令行:

g++ -v -c -Isrc/ghdl -g -I- src/ghdl/grt-lib.adb`

揭示 which gnat1 但没有错误:

1155120@Macbook: !nm
nm grt-lib.o | more
0000000000002260 s EH_frame1
0000000000001b50 s GCC_except_table0
                 U __Unwind_Resume
00000000000006d0 T ___ghdl_assert_failed
0000000000000caa T ___ghdl_bound_check_failed
0000000000000ff0 T ___ghdl_check_stack_allocation
000000000000115a T ___ghdl_deallocate
0000000000000d5a T ___ghdl_direction_check_failed
0000000000000fac T ___ghdl_i32_exp
0000000000000fcc T ___ghdl_i64_exp
000000000000074e T ___ghdl_ieee_assert_failed
000000000000110e T ___ghdl_malloc
0000000000001126 T ___ghdl_malloc0
0000000000000254 T ___ghdl_memcpy
                 U ___ghdl_now
0000000000000a6a T ___ghdl_program_error
0000000000000806 T ___ghdl_psl_assert_failed
0000000000000884 T ___ghdl_psl_assume_failed
00000000000008f0 T ___ghdl_psl_cover
...

一点点侦查表明您的 grt-lib.adb (在左侧, from https://sourceforge.net/p/controlix/code/ci/211711ec27e72ca23262433dfbebe9b905cecffd/tree/src/ghdl_grt/grt-lib.adb)已过时:

比较_grt-lib_adb.jpg

并且不包含过程 Ghdl_Psl_Assume_Failed

日期戳显示 2019-08-11,而右侧参考 grt-lib.adb 来自GHDL 0.37-dev (v0.36-569-g5738c8a)(2019 年 8 月 10 日下载并包含程序主体,.ads 文件也可能已过期)。

看起来ghdl_grt从较新的同步ghdl/src/grt是有序的。

8 月 7 日 (GMT+12) 在 ghdl 主提交 0331772c 中添加了对 PSL_Assume 的支持。

于 2019-09-16T03:15:47.113 回答
1

你为什么使用g++而不是gcc?这很不寻常。你知道哪个 gnat1 被执行(尝试使用 编译-v)。

于 2019-09-14T09:26:05.077 回答