I've managed to create a test program, included below for the curious, which creates a super simple AST corresponding to "void foo() { }". What do I call to generate code from it? Any pointers on what classes/files to look at?
Best,
Martin
#include "clang/Frontend/CompilerInstance.h"
#include "clang/Frontend/TextDiagnosticBuffer.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/AST/ASTContext.h"
#include "clang/Parse/Scope.h"
#include "clang/Lex/Preprocessor.h"
#include "llvm/LLVMContext.h"
#include "llvm/Target/TargetSelect.h"
using namespace clang;
using namespace std;
int main(int argc, char **argv) {
CompilerInstance MyCI;
MyCI.setLLVMContext(new llvm::LLVMContext);
llvm::InitializeAllTargets();
llvm::InitializeAllAsmPrinters();
TextDiagnosticBuffer DiagsBuffer;
Diagnostic Diags(&DiagsBuffer);
CompilerInvocation::CreateFromArgs(MyCI.getInvocation(), NULL, NULL,
Diags);
// Create the actual diagnostics engine.
MyCI.createDiagnostics(0, NULL);
if (!MyCI.hasDiagnostics())
return 1;
MyCI.createSourceManager();
MyCI.createFileManager();
// Create the target instance.
MyCI.setTarget(TargetInfo::CreateTargetInfo(MyCI.getDiagnostics(), MyCI.getTargetOpts()));
MyCI.createPreprocessor();
MyCI.getPreprocessor();
MyCI.createASTContext();
// ************ Initialization finished. Now time for the fun.
ASTContext &context = MyCI.getASTContext();
DeclContext *DC = context.getTranslationUnitDecl();
IdentifierInfo &info = MyCI.getPreprocessor().getIdentifierTable().get("foo");
DeclarationName myname(&info);
FunctionDecl *fd = FunctionDecl::Create(context, DC, SourceLocation(), myname,
context.DoubleTy, NULL, FunctionDecl::None,
/* isInline = */ false, /* hasPrototype = */ false);
}