[cfe-dev] Clang API and __builtin_va_list definition
Kamaljit Lall
klall at factset.com
Fri Sep 21 14:59:44 PDT 2012
Here is the code snippet I'm using:
#include <iostream>
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Host.h"
#include "llvm/Support/Casting.h"
#include "clang/Frontend/DiagnosticOptions.h"
#include "clang/Frontend/TextDiagnosticPrinter.h"
#include "clang/Basic/LangOptions.h"
#include "clang/Basic/FileSystemOptions.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Lex/HeaderSearch.h"
#include "clang/Basic/FileManager.h"
#include "clang/Frontend/HeaderSearchOptions.h"
#include "clang/Frontend/Utils.h"
#include "clang/Basic/TargetOptions.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Lex/Preprocessor.h"
#include "clang/Frontend/PreprocessorOptions.h"
#include "clang/Frontend/FrontendOptions.h"
#include "clang/Basic/IdentifierTable.h"
#include "clang/Basic/Builtins.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTConsumer.h"
#include "clang/Sema/Sema.h"
#include "clang/AST/DeclBase.h"
#include "clang/AST/Type.h"
#include "clang/AST/Decl.h"
#include "clang/Sema/Lookup.h"
#include "clang/Sema/Ownership.h"
#include "clang/AST/DeclGroup.h"
#include "clang/Parse/Parser.h"
#include "clang/Parse/ParseAST.h"
#include "clang/Frontend/CompilerInstance.h"
class MyASTConsumer : public clang::ASTConsumer
{
public:
MyASTConsumer() : clang::ASTConsumer() { }
virtual ~MyASTConsumer() { }
virtual bool HandleTopLevelDecl( clang::DeclGroupRef d)
{
static int count = 0;
clang::DeclGroupRef::iterator it;
for( it = d.begin(); it != d.end(); it++)
{
count++;
clang::VarDecl *vd = llvm::dyn_cast<clang::VarDecl>(*it);
if(!vd)
{
continue;
}
if( vd->isFileVarDecl() && !vd->hasExternalStorage() )
{
std::cerr << "Read top-level variable decl: '";
std::cerr << vd->getDeclName().getAsString() ;
std::cerr << std::endl;
}
}
return true;
}
};
int main()
{
clang::DiagnosticOptions diagnosticOptions;
diagnosticOptions.ShowColors=1;
diagnosticOptions.ErrorLimit =10;
diagnosticOptions.ShowOptionNames=1;
clang::TextDiagnosticPrinter *pTextDiagnosticPrinter =
new clang::TextDiagnosticPrinter(
llvm::outs(),
diagnosticOptions);
llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> pDiagIDs;
clang::DiagnosticsEngine *pDiagnosticsEngine =
new clang::DiagnosticsEngine(pDiagIDs, pTextDiagnosticPrinter);
clang::FileSystemOptions fileSystemOptions;
clang::FileManager fileManager(fileSystemOptions);
clang::SourceManager sourceManager(
*pDiagnosticsEngine,
fileManager);
clang::HeaderSearchOptions headerSearchOptions;
headerSearchOptions.ResourceDir = "/home/user/klall/tools/clang_install/bin/../lib/clang/3.2";
headerSearchOptions.ModuleCachePath = "/var/tmp/clang-module-cache";
headerSearchOptions.Verbose =true;
clang::TargetOptions targetOptions;
targetOptions.Triple = "x86_64-unknown-linux-gnu";
targetOptions.CPU = "x86-64";
clang::TargetInfo *pTargetInfo =
clang::TargetInfo::CreateTargetInfo(
*pDiagnosticsEngine,
targetOptions);
clang::CompilerInstance compInst;
compInst.getTargetOpts() = targetOptions;
clang::HeaderSearchOptions &headerSearchOpts = compInst.getHeaderSearchOpts();
headerSearchOpts = headerSearchOptions;
clang::CompilerInvocation &compInvocation = compInst.getInvocation();
clang::LangOptions languageOptions;
languageOptions.CPlusPlus = 1;
compInvocation.setLangDefaults(languageOptions, clang::IK_CXX, clang::LangStandard::lang_gnucxx98);
clang::HeaderSearch headerSearch(fileManager,
*pDiagnosticsEngine,
languageOptions,
pTargetInfo);
clang::FrontendOptions & frontendOpts = compInvocation.getFrontendOpts();
frontendOpts.DisableFree=1;
frontendOpts.ShowHelp=1;
frontendOpts.ProgramAction = clang::frontend::ParseSyntaxOnly;
clang::CodeGenOptions & codeGenOpts = compInvocation.getCodeGenOpts ();
codeGenOpts.RelaxAll = 1;
codeGenOpts.RelocationModel = "static";
codeGenOpts.DisableFPElim = 1;
codeGenOpts.AsmVerbose = 1;
codeGenOpts.CXXCtorDtorAliases= 1;
codeGenOpts.UnwindTables = 1;
codeGenOpts.OmitLeafFramePointer = 1;
codeGenOpts.StackRealignment = 1;
std::vector<std::string> res;
compInvocation.toArgs (res);
std::vector<std::string>::iterator it;
clang::Preprocessor preprocessor(
*pDiagnosticsEngine,
languageOptions,
pTargetInfo,
sourceManager,
headerSearch,
compInst);
preprocessor.getBuiltinInfo().InitializeBuiltins
(preprocessor.getIdentifierTable(),
languageOptions);
clang::PreprocessorOptions preprocessorOptions;
clang::InitializePreprocessor(
preprocessor,
preprocessorOptions,
headerSearchOptions,
frontendOpts);
const clang::FileEntry *pFile = fileManager.getFile("test.cpp");
sourceManager.createMainFileID(pFile);
const clang::TargetInfo &targetInfo = *pTargetInfo;
clang::IdentifierTable identifierTable(languageOptions);
clang::SelectorTable selectorTable;
clang::Builtin::Context builtinContext;
builtinContext.InitializeTarget(targetInfo);
builtinContext.InitializeBuiltins(identifierTable, languageOptions);
llvm::SmallVector<const char *, 32> builtinNames;
builtinContext.GetBuiltinNames(builtinNames, languageOptions.NoBuiltin);
clang::ASTContext astContext(
languageOptions,
sourceManager,
pTargetInfo,
identifierTable,
selectorTable,
builtinContext,
0 /* size_reserve*/);
MyASTConsumer astConsumer;
clang::Sema sema(
preprocessor,
astContext,
astConsumer);
pTextDiagnosticPrinter->BeginSourceFile(languageOptions, &preprocessor);
clang::ParseAST (preprocessor, &astConsumer, astContext);
pTextDiagnosticPrinter->EndSourceFile();
return 0;
}
-----Original Message-----
From: Kamaljit Lall
Sent: Friday, September 21, 2012 5:49 PM
To: 'Eli Friedman'
Cc: cfe-dev at cs.uiuc.edu
Subject: RE: [cfe-dev] Clang API and __builtin_va_list definition
Thanks for your reply.
Do you know where the __builtin_va_list is generated by clang?
It is a target dependent declaration I believe. Currently I have my target options set as follows:
clang::TargetOptions targetOptions;
targetOptions.Triple = "x86_64-unknown-linux-gnu";
targetOptions.CPU = "x86-64";
Which is consistent with the options I see when compiling directly with clang++:
clang++ -v test.cpp (this works)
Kam
-----Original Message-----
From: Eli Friedman [mailto:eli.friedman at gmail.com]
Sent: Friday, September 21, 2012 5:44 PM
To: Kamaljit Lall
Cc: cfe-dev at cs.uiuc.edu
Subject: Re: [cfe-dev] Clang API and __builtin_va_list definition
On Fri, Sep 21, 2012 at 2:37 PM, Kamaljit Lall <klall at factset.com> wrote:
> I am using the Clang c++ API. I have a blocking issue because the
> builtin __builtin_va_list clang isn't defined.
>
> ..lib/clang/3.2/include/stdarg.h:30:9: error: unknown type name
> '__builtin_va_list'; did you mean '__builtin_va_list'? typedef
> __builtin_va_list va_list;
>
> How can I get this builtin to be visible? Do I have to supply it myself?
No.
> I missing something in my Clang C++ API usage it seems to me.
This. It's not obvious exactly what you messed up, though.
-Eli
More information about the cfe-dev
mailing list