>Yes, so I'm attempting to get the LLVM API to write to file,
>or at least to stdout.
>
>The main one causing me angst is Module -> print
>probably because Module -> dump() is so easy,
>it makes it feel like I'm soo close.
>Though since dump() goes to stderr it is useless,
>can't actually be used for outputing the IR.
>
>Thus I'm assuming I have to use Module -> print,
>but it requires a raw_ostream, and an AssemblyAnnotationWriter
>after much searching I was able to get a raw_ostream defined,
>but no luck with the AssemblyAnnotationWriter.
The doxygen documentation says that the AssemblyAnnotationWriter is
optional. I bet it'll just work if you pass a NULL pointer for the
AssemblyAnnotationWriter argument.
unfortunately that did not work.
in spel.cpp:
void *nullPointer = 0;
raw_fd_ostream ros("-",errorOut);
module -> Module::print(ros,nullPointer);
at compile time:
src/spel.cpp:48:30: error: cannot initialize a parameter of type
'llvm::AssemblyAnnotationWriter *' with an lvalue of type 'void *'
module -> Module::print(ros,nullPointer);
^~~~~~~~~~~
/usr/lib/llvm-3.4/include/llvm/IR/Module.h:574:57: note: passing
argument to parameter 'AAW' here
void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW) const;
^
1 error generated.
If that works, you could file an enhancement request for the print()
method to take a default NULL initializer. That would make a lot of
sense.
are those filed through the bug database?
All that said, writing out disassembled LLVM IR (i.e., LLVM IR
assembly language) is not terribly useful; you'll end up writing a
parser for your code to read it back in. If you want to generate
and transform LLVM IR, you want to do using the LLVM C or C++ API.
The best place to start is looking at the documentation on how to
write an LLVM pass and the LLVM Programmer's Manual at the following
URLs:
http://llvm.org/docs/WritingAnLLVMPass.html
http://llvm.org/docs/ProgrammersManual.html
The doxygen documentation is great for getting information on the
fine details of the API: http://llvm.org/doxygen/hierarchy.html.
All compiler analysis and transform is done as LLVM IR passes run by
a PassManager object. For examples of how to set that up a
PassManager, you can look at the code in llvm/tools/bugpoint,
llvm/tools/opt, and llvm/tools/lto.
thanks for the links,
I'm aware of optimization passes from the kaleidascope tutorial,
currently I want it to output even unoptimized code.
Though I do plan to make full use of them,
once i do have the basics functioning.
To parse your input language, you would write a pass that opens the
source file and generates LLVM IR for the code. You would then use
WriteBitcodeToFile() to write the resulting LLVM IR to a bitcode
file. You can then use the llvm-dis tool to disassemble the bitcode
file into human-readable LLVM IR that you can read for debugging.
not able to get that working either unfortunately.
in spel.cpp:
#include "llvm/Bitcode/ReaderWriter.h"
...
std::string errorOut;
raw_fd_ostream ros("-",errorOut);
WriteBitcodeToFile(module, ros);
at compile time:
/home/elspru/spel/src/spel.cpp:52: undefined reference to
`llvm::WriteBitcodeToFile(llvm::Module const*, llvm::raw_ostream&)'
Regards,
John Criswell
:),
thanks for trying to help.
maybe there are some working examples somewhere?