Предположим, у меня есть следующий код
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
}
}
}
}
}
}
}
Есть ли другой способ получить размер массива переменного размера?