From a71b028a0f29b82b187e789889782b55dfc044d9 Mon Sep 17 00:00:00 2001 From: Tomas Lindquist Olsen Date: Sun, 1 Mar 2009 22:27:03 +0100 Subject: [PATCH] Implemented basic -m32 and -m64 options. --- CMakeLists.txt | 8 ++++++++ gen/cl_options.cpp | 11 +++++++---- gen/cl_options.h | 2 ++ gen/main.cpp | 18 +++++++++++++++++- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index eb071f1f..47470db9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,6 +23,11 @@ execute_process( OUTPUT_VARIABLE HOST_TARGET OUTPUT_STRIP_TRAILING_WHITESPACE ) +execute_process( + COMMAND /bin/sh ${PROJECT_SOURCE_DIR}/find-alt-triple.sh ${HOST_TARGET} + OUTPUT_VARIABLE HOST_ALT_TARGET + OUTPUT_STRIP_TRAILING_WHITESPACE +) execute_process( COMMAND ${PERL_EXECUTABLE} ${LLVM_CONFIG} --cxxflags OUTPUT_VARIABLE LLVM_CXXFLAGS @@ -105,6 +110,7 @@ set(LDC_GENERATED # idgen and impcnvgen done set(DEFAULT_TARGET ${HOST_TARGET} CACHE STRING "default target") +set(DEFAULT_ALT_TARGET ${HOST_ALT_TARGET} CACHE STRING "default alt target") include_directories(. ${DMDFE_PATH} ${PROJECT_BINARY_DIR}/${DMDFE_PATH} ${LLVM_INSTDIR}/include) @@ -154,8 +160,10 @@ if(CMAKE_MINOR_VERSION LESS 6) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin CACHE PATH "output dir for built executables") set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib CACHE PATH "output dir for built libraries") add_definitions(-DDEFAULT_TARGET_TRIPLE=\\"${DEFAULT_TARGET}\\") + add_definitions(-DDEFAULT_ALT_TARGET_TRIPLE=\\"${DEFAULT_ALT_TARGET}\\") else(CMAKE_MINOR_VERSION LESS 6) add_definitions(-DDEFAULT_TARGET_TRIPLE="${DEFAULT_TARGET}") + add_definitions(-DDEFAULT_ALT_TARGET_TRIPLE="${DEFAULT_ALT_TARGET}") endif(CMAKE_MINOR_VERSION LESS 6) add_executable(${LDC_EXE} ${LDC_SOURCE_FILES}) diff --git a/gen/cl_options.cpp b/gen/cl_options.cpp index bb8963c9..c8870328 100644 --- a/gen/cl_options.cpp +++ b/gen/cl_options.cpp @@ -225,10 +225,13 @@ cl::opt > mArch("march", cl::desc("Architecture to generate code for:")); -static cl::alias m("m", - cl::desc("Alias for '-march' for backwards compatibility"), - cl::Prefix, - cl::aliasopt(mArch)); +cl::opt m32bits("m32", + cl::desc("32 bit target"), + cl::ZeroOrMore); + +cl::opt m64bits("m64", + cl::desc("64 bit target"), + cl::ZeroOrMore); cl::opt mCPU("mcpu", cl::desc("Target a specific cpu type (-mcpu=help for details)"), diff --git a/gen/cl_options.h b/gen/cl_options.h index 311fe13b..32dcbeb0 100644 --- a/gen/cl_options.h +++ b/gen/cl_options.h @@ -38,6 +38,8 @@ namespace opts { extern cl::opt > mArch; + extern cl::opt m32bits; + extern cl::opt m64bits; extern cl::opt mCPU; extern cl::list mAttrs; extern cl::opt mTargetTriple; diff --git a/gen/main.cpp b/gen/main.cpp index 9023e5a3..dbdc4c9e 100644 --- a/gen/main.cpp +++ b/gen/main.cpp @@ -337,8 +337,24 @@ int main(int argc, char** argv) } // create a proper target + + // check -m32/64 sanity + if (m32bits && m64bits) + error("cannot use both -m32 and -m64 options"); + else if ((m32bits || m64bits) && (mArch != 0 || !mTargetTriple.empty())) + error("-m32 and -m64 switches cannot be used together with -march and -mtriple switches"); + if (global.errors) + fatal(); + llvm::Module mod("dummy"); + // override triple if needed + const char* defaultTriple = DEFAULT_TARGET_TRIPLE; + if ((sizeof(void*) == 4 && m64bits) || (sizeof(void*) == 8 && m32bits)) + { + defaultTriple = DEFAULT_ALT_TARGET_TRIPLE; + } + // did the user override the target triple? if (mTargetTriple.empty()) { @@ -347,7 +363,7 @@ int main(int argc, char** argv) error("you must specify a target triple as well with -mtriple when using the -march option"); fatal(); } - global.params.targetTriple = DEFAULT_TARGET_TRIPLE; + global.params.targetTriple = defaultTriple; } else {