Application of the old Mac-patch (no compilation yet)

--HG--
branch : bgschaidMac
This commit is contained in:
Bernhard F.W. Gschaider 2010-10-02 22:52:03 +02:00
parent 871948d1aa
commit 050ffaab9d
6 changed files with 155 additions and 2 deletions

30
bin/addr2line4Mac.py Executable file
View file

@ -0,0 +1,30 @@
#! /usr/bin/python
import sys
filename=sys.argv[1]
address=sys.argv[2]
import re
import subprocess
p = subprocess.Popen("gdb -batch -x /dev/stdin",
shell=True,
bufsize=0,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
close_fds=True)
(child_stdin, child_stdout) = (p.stdin, p.stdout)
child_stdin.write("set sharedlibrary preload-libraries no\n")
child_stdin.write("file "+filename+"\n")
child_stdin.write("info line *"+address+"\n")
result=child_stdout.readline()
answer="??:0"
match=re.compile('Line (.+) of "(.+)" starts at').match(result)
if match:
answer=match.group(2)+":"+match.group(1)
print answer,
sys.exit(255)

View file

@ -18,6 +18,7 @@ FoamFile
Documentation Documentation
{ {
// for Macs: docBrowser "open %f";
docBrowser "kde-open %f"; docBrowser "kde-open %f";
doxyDocDirs doxyDocDirs
( (

View file

@ -47,6 +47,10 @@ _foamAddLib()
while [ $# -ge 1 ] while [ $# -ge 1 ]
do do
export LD_LIBRARY_PATH=$1:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=$1:$LD_LIBRARY_PATH
if [ "$WM_ARCH_BASE" == "darwin" ]
then
export DYLD_LIBRARY_PATH=$1:$DYLD_LIBRARY_PATH
fi
shift shift
done done
} }

View file

@ -56,11 +56,22 @@ string pOpen(const string &cmd, label line=0)
for (label cnt = 0; cnt <= line; cnt++) for (label cnt = 0; cnt <= line; cnt++)
{ {
char buffer[MAX]; char buffer[MAX];
char* s = fgets(buffer, MAX-1, cmdPipe); char* s = fgets(buffer, MAX-1, cmdPipe);
if (s == NULL) if (s == NULL)
{ {
#ifdef darwin
// workaround for the Python-Script
for(int i=0;i<MAX;i++) {
if(buffer[i]=='\n') {
buffer[i]='\0';
}
}
return buffer;
#else
return ""; return "";
#endif
} }
if (cnt == line) if (cnt == line)
@ -123,7 +134,8 @@ void printSourceFileAndLine
#ifndef darwin #ifndef darwin
"addr2line -f --demangle=auto --exe " "addr2line -f --demangle=auto --exe "
#else #else
"gaddr2line -f --inline --demangle=auto --exe " // "gaddr2line -f --inline --demangle=auto --exe "
"addr2line4Mac.py "
#endif #endif
+ filename + filename
+ " " + " "
@ -150,6 +162,102 @@ void printSourceFileAndLine
} }
} }
#ifdef darwin
// Trying to emulate the original backtrace and backtrace_symbol from the glibc
// After an idea published by Rush Manbert at http://lists.apple.com/archives/xcode-users/2006/Apr/msg00528.html
template<int level>
void *getStackAddress()
{
const unsigned int stackLevel=level;
return (
__builtin_frame_address(level)
? __builtin_return_address(stackLevel)
: (void *)0
);
};
#define GET_STACK_ADDRESS(lvl) \
case lvl: {return getStackAddress<lvl>(); break; }
// please don't laugh. For some reason this is necessary (the compiler won't accept it otherwise)
void *getStackAddress(int level)
{
switch(level) {
GET_STACK_ADDRESS(0);
GET_STACK_ADDRESS(1);
GET_STACK_ADDRESS(2);
GET_STACK_ADDRESS(3);
GET_STACK_ADDRESS(4);
GET_STACK_ADDRESS(5);
GET_STACK_ADDRESS(6);
GET_STACK_ADDRESS(7);
GET_STACK_ADDRESS(8);
GET_STACK_ADDRESS(9);
GET_STACK_ADDRESS(10);
GET_STACK_ADDRESS(11);
GET_STACK_ADDRESS(12);
GET_STACK_ADDRESS(13);
GET_STACK_ADDRESS(14);
GET_STACK_ADDRESS(15);
GET_STACK_ADDRESS(16);
GET_STACK_ADDRESS(17);
GET_STACK_ADDRESS(18);
GET_STACK_ADDRESS(19);
GET_STACK_ADDRESS(20);
GET_STACK_ADDRESS(21);
default:
return (void *)0;
break;
}
}
unsigned backtrace(void **bt, unsigned maxAddrs)
{
unsigned valid=0;
bool ok=true;
for(int level=0;level<maxAddrs;level++) {
if(ok) {
bt[level]=getStackAddress(level);
if(bt[level]!=(void *)0) {
valid=level;
} else {
ok=false;
}
} else {
bt[level]=(void *)0;
}
}
return valid;
}
// This function is a potential memory leak. But I don't care because the program is terminating anyway
char **backtrace_symbols(void **bt,unsigned nr)
{
char **strings=(char **)malloc(sizeof(char *)*nr);
for(unsigned i=0;i<nr;i++) {
Dl_info info;
int result=dladdr(bt[i],&info);
char tmp[1000];
#ifdef darwinIntel64
sprintf(tmp,"%s(%s+%p) [%p]",info.dli_fname,info.dli_sname,(void *)((unsigned long)bt[i]-(unsigned long)info.dli_saddr),bt[i]);
#else
sprintf(tmp,"%s(%s+%p) [%p]",info.dli_fname,info.dli_sname,(void *)((unsigned int)bt[i]-(unsigned int)info.dli_saddr),bt[i]);
#endif
strings[i]=(char *)malloc(strlen(tmp)+1);
strcpy(strings[i],tmp);
}
return strings;
}
#endif
void getSymbolForRaw void getSymbolForRaw
( (
@ -166,7 +274,8 @@ void getSymbolForRaw
#ifndef darwin #ifndef darwin
"addr2line -f --demangle=auto --exe " "addr2line -f --demangle=auto --exe "
#else #else
"gaddr2line -f --inline --demangle=auto --exe " // "gaddr2line -f --inline --demangle=auto --exe "
"addr2line4Mac.py "
#endif #endif
+ filename + filename
+ " " + " "

View file

@ -269,6 +269,8 @@ Foam::label Foam::autoRefineDriver::surfaceOnlyRefine
const PtrList<featureEdgeMesh> dummyFeatures; const PtrList<featureEdgeMesh> dummyFeatures;
PtrList<featureEdgeMesh> dummy(0);
labelList candidateCells labelList candidateCells
( (
meshRefiner_.refineCandidates meshRefiner_.refineCandidates
@ -435,6 +437,8 @@ Foam::label Foam::autoRefineDriver::shellRefine
const PtrList<featureEdgeMesh> dummyFeatures; const PtrList<featureEdgeMesh> dummyFeatures;
PtrList<featureEdgeMesh> dummy(0);
labelList candidateCells labelList candidateCells
( (
meshRefiner_.refineCandidates meshRefiner_.refineCandidates

View file

@ -173,8 +173,13 @@ libso: $(LIB).$(SO)
$(LIB).$(SO): $(OBJECTS) $(LIB).$(SO): $(OBJECTS)
@$(WM_SCRIPTS)/mkObjectDir $(LIB) @$(WM_SCRIPTS)/mkObjectDir $(LIB)
@rm -f so_locations @rm -f so_locations
ifeq ($(WM_ARCH_BASE),darwin)
@cd $(OBJECTS_DIR) ; \
$(LINKLIBSO) $(LOCAL_OBJECTS) -L$(LIB_WM_OPTIONS_DIR) $(LIB_LIBS) $(GLIB_LIBS) -install_name $(notdir $(LIB)).$(SO) -o $(LIB).$(SO)
else
@cd $(OBJECTS_DIR) ; \ @cd $(OBJECTS_DIR) ; \
$(LINKLIBSO) $(LOCAL_OBJECTS) -L$(LIB_WM_OPTIONS_DIR) $(LIB_LIBS) $(GLIB_LIBS) -o $(LIB).$(SO) $(LINKLIBSO) $(LOCAL_OBJECTS) -L$(LIB_WM_OPTIONS_DIR) $(LIB_LIBS) $(GLIB_LIBS) -o $(LIB).$(SO)
endif
lib: $(LIB).a lib: $(LIB).a
@echo \'$(LIB).a\' is up to date. @echo \'$(LIB).a\' is up to date.