Функция LLVM * getParent () завершается ошибкой после чтения модуля из mmap - PullRequest
1 голос
/ 06 февраля 2020

Я использую 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";
    }
}

1 Ответ

0 голосов
/ 06 февраля 2020

Я думаю, что parseIR () - неправильная функция, она будет анализировать текстовый формат, а не файл битового кода. Тот, который вы хотите, называется parseBitcodeFile () . Может быть так:

auto buffer = MemoryBuffer::getFile(…);
if(buffer) {
  auto bitcode = llvm::parseBitcodeFile(buffer.get()->getMemBufferRef(),
                                        getContext());
  if(bitcode) {
    module = std::move(bitcode.get());

У вас есть для добавления обработки ошибок, тесты if() крайне необходимы. В LLVM есть очень хороший класс, похожий на указатель, который позволяет разыменовать "указатель" только после того, как вы проверите, что все в порядке. Поэтому добавьте обработку ошибок так, как вы этого хотите, почувствуйте добродетельность и хорошего дня.

...