[LLVMdev] [solved] Asm output while executing
Álvaro Castro Castilla
alvaro.castro.castilla at gmail.com
Thu May 29 09:29:17 PDT 2008
Hi,
Well maybe it was pretty obvious for some people, but it took me some
hours. I must point out that I was using llvm 2.2, not svn. An API
change affected me: addPassesToEmitFile function only accepted
FunctionPassManager, now it works with PassManagerBase, which I needed
in order to use the same Pass Manager than my other Passes I'm working
on. So I updated to svn and here I put the code I use:
*************
std::string Err;
const llvm::TargetMachineRegistry::entry* _arch =
llvm::TargetMachineRegistry::getClosestTargetForJIT(Err);
std::string FeaturesStr;
llvm::TargetMachine* target(_arch->CtorFn(*_module, FeaturesStr));
assert(target && "Could not allocate target machine!");
target->addPassesToEmitFile(*_passManager, os,
llvm::TargetMachine::AssemblyFile, true);
target->addPassesToEmitFileFinish(*_passManager, 0, true);
_passManager->run(*_module);
std::cout << os.str() << std::endl;
os.str("");
llvm::Function *inputFunction = _module->getFunction("function");
std::vector<llvm::GenericValue> args(0);
llvm::GenericValue result;
result = _executionEngine->runFunction( inputFunction, args );
*************
Thanks anyway, I hope this is useful for someone.
--
.alvaro.castro.castilla.
2008/5/28 Álvaro Castro Castilla <alvaro.castro.castilla at gmail.com>:
> Hello,
>
> I'm trying to catch assembly output and do some formatting for its
> presentation while being executed.
> I face a problem, which is clear from the error, although I have no
> clue on how to do it otherwise.
> If generating the code for its asm output and then for jit execution I get:
>
> **********
> static llvm::MachineFunction& llvm::MachineFunction::construct(const
> llvm::Function*, const llvm::TargetMachine&): Assertion
> `Fn->getAnnotation(MF_AID) == 0 && "Object already exists for this
> function!"' failed.
> **********
>
> The code I use:
>
>
> /// The asm code output
>
> std::string Err;
> const llvm::TargetMachineRegistry::entry* MArch =
> llvm::TargetMachineRegistry::getClosestStaticTargetForModule(*_module,Err);
>
>
> std::string FeaturesStr;
> std::auto_ptr<llvm::TargetMachine>target(MArch->CtorFn(*_module,FeaturesStr));
> assert(target.get() && "Could not allocate target machine!");
> llvm::TargetMachine &Target = *target.get();
>
> llvm::FunctionPassManager Passes(new
> llvm::ExistingModuleProvider(_module));
> Passes.add(new llvm::TargetData(*Target.getTargetData()));
>
> std::ostringstream os;
> Target.addPassesToEmitFile(Passes,os,llvm::TargetMachine::AssemblyFile,
> true);
>
> Passes.doInitialization();
> for (llvm::Module::iterator I = _module->begin(),
> E=_module->end(); I != E; ++I)
> if (!I->isDeclaration())
> {
> Passes.run(*I);
> }
> Passes.doFinalization();
>
> /// The execution
>
> llvm::Function *inputFunction = _module->getFunction("function");
> std::vector<llvm::GenericValue> args(0);
> llvm::GenericValue result;
> result = _executionEngine->runFunction( inputFunction, args );
>
> ****
>
> Thanks,
>
>
> --
>
> .alvaro.castro.castilla.
>
More information about the llvm-dev
mailing list