[LLVMdev] llvm2cpp attributes handling

Harris BAKIRAS h.bakiras at gmail.com
Mon Mar 25 09:15:26 PDT 2013

Hi everyone,

We are using the llvm2cpp feature of LLVM in the VMKit project and there 
are some issues that I would like to point out.

I made a tiny reproducible example here, to be clear:

echo "int main() { return 0; };" > test.c && clang test.c -emit-llvm -c 
-o - | llc -march=cpp -cppgen=function -cppfor=main -o -

This command is supposed to generate the C++ code to construct the main 
function in LLVM (see main_llvm2cpp.cc joined file).
But an error occurs while generating the code (see stack trace below).

It appears that an assertion is broken while treating attributes in the 
file CPPBackend.cpp.
So I dumped the main function's attributes before treating them, here is 
the result:

   { ~0U => *nounwind uwtable* "less-precise-fpmad"="false" 
"no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" 
"no-infs-fp-math"="false" "no-nans-fp-math"="false" 
"unsafe-fp-math"="false" "use-soft-float"="false" }

The problem is that llvm2cpp code generation supports only the 
attributes present in the AttrKind enum of the Attribute class.
It means that the following attributes are not supported:
     - "less-precise-fpmad"
     - "no-frame-pointer-elim"
     - "no-frame-pointer-elim-non-leaf"
     - "no-infs-fp-math"
     - "no-nans-fp-math"
     - "unsafe-fp-math"
     - "use-soft-float"

What is extremely strange, is that those attributes are set by clang 
with no particular option.

So, is the assert in CPPBackend.cpp deprecated or should those 
attributes be handled somehow in C++ code generation (which means that 
the previous attribute list should be added to the AttrKind enum of the 
Attribute class)?



Harris Bakiras

    llc: CPPBackend.cpp:521: void 
{anonymous}::CppWriter::printAttributes(const llvm::AttributeSet&, const 
string&): Assertion `!attrs.hasAttributes() && "Unhandled attribute!"' 
0  llc             0x00000000010edc22 
llvm::sys::PrintStackTrace(_IO_FILE*) + 34
1  llc             0x00000000010ed049
2  libpthread.so.0 0x00007f9701addcb0
3  libc.so.6       0x00007f9700d2f425 gsignal + 53
4  libc.so.6       0x00007f9700d32b8b abort + 379
5  libc.so.6       0x00007f9700d280ee
6  libc.so.6       0x00007f9700d28192
7  llc             0x000000000064fed3
8  llc             0x000000000065335b
9  llc             0x0000000000659fed
10 llc             0x000000000065b0dc
11 llc             0x0000000001081230 
llvm::MPPassManager::runOnModule(llvm::Module&) + 688
12 llc             0x0000000001081405 
llvm::PassManagerImpl::run(llvm::Module&) + 245
13 llc             0x0000000000565d27
14 llc             0x0000000000551281 main + 353
15 libc.so.6       0x00007f9700d1a76d __libc_start_main + 237
16 llc             0x0000000000561fd5
Stack dump:
0.    Program arguments: llc -march=cpp -cppgen=function -cppfor=main -o -
1.    Running pass 'C++ backend' on module '<stdin>'.
Aborted (core dumped)

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130325/d6dca767/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: main_llvm2cpp.cc
Type: text/x-c++src
Size: 1683 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130325/d6dca767/attachment.cc>

More information about the llvm-dev mailing list