Add llvm-dsymutil build script + re-add 7e9f85

This finally makes proper debugging possible
This commit is contained in:
Thomas Pöchtrager 2015-08-31 21:02:38 +02:00
parent 4debfb6b45
commit 08414886fb
13 changed files with 231 additions and 10 deletions

View File

@ -14,6 +14,8 @@ added:
o32-clang++-stdc++ --> uses the SDK's libstdc++ o32-clang++-stdc++ --> uses the SDK's libstdc++
o32-clang++-gstdc++ --> uses gcc's (build_gcc.sh) libstdc++ o32-clang++-gstdc++ --> uses gcc's (build_gcc.sh) libstdc++
* unit tests (wrapper) * unit tests (wrapper)
* llvm-dsymutil build script
* dsymutil is now wrapped to llvm-dsymutil (LLVM >= 3.8 only)
/****************************** v0.10 ********************************/ /****************************** v0.10 ********************************/

View File

@ -1,8 +1,8 @@
## COMPILER-RT ## ## COMPILER-RT ##
### WHAT IS COMPILER-RT: ### ### WHAT IS COMPILER-RT? ###
Please see http://compiler-rt.llvm.org/. Please see http://compiler-rt.llvm.org.
### INSTALLATION: ### ### INSTALLATION: ###
@ -24,6 +24,8 @@ You do not need to do anything, clang's doing the job for you.
However, `-fsanitize=address` is a bit annoying because the address sanitizer library is linked However, `-fsanitize=address` is a bit annoying because the address sanitizer library is linked
dynamically, and thus requires you to copy the ASAN runtime library onto the target system. dynamically, and thus requires you to copy the ASAN runtime library onto the target system.
\[See [README.DEBUGGING](README.DEBUGGING.md) in how to get a backtrace with line numbers and symbol names]
The following example illustrates how to achieve this: The following example illustrates how to achieve this:
# Example source code. # Example source code.

22
README.DEBUGGING.md Normal file
View File

@ -0,0 +1,22 @@
### Requirements: ###
* llvm-dsymutil (>= 3.8)
* A Mac OS X system with lldb / gdb installed
### Setting up llvm-dsymutil: ###
First of all, you **really** need llvm-dsymutil from llvm 3.8 (trunk as of writing),
llvm 3.7 or earlier **is not** sufficient.
Run `./build_llvm_dsymutil.sh` to build and install llvm-dsymutil to target/bin.
`dsymutil` is a no-op if you do not have [osxcross-]llvm-dsymutil >= 3.8 in PATH.
### Debug Example: ###
* Build your application with `-g`
* [LTO only] Add `-Wl,-object_path_lto,lto.o` to the linker flags
* After linking run: `dsymutil binary`
* [Optional] Strip the binary: `x86_64-apple-darwinXX-strip binary`
* Copy the binary **and** the created `<binary>.dSYM` "folder" onto the target Mac OS X system
* Debug the binary as usual

37
build_llvm_dsymutil.sh Executable file
View File

@ -0,0 +1,37 @@
#!/usr/bin/env bash
pushd "${0%/*}" &>/dev/null
DESC="llvm-dsymutil"
source tools/tools.sh
eval $(tools/osxcross_conf.sh)
require git
require cmake
pushd $OSXCROSS_BUILD_DIR &>/dev/null
if [ ! -e llvm-dsymutil/.clone_complete ]; then
rm -rf llvm-dsymutil
# Vanilla llvm-dsymutil with a few patches on top for OSXCross
git clone https://github.com/tpoechtrager/llvm-dsymutil.git --depth 1
fi
pushd llvm-dsymutil &>/dev/null
git clean -fdx
touch .clone_complete
git pull
mkdir build
pushd build &>/dev/null
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_TARGETS_TO_BUILD="X86;ARM;AArch64" \
-DLLVM_ENABLE_ASSERTIONS=Off
$MAKE -f tools/dsymutil/Makefile -j$JOBS
cp bin/llvm-dsymutil $OSXCROSS_TARGET_DIR/bin/osxcross-llvm-dsymutil
echo "installed llvm-dsymutil to $OSXCROSS_TARGET_DIR/bin/osxcross-llvm-dsymutil"

4
tools/tools.sh Executable file → Normal file
View File

