Without something like the patch below, gallivm doesn't work on my
PowerBook; ParseBitcodeFile() complains that the data isn't terminated
by a 0 byte, or, if only the size passed to MemoryBuffer::getMemBuffer
is decreased by 1, that its size doesn't match some alignment or
whatever requirement. I suspect it only works on other setups because
the first byte in memory after the bitcode array happens to be 0.

Note that gallivmsoabuiltins.cpp doesn't seem to be in Git (should it
be?) and needs to be re-generated after this change. Also, I don't seem
to be exercising gallivm_builtins.cpp and friends, so I can't be sure
that path really needs the same treatment. FWIW though it already has
the buffer size decreased by 1.


diff --git a/src/gallium/auxiliary/gallivm/Makefile 
b/src/gallium/auxiliary/gallivm/Makefile
index c3f7bfb..5a96d94 100644
--- a/src/gallium/auxiliary/gallivm/Makefile
+++ b/src/gallium/auxiliary/gallivm/Makefile
@@ -66,12 +66,12 @@ depend: $(C_SOURCES) $(CPP_SOURCES) $(ASM_SOURCES) 
$(INC_SOURCES)
 
 gallivm_builtins.cpp: llvm_builtins.c
        clang --emit-llvm < $< |llvm-as|opt -std-compile-opts > temp1.bin
-       (echo "static const unsigned char llvm_builtins_data[] = {"; od -txC 
temp1.bin | sed -e "s/^[0-9]*//" -e s"/ \([0-9a-f][0-9a-f]\)/0x\1,/g" -e"\$$d" 
| sed -e"\$$s/,$$/};/") >$@
+       (echo "static const unsigned char llvm_builtins_data[] = {"; od -txC 
temp1.bin | sed -e "s/^[0-9]*//" -e s"/ \([0-9a-f][0-9a-f]\)/0x\1,/g" -e"\$$d" 
| sed -e"\$$s/,$$/,0x00};/") >$@
        rm temp1.bin
 
 gallivmsoabuiltins.cpp: soabuiltins.c
        clang --emit-llvm < $< |llvm-as|opt -std-compile-opts > temp2.bin
-       (echo "static const unsigned char soabuiltins_data[] = {"; od -txC 
temp2.bin | sed -e "s/^[0-9]*//" -e s"/ \([0-9a-f][0-9a-f]\)/0x\1,/g" -e"\$$d" 
| sed -e"\$$s/,$$/};/") >$@
+       (echo "static const unsigned char soabuiltins_data[] = {"; od -txC 
temp2.bin | sed -e "s/^[0-9]*//" -e s"/ \([0-9a-f][0-9a-f]\)/0x\1,/g" -e"\$$d" 
| sed -e"\$$s/,$$/,0x00};/") >$@
        rm temp2.bin
 
 # Emacs tags
diff --git a/src/gallium/auxiliary/gallivm/gallivm_builtins.cpp 
b/src/gallium/auxiliary/gallivm/gallivm_builtins.cpp
index fcc5c05..634bac0 100644
--- a/src/gallium/auxiliary/gallivm/gallivm_builtins.cpp
+++ b/src/gallium/auxiliary/gallivm/gallivm_builtins.cpp
@@ -137,4 +137,4 @@ static const unsigned char llvm_builtins_data[] = {
 
0x58,0x85,0x05,0x14,0xbe,0x34,0x45,0xb5,0x21,0x10,0x82,0x23,0x15,0x46,0x30,0x2c,
 
0xc8,0x64,0x02,0x06,0xf0,0x3c,0x91,0x73,0x19,0x00,0xe1,0x4b,0x53,0x64,0x0a,0x84,
 
0x84,0x34,0x85,0x25,0x0c,0x92,0x20,0x59,0xc1,0x20,0x30,0x8f,0x2d,0x10,0x95,0x84,
-0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
+0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/src/gallium/auxiliary/gallivm/instructionssoa.cpp 
b/src/gallium/auxiliary/gallivm/instructionssoa.cpp
index f93a31d..925e948 100644
--- a/src/gallium/auxiliary/gallivm/instructionssoa.cpp
+++ b/src/gallium/auxiliary/gallivm/instructionssoa.cpp
@@ -209,7 +209,7 @@ void InstructionsSoa::createBuiltins()
    std::string ErrMsg;
    MemoryBuffer *buffer = MemoryBuffer::getMemBuffer(
       (const char*)&soabuiltins_data[0],
-      (const char*)&soabuiltins_data[Elements(soabuiltins_data)]);
+      (const char*)&soabuiltins_data[Elements(soabuiltins_data) - 1]);
    m_builtins = ParseBitcodeFile(buffer, &ErrMsg);
    std::cout<<"Builtins created at "<<m_builtins<<" ("<<ErrMsg<<")"<<std::endl;
    assert(m_builtins);


-- 
Earthling Michel Dänzer           |                http://www.vmware.com
Libre software enthusiast         |          Debian, X and DRI developer

------------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It is the best place to buy or sell services for
just about anything Open Source.
http://p.sf.net/sfu/Xq1LFB
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to