小编ash*_*ash的帖子

在LLVM IR中向指令添加元数据

首先,我是LLVM通行证的新手.

我试图在转换过程之后(使用C++ API)向LLVM中的指令添加元数据.我打算存储此信息以供工具链中的其他工具使用.我有两个问题.

  1. 我希望我存储的信息作为元数据提供给另一个工作在LLVM IR上的工具.元数据是个好主意吗?我打算将字符串存储为带有一些指令的元数据.

  2. 如果元数据是正确的方式,我需要一些帮助来创建元数据节点.我打算使用setMedata()函数将它附加到指令.setMetadata()的哪个变体是正确使用的变体.我不确定我的数据应该是哪个MDKind.我想创建一个MDString,将它附加到我的MDNode,然后用一条指令调用setMetadata().如果我想将元数据附加到函数内的指令,我应该在setMedata()中使用什么上下文.上下文与元数据的相关性是什么?

我尝试在论坛和llvm doxygen文档中阅读了很多讨论,但我没有得到一个清晰而完整的答案来回答我的所有问题.我感谢您的帮助或一些可以帮助我理解这一点的材料.

llvm llvm-ir llvm-c++-api

20
推荐指数
1
解决办法
5940
查看次数

如何正确使用system()在C++中执行命令?

我是Windows下的C++编程新手.我试图cuobjdump用C++代码执行命令,使用system()函数:

system("C:\\program files\\nvidia gpu computing...\\cuobjdump.exe --dump-cubin C:\\..\\input.exe");
Run Code Online (Sandbox Code Playgroud)

输出:

Usage  : cuobjdump [options] <file>
Run Code Online (Sandbox Code Playgroud)

接下来是cuobjdump的选项列表.

当我执行这个程序时,我总是得到命令行中显示的cuobjdump帮助选项.就像系统调用不解析文件名一样.我究竟做错了什么?使用createprocess时,我得到相同的结果.这些选项--dump-cubin会产生错误,就好像我输入错误一样.

c++ system function

15
推荐指数
2
解决办法
5万
查看次数

以非递增顺序的n个数的成对和

我在编程访谈博客中看到了这个问题.

如果n以非递减顺序给出成对的数字和,则识别各个数字.如果总和已损坏打印-1.

例:

i/p: 4 5 7 10 12 13 

o/p: 1 3 4 9
Run Code Online (Sandbox Code Playgroud)

提示就足够了.

puzzle algorithm

15
推荐指数
1
解决办法
2799
查看次数

如何从dll内部查找dll的父exe?

我需要根据已加载的进程在dll中做一些事情。因此,相对于Windows编程而言,我还是比较陌生的,我需要帮助弄清楚如何找到加载当前dll的exe。到目前为止,我一直在对exe文件名进行硬编码,这是最愚蠢的事情:D

1)有人建议使用GetModuleFileName()功能。但这似乎使我的应用程序崩溃了(我使用0作为模块句柄)。我什么也没做。我使用以下语法

GetModuleFileName(0,&fileName,MAX_PATH)

编辑:我从这里了解到,我无法通过此调用获取.exe名称,因为它仅返回dll名称:(

2)在DllMain中这样做是个好主意吗?我知道DllMain并不是处理复杂事物的地方。我也了解与加载程序锁相关的问题。我所需要的只是查找父进程的名称。

感谢您的宝贵时间!

添加:我尝试在获取父进程ID后使用GetProcessImageFileName。我收到访问冲突错误。当我尝试调试时,我注意到openProcess调用将我的结果参数(图像文件路径-LPTSTR)留为错误的指针。
GetProcessImageFileName调用返回错误代码87-INVALID PARAMETER。
但是当前的进程ID是有效ID。
这是代码

LPTSTR fileName={0};  
HANDLE hP=OpenProcess(PROCESS_QUERY_INFORMATION ,FALSE, processes[i]) ;
GetProcessImageFileName(hP,fileName,(DWORD)MAX_PATH+1);
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么??

谢谢

编辑要点:

我发现我正在尝试在空闲进程上使用openprocess。(ie)我忘记了我的父进程可能因为我同步而可能正在等待我。因此,现在我得到了一个坏消息,即我无法使用OpenProcess打开一个空闲进程。我还能如何查看空闲进程的对象?(我肯定知道它是空闲的,因为我无法在快照中找到它。我不得不使用enumerateprocess来找到它的ID;但是我确实使用快照中的普通进程枚举来首先找到父进程ID)

c++ exe parent getmodulefilename

6
推荐指数
1
解决办法
4515
查看次数

运行时API应用程序中的cuda上下文创建和资源关联

我想了解如何在cuda运行时API应用程序中创建cuda上下文并与内核相关联?

我知道它是由驱动程序API在引擎盖下完成的.但我想了解创作的时间表.