@ -67,13 +67,15 @@ if [[ $SCRIPT != *wrapper/build.sh ]]; then
$SCRIPT != "mount_xcode_image.sh" -a \ $SCRIPT != "mount_xcode_image.sh" -a \
$SCRIPT != "gen_sdk_package_darling_dmg.sh" -a \ $SCRIPT != "gen_sdk_package_darling_dmg.sh" -a \
$SCRIPT != "gen_sdk_package_p7zip.sh" ]; then $SCRIPT != "gen_sdk_package_p7zip.sh" ]; then
eval $(tools/osxcross_conf.sh) res=$(tools/osxcross_conf.sh)
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo -n "you need to complete ./build.sh first, before you can start " echo -n "you need to complete ./build.sh first, before you can start "
echo "building $DESC" echo "building $DESC"
exit 1 exit 1
fi fi
eval "$res"
fi fi
fi fi

View File

@ -57,7 +57,8 @@ SRCS= \
programs/osxcross-man.cpp \ programs/osxcross-man.cpp \
programs/sw_vers.cpp \ programs/sw_vers.cpp \
programs/pkg-config.cpp \ programs/pkg-config.cpp \
programs/xcrun.cpp programs/xcrun.cpp \
programs/dsymutil.cpp
OBJS=$(subst .cpp,.o,$(SRCS)) OBJS=$(subst .cpp,.o,$(SRCS))

View File

