Skip to content

Commit

Permalink
Merge branch 'list-registered-targets' into 'master'
Browse files Browse the repository at this point in the history
List registered targets

See merge request lfortran/lfortran!1349
  • Loading branch information
certik committed Sep 10, 2021
2 parents 22ebdd5 + 71268f6 commit af48ff2
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 1 deletion.
32 changes: 32 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,41 @@ find_package(StaticZLIB REQUIRED)

# LLVM
set(WITH_LLVM no CACHE BOOL "Build with LLVM support")
set(WITH_TARGET_AARCH64 no CACHE BOOL "Enable target AARCH64")
set(WITH_TARGET_X86 no CACHE BOOL "Enable target X86")
if (WITH_LLVM)
set(LFORTRAN_LLVM_COMPONENTS core support mcjit orcjit native asmparser asmprinter)
find_package(LLVM REQUIRED)
message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")

# Always enable the native target
if ("${LLVM_NATIVE_ARCH}" STREQUAL "AArch64")
set(WITH_TARGET_AARCH64 yes)
endif()

if ("${LLVM_NATIVE_ARCH}" STREQUAL "X86")
set(WITH_TARGET_X86 yes)
endif()

if (WITH_TARGET_AARCH64)
if (NOT ("${LLVM_TARGETS_TO_BUILD}" MATCHES "AArch64"))
message(FATAL_ERROR "The selected LLVM library doesn't have support for AArch64 targets")
endif()

list(APPEND LFORTRAN_LLVM_COMPONENTS aarch64info aarch64utils aarch64desc aarch64asmparser aarch64codegen aarch64disassembler)
add_definitions("-DHAVE_TARGET_AARCH64=1")
endif()

if (WITH_TARGET_X86)
if (NOT ("${LLVM_TARGETS_TO_BUILD}" MATCHES "X86"))
message(FATAL_ERROR "The selected LLVM library doesn't have support for X86 targets")
endif()

list(APPEND LFORTRAN_LLVM_COMPONENTS x86info x86desc x86codegen x86asmparser x86disassembler)
add_definitions("-DHAVE_TARGET_X86=1")
endif()

llvm_map_components_to_libnames(llvm_libs ${LFORTRAN_LLVM_COMPONENTS})
unset(LFORTRAN_LLVM_COMPONENTS)

Expand Down Expand Up @@ -235,6 +265,8 @@ message("WITH_JSON: ${WITH_JSON}")
message("WITH_FMT: ${WITH_FMT}")
message("WITH_LFORTRAN_BINARY_MODFILES: ${WITH_LFORTRAN_BINARY_MODFILES}")
message("WITH_RUNTIME_LIBRARY: ${WITH_RUNTIME_LIBRARY}")
message("WITH_TARGET_AARCH64: ${WITH_TARGET_AARCH64}")
message("WITH_TARGET_X86: ${WITH_TARGET_X86}")


add_subdirectory(src)
15 changes: 15 additions & 0 deletions src/bin/lfortran.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1109,6 +1109,7 @@ int main(int argc, char *argv[])
std::string arg_backend = "llvm";
std::string arg_kernel_f;
std::string arg_target = "";
bool print_targets = false;

std::string arg_fmt_file;
int arg_fmt_indent = 4;
Expand Down Expand Up @@ -1162,6 +1163,7 @@ int main(int argc, char *argv[])
app.add_option("--backend", arg_backend, "Select a backend (llvm, cpp, x86)")->capture_default_str();
app.add_flag("--openmp", openmp, "Enable openmp");
app.add_option("--target", arg_target, "Generate code for the given target")->capture_default_str();
app.add_flag("--print-targets", print_targets, "Print the registered targets");

/*
* Subcommands:
Expand Down Expand Up @@ -1207,9 +1209,22 @@ int main(int argc, char *argv[])
case (LFortran::Platform::Windows) : std::cout << "Windows"; break;
}
std::cout << std::endl;
#ifdef HAVE_LFORTRAN_LLVM
std::cout << "Default target: " << LFortran::LLVMEvaluator::get_default_target_triple() << std::endl;
#endif
return 0;
}

if (print_targets) {
#ifdef HAVE_LFORTRAN_LLVM
LFortran::LLVMEvaluator::print_targets();
return 0;
#else
std::cerr << "The --print-targets option requires the LLVM backend to be enabled. Recompile with `WITH_LLVM=yes`." << std::endl;
return 1;
#endif
}

if (fmt) {
return format(arg_fmt_file, arg_fmt_inplace, !arg_fmt_no_color,
arg_fmt_indent, arg_fmt_indent_unit, arg_fmt_fixed_form);
Expand Down
34 changes: 33 additions & 1 deletion src/lfortran/codegen/evaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
#include <llvm/ADT/StringRef.h>
#include <llvm/Target/TargetOptions.h>
#include <llvm/Support/TargetRegistry.h>

#include <llvm/Support/Host.h>
#include <lfortran/codegen/KaleidoscopeJIT.h>

#include <lfortran/codegen/evaluator.h>
Expand Down Expand Up @@ -112,6 +112,21 @@ LLVMEvaluator::LLVMEvaluator(const std::string &t)
llvm::InitializeNativeTargetAsmPrinter();
llvm::InitializeNativeTargetAsmParser();

#ifdef HAVE_TARGET_AARCH64
LLVMInitializeAArch64Target();
LLVMInitializeAArch64TargetInfo();
LLVMInitializeAArch64TargetMC();
LLVMInitializeAArch64AsmPrinter();
LLVMInitializeAArch64AsmParser();
#endif
#ifdef HAVE_TARGET_X86
LLVMInitializeX86Target();
LLVMInitializeX86TargetInfo();
LLVMInitializeX86TargetMC();
LLVMInitializeX86AsmPrinter();
LLVMInitializeX86AsmParser();
#endif

context = std::make_unique<llvm::LLVMContext>();

if (t != "")
Expand Down Expand Up @@ -298,5 +313,22 @@ llvm::LLVMContext &LLVMEvaluator::get_context()
return *context;
}

void LLVMEvaluator::print_targets()
{
llvm::InitializeNativeTarget();
#ifdef HAVE_TARGET_AARCH64
LLVMInitializeAArch64TargetInfo();
#endif
#ifdef HAVE_TARGET_X86
LLVMInitializeX86TargetInfo();
#endif
llvm::raw_ostream &os = llvm::outs();
llvm::TargetRegistry::printRegisteredTargetsForVersion(os);
}

std::string LLVMEvaluator::get_default_target_triple()
{
return llvm::sys::getDefaultTargetTriple();
}

} // namespace LFortran
2 changes: 2 additions & 0 deletions src/lfortran/codegen/evaluator.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ class LLVMEvaluator
static std::string module_to_string(llvm::Module &m);
static void print_version_message();
llvm::LLVMContext &get_context();
static void print_targets();
static std::string get_default_target_triple();
};


Expand Down

0 comments on commit af48ff2

Please sign in to comment.