问题标签 [sunstudio]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
solaris - OracleSolaris 11.2——要使用的工具链
有两个选项 - SunStudio 或 gcc 工具链。开发驱动程序时要遵循的常见做法是什么——确保它使用 32 位和 64 位模式的两种编译器构建,或者选择一个编译器并坚持使用它?
谢谢。
c++ - 如何在没有调试符号的情况下在 Solaris 上调试由 C++ 二进制文件生成的内核?
我知道您可以在不使用 -g 的情况下在 Linux 上构建应用程序,然后使用来自相同代码但使用 -g 构建的二进制文件从应用程序中调试核心文件(所有其他选项都相同)。如果 nm 输出相同,则符号匹配,您可以有效地分析核心文件。
然而,虽然我在 Linux 上成功地做到了这一点,但我无法让它在 Solaris 上工作。我使用 -xO4 构建,所以也许 -g 不支持优化级别?我也试过 -g0 也没有用。nm 文件有很大的不同。我也在用-xs 构建。我应该在没有 -xs 的情况下构建吗?
在我尝试进一步分析之前,有没有人能够让它发挥作用?
需要明确的是,这是事后构建和使用调试库的问题。如果您使用 -g 和其他一切相同 (-O3) 构建 Linux,这是可能的,但我无法让它与使用 -xO4 的 Solaris 构建一起使用。
这不是让系统库匹配的问题,因为我已经从我们的客户那里获得了系统库的副本,并且它们匹配得很好。使用调试符号 (-g0) 构建时,我们的库不匹配。当我们不使用 -g0 时,我们的符号匹配得很好,但我们无法调试到源代码级别并获取本地和全局变量值。
macros - 如何在 Sun Studio 下打印预处理器宏?
我在 SunOS 5.11 (Solaris 11.3) 上的 Sun Studio 12.3 下工作。我需要查看 Sun Studio 定义的宏来修复套件下的错误报告。这类似于Solaris 和 Preprocessor Macros,但引用的问题使用 GCC 及其预处理器;而不是 Sun Studio 的预处理器。
我已经运行了CC -flags
,但我没有看到类似于 GCCcpp -dM
或g++ -dM -E - </dev/null
. CC
确实有-E
,但它相当贫乏并且不打印任何预处理器定义:
使用真实的测试文件会产生类似的结果 - 缺少预处理器宏:
我还在 Sun Studio 手册2.5.3 Predefined Names中找到了对预处理器宏的讨论。表 A-2 还可以,但也主要是乏善可陈。它缺少基础知识,例如__cplusplus
,缺少其他定义,例如_RWSTD_NO_CLASS_PARTIAL_SPEC
.
如何在 Sun Studio 下打印预处理器宏?
c++ - 虚假的“预计会返回一个值”警告?
我在 SunOS 5.11 (Solaris 11.3) 上的 Sun Studio 12.3 下工作。它提供了一个虚假的警告:
“<file.h>”,第 1 行:警告:“<function>”应返回一个值。
该函数是基类接口的一部分,看起来像这样。我只提到基类接口以避免“你为什么要这样做”的讨论。像下面这样的非成员函数足以触发它。
我发现提到了类似的问题。例如,Xapian-core更改日志指出:
- 禁用 Sun 的 C++ 编译器发出的“预期返回值”警告
,因为它会触发以“throw”语句结尾的函数。真正
的实例将被具有高级警告机制的编译器捕获。
根据SunStudio C++ 编译器编译指示禁用警告,我可以使用-erroff=voidretw
. 我很担心,-erroff=voidretw
因为它可能会压制有效的发现。此外,如果我使用#pragma
,那么我需要推送并弹出它以避免交叉授粉到用户代码中。我不知道如何在 Sun Studio 下推送和弹出警告状态。
我的问题是,如何禁用 Sun Studio 下标题中的一个功能的警告?
即使消息不同,这看起来也像是重复的:如何使“最后一条语句应返回值”警告静音?我想我将投票决定将其作为副本关闭。
c++ - ube 错误:_mm_aeskeygenassist_si128 内在至少需要 -xarch=aes
我在 SunOS 5.11 (Solaris 11.3) 上的 Sun Studio 12.3 下工作。它提供了一个我不太明白的编译错误:
添加-m64
会产生相同的错误。
测试程序没有太多内容。它只是练习 SSE2 内在函数和 AES 内在函数:
我一直在尝试阅读手册并学习如何指定多个 cpu 架构功能,如 SSE2、SSSE3、AES 和 SSE4。但我似乎无法确定如何指定多个。这是我发现的更完整的页面之一:Oracle Man Page CC.1,但我显然遗漏了一些关于-xarch
.
我做错了什么,我该如何解决?
cryptography - Sun Studio 下的 SSE3/SSSE3 + AES/RDRAND/RDSEED
我在 SunOS 5.11 (Solaris 11.3) 上的 Sun Studio 12.3 下工作。我正在调整一个包含负面测试的脚本,其中包括 CPU 功能的奇怪组合。我们这样做是为了了解我们是否以及如何失败;并确保没有意外的惊喜。
我试图找出一种方法来启用本机指令集以及 AES、RDRAND 和 RDSEED。本机指令集由 Xeon 5100 提供,它实际上是 SSE3/SSSE3 加上一些附加指令。
编译所有源文件,/opt/solarisstudio12.3/bin/CC -DNDEBUG -g3 -xO2 -template=no%extdef -native -m64 -KPIC -xarch=aes -D__AES__=1
结果如下:
这是意料之中的,因为 Sun Studio 假定功能和可用性不断发展。当我修改生成文件以构建cpu.cpp
(用于功能测试)、rijndael.cpp
(提供 AES 实现)和test.cpp
(执行测试)时-xarch=aes
,程序仍然崩溃,因为 SSE4 正在蔓延到test.cpp
.
我尝试使用-xarch=aes -D__AES__=1 -xarch=no%sse4_1 -xarch=no%sse4_2
删除不需要的指令集,但未能按预期编译。no%sse4_1
只是来自,-template=no%extdef
因为no%
前缀似乎是关闭事物的方式。
如何在 Sun Studio 下使用 SSE3/SSSE3 并添加 AES/RDRAND/RDSEED?甚至可能吗?
我们使用的模式,到目前为止运行良好,是将编译时支持与运行时支持结合起来。所以 AES 代码看起来像:
对于像 Clang 和 GCC 这样的编译器,我们只需-march=native -maes -mrdrnd -mrdseed
. 我很高兴接受没有发生异花授粉。
然后我在 Oracle 的留言板上看到两条消息,表明 RDRAND 在 Sun Studio 12.3 和 12.4 下被破坏(这里是 12.3,这里是 12.4)。因此,我必须确保启用 RDRAND 以确保对其进行测试,这需要-xarch=aes
.
基于_mm_aeskeygenassist_si128 内在至少需要 -xarch=aes,这可能是不可能的。这个问题实际上是尽职调查,以确保我们尽一切努力确保无故障体验。
solaris - Sun Studio 12.5 需要启用什么存储库?
我们是 Oracle OTN 网络的一部分。Oracle Solaris Studio 发布者已安装(启用?)并允许我们支持最高到 Sun Studio 12.4。我们希望在下一个版本中添加对 Sun Studio 12.5 的支持。
我们尝试按照 12.4 说明安装 Sun Studio 12.5,但没有找到:
我们可以找到哪个软件包存储库 Sun Studio 12.5?
这是预期的结果和搜索最新组件的结果。
macros - 在预处理器中检测 -xarch 选项?
我在 Solaris 11 上使用 Sun Studio 12.4 和 12.5。我们有一个源文件,它提供了 CRC32 的直接 C/C++ 实现,或使用 Intel 内在函数的 CRC32 优化版本。在运行时,函数指针会填充正确的实现。
在具有双 Xeon 的 x86 服务器上进行测试会产生以下结果,因为我们正在根据编译器版本提供代码路径。SunCC 12.1 添加了对 SSE4 的支持(如果我正确解析了矩阵),所以我们尝试在__SUNPRO_CC >= 0x5100
.
SunCC没有定义惯用的 GCC 定义,例如__SSE4_1__
和__SSE4_2__
。此外,SunCC 似乎没有像 MS VC++ 那样提供内在函数,其中编译器版本表明支持。
SunCC 似乎启用了基于-xarch
选项的功能,但我不清楚如何在预处理器中检测它。此外,using-xarch
设置了一些导致程序在低级处理器(类似于“最小”平台)上执行失败的位。
我有两个问题。
- 如何检测
-xarch
预处理器中的选项? - 如何禁用这些
-xarch
位以便程序可以在下级处理器上运行?
下面是来自用-xarch=aes
. 请注意,没有任何迹象表明可用的功能。
c++ - 错误:不能使用向量 unsigned long long[2] 来初始化向量 unsigned long long[2]
我们在 Sun Studio 12.3 下进行测试。我们正在捕获 12.4 及更高版本下不存在的编译器错误。它在 12.1 及更早版本下不存在,但那是因为编译器在 AES 指令方面存在问题。它也不存在于其他编译器下,如 Clang、GCC、ICPC 和 VC++。错误是:
有问题的代码是:
我有一些问题:
- 编译器有什么问题?
清除错误的最佳方法是什么?
我必须问第二个问题,因为我不确定 SunCC 以及__m128i
给定的类型我可以使用 raw memcpy
,尝试编写我自己的交换,甚至尝试iter_swap
不取消引用。
c++ - 鉴于其不透明类型和数组,如何在 C++03 中交换两个 __m128i 变量?
__m128i
交换变量的最佳做法是什么?
背景是Sun Studio 12.2 下的编译错误,这是一个 C++03 编译器。__m128i
是与 MMX 和 SSE 指令一起使用的不透明类型,它通常和unsigned long long[2]
. C++03 不提供交换数组的支持,std:swap(__m128i a, __m128i b)
在编译器下失败。
以下是一些不太符合要求的相关问题。它们不适用,因为std::vector
不可用。