# HG changeset patch # User Christian Kamm # Date 1246042943 -7200 # Node ID 26d061e61b022cc77656ce57b7326cb9a186c810 # Parent a7a9e461512a8648f6fe82a6ac7912f140269717 Initialize LLVM target and asmprinter for the native and extra targets. Uses some CMake hackery to get the native LLVM target name, since it only provides a conveniance function for initializing the native target and not the native asmprinter. diff -r a7a9e461512a -r 26d061e61b02 CMakeLists.txt --- a/CMakeLists.txt Fri Jun 26 21:00:12 2009 +0200 +++ b/CMakeLists.txt Fri Jun 26 21:02:23 2009 +0200 @@ -54,13 +54,6 @@ OUTPUT_STRIP_TRAILING_WHITESPACE ) -set(EXTRA_LLVM_MODULES "" CACHE STRING "extra llvm components to link in (see llvm-config --components)") -execute_process( - COMMAND ${PERL_EXECUTABLE} ${LLVM_CONFIG} --libfiles bitwriter linker ipo instrumentation backend ${EXTRA_LLVM_MODULES} - OUTPUT_VARIABLE LLVM_LIBS - OUTPUT_STRIP_TRAILING_WHITESPACE -) - set(D_VERSION 1 CACHE STRING "D language version") set(PROGRAM_PREFIX CACHE STRING "prepended to ldc binary name") set(PROGRAM_SUFFIX CACHE STRING "appended to ldc binary name") @@ -135,6 +128,29 @@ include_directories(. ${DMDFE_PATH} ${DMDFE_PATH}/root ${PROJECT_BINARY_DIR}/${DMDFE_PATH} ${PROJECT_BINARY_DIR} ${LLVM_INSTDIR}/include) +set(EXTRA_LLVM_MODULES "" CACHE STRING "extra llvm components to link in (see llvm-config --components)") +separate_arguments(EXTRA_LLVM_MODULES) +execute_process( + COMMAND ${PERL_EXECUTABLE} ${LLVM_CONFIG} --libfiles bitwriter linker ipo instrumentation backend ${EXTRA_LLVM_MODULES} + OUTPUT_VARIABLE LLVM_LIBS + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +# build a define that contains all LLVM targets required and is usable for +# preprocessor code generation. start with the native target. +file(STRINGS ${LLVM_INSTDIR}/include/llvm/Config/config.h LLVM_NATIVE_ARCH REGEX "^#define LLVM_NATIVE_ARCH") +string(REGEX REPLACE "^#define LLVM_NATIVE_ARCH (.*)Target$" "\\1" LLVM_NATIVE_ARCH ${LLVM_NATIVE_ARCH}) +set(LLVM_MODULES_DEFINE "LLVM_TARGET(${LLVM_NATIVE_ARCH})") +# chain the extra target list to the define +foreach(EXTRA_TARGET ${EXTRA_LLVM_MODULES}) + set(LLVM_MODULES_DEFINE "${LLVM_MODULES_DEFINE} LLVM_TARGET(${EXTRA_TARGET})") +endforeach(EXTRA_TARGET) +set_source_files_properties( + ${PROJECT_SOURCE_DIR}/gen/main.cpp PROPERTIES + COMPILE_DEFINITIONS LDC_TARGETS=${LLVM_MODULES_DEFINE} +) + + file(GLOB FE_SRC ${DMDFE_PATH}/*.c) file(GLOB FE_SRC_ROOT ${DMDFE_PATH}/root/*.c) file(GLOB_RECURSE GEN_SRC gen/*.cpp) diff -r a7a9e461512a -r 26d061e61b02 gen/main.cpp --- a/gen/main.cpp Fri Jun 26 21:00:12 2009 +0200 +++ b/gen/main.cpp Fri Jun 26 21:02:23 2009 +0200 @@ -4,6 +4,7 @@ // which uses the llvm license #include "gen/llvm.h" +#include "gen/llvm-version.h" #include "llvm/LinkAllVMCore.h" #include "llvm/Linker.h" #include "llvm/System/Signals.h" @@ -11,6 +12,9 @@ #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" #include "llvm/Target/TargetMachineRegistry.h" +#if LLVM_REV >= 73610 +#include "llvm/Target/TargetSelect.h" +#endif #include #include @@ -421,8 +425,17 @@ mod.setTargetTriple(global.params.targetTriple); - // Allocate target machine. First, check whether the user has - // explicitly specified an architecture to compile for. + // Allocate target machine. + + // first initialize llvm +#if LLVM_REV >= 73610 +#define LLVM_TARGET(A) LLVMInitialize##A##Target(); LLVMInitialize##A##AsmPrinter(); +// this is defined to be LLVM_TARGET(target name 1) LLVM_TARGET(target name 2) ... +LDC_TARGETS +#undef LLVM_TARGET +#endif + + // Check whether the user has explicitly specified an architecture to compile for. if (mArch == 0) { std::string Err;