[llvm-commits] ExecutionEngine/2003-01-15-AlignmentTest.ll asserts on SPARC
Gabor Greif
gabor at mac.com
Thu Oct 11 03:52:10 PDT 2007
Hi all,
I get an ugly interpreter failure:
Test Run By ggreif on Thu Oct 11 12:41:31 2007
Native configuration is sparc-sun-solaris2.9
=== ExecutionEngine tests ===
Schedule of variations:
unix
Running target unix
Using /home/ggreif/share/dejagnu/baseboards/unix.exp as board description file for target.
Using /home/ggreif/share/dejagnu/config/unix.exp as generic interface file for target.
WARNING: Couldn't find tool config file for unix, using default.
Running /home/ggreif/llvm/test/ExecutionEngine/dg.exp ...
FAIL: /home/ggreif/llvm/test/ExecutionEngine/2003-01-15-AlignmentTest.ll
Failed with signal(SIGABRT) at line 2
while running: lli 2003-01-15-AlignmentTest.ll.tmp.bc > /dev/null
Assertion failed: Result.PointerVal != 0 && "Null pointer returned by malloc!", file Execution.cpp, line 761
=== ExecutionEngine Summary ===
# of expected passes 38
# of unexpected failures 1
make[1]: *** [check-local] Error 1
make[1]: Leaving directory `/home/ggreif/llvm/test'
make: *** [check] Error 2
The problem comes from allocating a zero sized array,
and actually I think malloc is allowed to return NULL
on a call to malloc(0):
ggreif at my [!187] cat /home/ggreif/llvm/test/ExecutionEngine/2003-01-15-AlignmentTest.ll
; RUN: llvm-upgrade %s | llvm-as -f -o %t.bc
; RUN: lli %t.bc > /dev/null
int %bar(sbyte* %X) {
%P = alloca double ; pointer should be 4 byte aligned!
%R = cast double* %P to int
%A = and int %R, 3
ret int %A
}
int %main() {
%SP = alloca sbyte
%X = add uint 0, 0
alloca sbyte, uint %X ; <<<<<<< Results in malloc(0) !!!!
call int %bar(sbyte* %SP)
ret int %0
}
Using this patch:
ggreif at my [!190] svn diff lib/ExecutionEngine/Interpreter/Execution.cpp
Index: lib/ExecutionEngine/Interpreter/Execution.cpp
===================================================================
--- lib/ExecutionEngine/Interpreter/Execution.cpp (revision 42860)
+++ lib/ExecutionEngine/Interpreter/Execution.cpp (working copy)
@@ -24,6 +24,7 @@
#include "llvm/Support/Debug.h"
#include "llvm/Support/MathExtras.h"
#include <cmath>
+#include <algorithm>
using namespace llvm;
STATISTIC(NumDynamicInsts, "Number of dynamic instructions executed");
@@ -747,7 +748,7 @@
unsigned TypeSize = (size_t)TD.getTypeSize(Ty);
- unsigned MemToAlloc = NumElements * TypeSize;
+ unsigned MemToAlloc = std::max(1U, NumElements * TypeSize);
// Allocate enough memory to hold the type...
void *Memory = malloc(MemToAlloc);
the problem goes away.
I am not sure whether this is an acceptable patch
or we should find a more performant one :-)
Cheers,
Gabor
More information about the llvm-commits
mailing list