Получить размер массива переменной длины в llvm - PullRequest
0 голосов
/ 26 февраля 2020

Предположим, у меня есть следующий код

void foo(int n){ 
   int arr[n];
  }
int main(){
  foo(5);
}

В любом случае можно получить значение n (в данном случае 5) для массива в функции foo

Вот что До сих пор я придумал

#include <clang/CodeGen/CodeGenAction.h>
#include <clang/Frontend/CompilerInstance.h>
#include <clang/Frontend/CompilerInvocation.h>
#include <clang/Basic/DiagnosticOptions.h>
#include <clang/Frontend/TextDiagnosticPrinter.h>
#include <llvm/ADT/IntrusiveRefCntPtr.h>
#include <llvm/IR/Module.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/IRReader/IRReader.h>
#include <llvm/Support/SourceMgr.h>
#include <llvm/IR/Instructions.h>

using namespace llvm;

int main(){
 llvm::LLVMContext *llvmcx;
 static llvm::LLVMContext MyGlobalContext;
 llvmcx = &MyGlobalContext;
 llvm::SMDiagnostic Err= llvm::SMDiagnostic();

 std::unique_ptr<llvm::Module> module=llvm::getLazyIRFileModule("test.ll",Err,*llvmcx,false);

    for (auto curFref = module->getFunctionList().begin(), endFref = module->getFunctionList().end();
 curFref != endFref; ++curFref) {
        for(auto bb=curFref->getBasicBlockList().begin();bb!=curFref->getBasicBlockList().end();bb++){
            for(auto ii=bb->getInstList().begin();ii!=bb->getInstList().end();ii++){
                        if(llvm::dyn_cast<llvm::AllocaInst>(ii)){
                          AllocaInst *t=dyn_cast<AllocaInst>(ii);
                              if(t->isArrayAllocation()) { 
                                  if (llvm::ConstantInt* CI=dyn_cast<llvm::ConstantInt(t->getArraysize()){
                                      // this if is not satisfied                                  
                                   }
                              }                        


                         }
                   }
             }
       }
}

Есть ли другой способ получить размер массива переменного размера?

...