Я использую mmap для загрузки ИК-файла в память. Но после того, как я это сделал, я не смог получить имя модуля с помощью F-> getParent () -> getName () API. Кто-нибудь может дать мне подсказку? Соответствующий код выглядит следующим образом:
for (unsigned i = 0; i < InputFilenames.size(); ++i) {
/*Use mmap to load files into memory*/
StringRef MName MName = StringRef(strdup(InputFilenames[i].data()));
if ((fd = open(MName.str().c_str(), O_RDWR)) < 0) {
perror(MName.str().c_str());
}
if ((fstat(fd, &sb)) == -1) {
errs() << "stat:\n";
perror(MName.str().c_str());
continue;
}
else {
if (sb.st_mode & S_IFDIR) {
continue;
}
}
if ((mapped = (char *)mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0)) == (void *)-1) {
perror("mmap");
OP << MName.str() << " not mapped.\n";
}
close(fd);
/*Get IR Module from memory buffer*/
std::string IRString(mapped, mapped + sb.st_size);
std::unique_ptr<MemoryBuffer> memBuffer =
MemoryBuffer::getMemBuffer(IRString);
MemoryBuffer *mem = memBuffer.release();
std::unique_ptr<Module> M = parseIR(mem->getMemBufferRef(), Err, *LLVMCtx);
Module *Md = M.release();
for (auto curFref = Md->getFunctionList().begin(),
endFref = Md->getFunctionList().end();
curFref != endFref; ++curFref) {
if (curFref->empty())
continue;
/*"curFref->getParent()->getName()" prints nothing. */
errs() << "--" << curFref->getName()
<< " from Module : "<<curFref->getParent()->getName()<<"\n";
}
}