@ -47,9 +47,10 @@
using namespace tools; using namespace tools;
using namespace target; using namespace target;
namespace {
int unittest = 0; int unittest = 0;
int debug = 0;
namespace {
void warnExtension(const char *extension) { void warnExtension(const char *extension) {
static bool noextwarnings = !!getenv("OSXCROSS_NO_EXTENSION_WARNINGS"); static bool noextwarnings = !!getenv("OSXCROSS_NO_EXTENSION_WARNINGS");
@ -441,7 +442,6 @@ int main(int argc, char **argv) {
auto b = new (bbuf) benchmark; auto b = new (bbuf) benchmark;
Target target; Target target;
char **cargs = nullptr; char **cargs = nullptr;
int debug = 0;
int rc = -1; int rc = -1;
if (char *p = getenv("OCDEBUG")) if (char *p = getenv("OCDEBUG"))

View File

@ -0,0 +1,108 @@
/***********************************************************************
* OSXCross Compiler Wrapper *
* Copyright (C) 2014, 2015 by Thomas Poechtrager *
* t.poechtrager@gmail.com *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the Free Software *
* Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***********************************************************************/
#include "proginc.h"
#ifndef _WIN32
#include <unistd.h>
#endif
using namespace tools;
namespace program {
int dsymutil(int argc, char **argv, Target &target) {
(void)argc;
std::string dsymutil;
char LLVMDsymutilVersionOutput[1024];
const char *LLVMDsymutilVersionStr;
LLVMVersion LLVMDsymutilVersion;
const std::string &ParentProcessName = getParentProcessName();
if (!debug && ParentProcessName.find("clang") == std::string::npos &&
ParentProcessName != "collect2" && ParentProcessName != "unknown")
debug = 1;
if (char *p = getenv("OSXCROSS_LLVM_DSYMUTIL")) {
dsymutil = p;
debug = 1;
} else {
if (!realPath("osxcross-llvm-dsymutil", dsymutil) &&
!realPath("llvm-dsymutil", dsymutil)) {
if (debug)
dbg << "dsymutil: cannot find [osxcross-]llvm-dsymutil in PATH"
<< dbg.endl();
return 0;
}
}
std::string command = dsymutil + " -version";
if (runcommand(command.c_str(), LLVMDsymutilVersionOutput,
sizeof(LLVMDsymutilVersionOutput)) == RUNCOMMAND_ERROR) {
if (debug)
dbg << "dsymutil: executing \"" << command << "\" failed"
<< dbg.endl();
return 0;
}
LLVMDsymutilVersionStr = strstr(LLVMDsymutilVersionOutput, "LLVM version ");
if (!LLVMDsymutilVersionStr) {
if (debug)
dbg << "dsymutil: unable to parse llvm-dsymutil version"
<< dbg.endl();
return 0;
}
LLVMDsymutilVersionStr += 13; // strlen("LLVM version ");
LLVMDsymutilVersion = parseLLVMVersion(LLVMDsymutilVersionStr);
constexpr LLVMVersion RequiredLLVMDsymutilVersion(3, 8);
if (LLVMDsymutilVersion < RequiredLLVMDsymutilVersion) {
if (debug)
dbg << "ignoring dsymutil invocation: '"
<< dsymutil << "' is too old ("
<< LLVMDsymutilVersion.Str() << " < "
<< RequiredLLVMDsymutilVersion.Str() << ")"
<< dbg.endl();
return 0;
}
std::stringstream lipo;
std::string triple;
lipo << target.execpath << PATHDIV
<< target.getDefaultTriple(triple) << "-lipo";
setenv("LIPO", lipo.str().c_str(), 1);
if (execvp(dsymutil.c_str(), argv))
err << "cannot execute '" << dsymutil << "'" << err.endl();
return 1;
}
} // namespace program

View File

@ -11,3 +11,6 @@
#include "tools.h" #include "tools.h"
#include "target.h" #include "target.h"
#include "progs.h" #include "progs.h"
extern int debug;
extern int unittest;

View File

@ -78,6 +78,7 @@ private:
int sw_vers(int argc, char **argv, target::Target &target); int sw_vers(int argc, char **argv, target::Target &target);
int xcrun(int argc, char **argv, Target &target); int xcrun(int argc, char **argv, Target &target);
int dsymutil(int argc, char **argv, target::Target &target);
namespace osxcross { namespace osxcross {
int version(); int version();
@ -93,7 +94,7 @@ static int dummy() { return 0; }
constexpr prog programs[] = { constexpr prog programs[] = {
{ "sw_vers", sw_vers }, { "sw_vers", sw_vers },
{ "xcrun", xcrun }, { "xcrun", xcrun },
{ "dsymutil", dummy }, { "dsymutil", dsymutil },
{ "osxcross", osxcross::version }, { "osxcross", osxcross::version },
{ "osxcross-env", osxcross::env }, { "osxcross-env", osxcross::env },
{ "osxcross-conf", osxcross::conf }, { "osxcross-conf", osxcross::conf },

View File

@ -28,6 +28,7 @@
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <cstdlib> #include <cstdlib>
#include <cstdio>
#include <cstring> #include <cstring>
#include <climits> #include <climits>
#include <cassert> #include <cassert>
@ -538,6 +539,36 @@ const char *getFileExtension(const char *file) {
return p; return p;
} }
//
// Shell Commands
//
size_t runcommand(const char *command, char *buf, size_t len) {
#define RETURN(v) \
do { \
if (p) \
pclose(p); \
return (v); \
} while (0)
if (!len)
return RUNCOMMAND_ERROR;
FILE *p;
size_t outputlen;
if (!(p = popen(command, "r")))
RETURN(RUNCOMMAND_ERROR);
if (!(outputlen = fread(buf, sizeof(char), len - 1, p)))
RETURN(RUNCOMMAND_ERROR);
buf[outputlen] = '\0';
RETURN(outputlen);
#undef RETURN
}
// //
// Time // Time
// //

View File

@ -213,6 +213,14 @@ template <typename T, size_t size = 0> struct ArgParser {
} }
}; };
//
// Shell Commands
//
constexpr size_t RUNCOMMAND_ERROR = -1;
size_t runcommand(const char *command, char *buf, size_t len);
// //
// Time // Time
// //
@ -325,10 +333,13 @@ static_assert(OSVersion(10, 6) != OSVersion(10, 5), "");
OSVersion parseOSVersion(const char *OSVer); OSVersion parseOSVersion(const char *OSVer);
typedef OSVersion GCCVersion; typedef OSVersion GCCVersion;
#define parseGCCVersion parseOSVersion static const auto &parseGCCVersion = parseOSVersion;
typedef OSVersion ClangVersion; typedef OSVersion ClangVersion;
#define parseClangVersion parseOSVersion static const auto &parseClangVersion = parseOSVersion;
typedef OSVersion LLVMVersion;
static const auto &parseLLVMVersion = parseOSVersion;
// //
// OS Compat // OS Compat

View File

@ -46,6 +46,7 @@
<File Name="programs/osxcross-cmp.cpp"/> <File Name="programs/osxcross-cmp.cpp"/>
<File Name="programs/xcrun.cpp"/> <File Name="programs/xcrun.cpp"/>
<File Name="programs/osxcross-man.cpp"/> <File Name="programs/osxcross-man.cpp"/>
<File Name="programs/dsymutil.cpp"/>
</VirtualDirectory> </VirtualDirectory>
<File Name="Makefile"/> <File Name="Makefile"/>
<File Name="build.sh"/> <File Name="build.sh"/>