I want to programatically define a symbol, e.g. FOO, such that the code “#if defined(FOO)” will evaluate to true during pre-processing.
How do I that?
I tried addMacroDef(“FOO”), and other methods, but to no avail.
I want to programatically define a symbol, e.g. FOO, such that the code “#if defined(FOO)” will evaluate to true during pre-processing.
How do I that?
I tried addMacroDef(“FOO”), and other methods, but to no avail.
Either:
#define FOO
in the code or
-DFOO
on the command line during the compilation (for gcc and clang at least)
– Matthieu
I’m not using the command line, but the lib through code. How do I achieve the desired effect programatically?
Found a way. For anyone interested:
MacroInfo* RegisterMacro(Preprocessor &PP, const char *Name){
// Get the identifier.
IdentifierInfo *Id = PP.getIdentifierInfo(Name);
// Mark it as being a macro that is builtin.
MacroInfo *MI = PP.AllocateMacroInfo(SourceLocation());
MI->setIsBuiltinMacro();
PP.setMacroInfo(Id, MI);
return MI;
}
…
RegisterMacro(preprocessor, “FOO”);
If you need replacement strings, manipulate the returned MacroInfo as follows:
Token t;
t.startToken();
auto& i = preprocessor.getIdentifierTable().get(“Replacement_String”, tok::TokenKind::identifier);
t.setIdentifierInfo(&i);
macroInfo->AddTokenToBody(t);