首先我知道cudaRegisterFatBinary是第一个cuda api调用,它在运行时注册了一个fatbin文件.接下来是一些cuda函数注册API,它们在驱动程序层中调用cuModuleLoad.但是如果我的Cuda运行时API应用程序调用cudaMalloc,那么如何将指针提供给与上下文相关联的函数,我相信应该事先创建它.如何获得这个已经创建的上下文的句柄并将未来的运行时API调用与它相关联?请揭开内部运作的神秘面纱.

引用NVIDIA的文档

CUDA运行时API调用在绑定到当前主机线程的CUDA驱动程序API CUcontext上运行.

如果在需要CUcontext的CUDA运行时API调用时没有绑定到当前线程的CUDA驱动程序API CUcontext,则CUDA运行时将在执行调用之前隐式创建新的CUcontext.

如果CUDA运行时创建CUcontext,则将使用CUDA运行时API函数cudaSetDevice,cudaSetValidDevices,cudaSetDeviceFlags,cudaGLSetGLDevice,cudaD3D9SetDirect3DDevice,cudaD3D10SetDirect3DDevice和cudaD3D11SetDirect3DDevice指定的参数创建CUcontext.请注意,如果在CUcontext绑定到当前主机线程时调用它们,则这些函数将失败并使用cudaErrorSetOnActiveProcess.

CUcontext的生命周期由引用计数机制管理.CUcontext的引用计数最初设置为0,并通过cuCtxAttach递增并递减cuCtxDetach.

如果CUDA运行时创建了CUcontext,则CUDA运行时将减少函数cudaThreadExit中该CUcontext的引用计数.如果CUcontext由CUDA驱动程序API创建(或由CUDA运行时API库的单独实例创建),则CUDA运行时将不会递增或递减该CUcontext的引用计数.

所有CUDA运行时API状态(例如,全局变量的地址和值)都与其基础CUcontext一起传播.特别是,如果CUcontext从一个线程移动到另一个线程(使用cuCtxPopCurrent和cuCtxPushCurrent),那么所有CUDA Runtime API状态也将移动到该线程.

但我不明白的是cuda运行时如何创建上下文?用于此的API调用是什么?nvcc编译器是否在编译时插入一些API调用来执行此操作,还是完全在运行时完成?如果前者是真的那么运行时API用于此上下文管理?后来的确如何完成呢?

如果上下文与主机线程相关联,我们如何访问此上下文?它是否自动与线程处理的所有变量和指针引用相关联?

最终如何在上下文中完成模块加载?

cuda

6
推荐指数
1
解决办法
4155
查看次数

查找LLVM中特定变量的所有用法

我是LLVM的新手.

我正在尝试写一个llvm Pass来执行类似于污点分析的事情.在我的努力中,我需要遍历特定预定义变量的Def-use链.例如,C程序的dis汇编代码如下

  @someVar = external global %struct.something 
Run Code Online (Sandbox Code Playgroud)

这是在函数上面找到的,我想在我的函数中找到这个@someVar的所有用法.我该怎么做?我开始写一个函数传递.但是如何获得此特定标识符的Def Use链?

我在LLVM手册http://llvm.org/docs/ProgrammersManual.html#iterate_chains中找到了这个.

但我不确定如何在这种情况下使用它.

PS对不起,如果我的问题模糊或天真.我是新手,我不知道哪些信息是相关的.

llvm llvm-clang

6
推荐指数
1
解决办法
2403
查看次数

使C函数指针在C++中使用基于C风格的堆栈调用机制

我想在我的C++程序中从一个dll调用一个纯C风格的函数.我尝试使用reinterpret_castto来转换我的函数指针,__cdecl并且仍然保持调用约定_stdcall.我是Windows C++编程的新手.

从评论中编辑代码

reinterpret_cast< Error ( __cdecl*)(int,int)> (GetProcAddress(Mydll::GetInstance()->ReturnDLLInstance(), "add"))(1,10) 
Run Code Online (Sandbox Code Playgroud)

是我的电话.实际的函数语法似乎已声明为

Error __cdecl add(int,int);
Run Code Online (Sandbox Code Playgroud)

调试器抛出错误运行时检查失败#0.我在Windows-C++工作

c c++ pointers function visual-c++

3
推荐指数
2
解决办法
582
查看次数

用clang编译CUDA

我是LLVM的新手.我听说clang支持CUDA.如何使用clang编译CUDA?我是否必须进行一些配置更改或包含任何特定的头文件?我在网上找不到任何相关信息.有可能吗?

现在当我尝试用clang编译一个虚拟cuda程序时

clang -I /usr/local/cuda/include filename.cu 
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

 unknown type name '__global__'

 __global__ void nothing(int *A)
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏!顺便说一句,我在mac中运行它.

cuda clang llvm-clang

1
推荐指数
2
解决办法
4874
查看次数