[cfe-dev] Define new pragma in Clang

Alexandra xinfinity_a at yahoo.com
Thu Jan 21 01:11:51 PST 2010

> Generally you would need to do something like:
>  1. Add a pragma handler, which has a callback on the actions interface.
>  2. Add a sema implementation of the callback, which sets some
> internal bit in the Sema object.
>  3. Add a new bit to the 'for' statement, to specify whether this it
> had #pragma optimize set.
>  4. Modify codegin to emit the metadata based on that bit.
>  - Daniel
> > Thank you.
> >
> >
> > _______________________________________________
> > cfe-dev mailing list
> > cfe-dev at ...
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
> >

Thank you, your hints were very helpful. Still I encountered one more problem
regarding pragmas. I have added two pragmas that work very well, if I add one at
a time in my source code that I use to test clang. Nevertheless, the compiler
crashes if I insert both pragmas in the test source code. 
What I have done is:
1 install a fresh copy of llvm + clang
2 modify clang to understand pragma 1 and pragma 2
3 write a test.cpp without any pragma => clang works fine
4 write a test1.cpp containing pragma 1 => clang works fine
5 write a test2.cpp containing pragma 2 => clang works fine
6 write a test12.cpp containing pragma 1 and pragma 2 => clang crashes

It understands correctly the pragma and creates the AST, but crashes with:

clang-cc: /llvm/ADT/SmallVector.h:124: T&
llvm::SmallVectorImpl<T>::operator[](unsigned int) [with T = std::pair<unsigned
int, llvm::TrackingVH<llvm::MDNode> >]: Assertion `Begin + idx < End' failed.

0.	Program arguments: clang-cc inputCode.cpp -emit-llvm 
1.	<eof> parser at end of file
2.	Per-module optimization passes
3.	Running pass 'Print module to stderr' on module 'inputCode.cpp'.
Aborted (core dumped)

However, I do not modify the passes at all and the AST seems to be correctly
created, since when test1.cpp and test2.cpp are compiled, it works.

Any idea would be appreciated. My guess is that there is a problem with the AST,
since printing the module causes a crash. But still, the other passes run before
were successful and additionally, it doesn't crash when only one pragma is added.

Thank you,

More information about the cfe-dev mailing list