Skip to content
This repository has been archived by the owner on Jan 12, 2024. It is now read-only.

Creating LLVM runtime IR #844

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/Qir/Runtime/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ project(qirruntime)
# specify the C++ standard, compiler and other tools
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")

include(${CMAKE_SOURCE_DIR}/cmake/LlvmIr.cmake)

# Always use available Spectre mitigations where available
if (NOT APPLE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mspeculative-load-hardening -mretpoline")
Expand All @@ -32,5 +33,7 @@ set(common_includes "${PROJECT_SOURCE_DIR}/../Common/Include")

include(qir_cmake_include)


add_subdirectory(lib)
add_subdirectory(unittests)

68 changes: 68 additions & 0 deletions src/Qir/Runtime/cmake/LlvmIr.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
function (microsoft_add_ir_library)
set(prefix "IR")

set(flags "")
set(singleValues TARGET OUTPUT)
set(multiValues SOURCES INCLUDES)

include(CMakeParseArguments)
cmake_parse_arguments(${prefix}
"${flags}"
"${singleValues}"
"${multiValues}"
${ARGN})

list(LENGTH IR_UNPARSED_ARGUMENTS SIZE)
list(GET IR_UNPARSED_ARGUMENTS 0 IR_TARGET)
if(SIZE GREATER 1)
list(GET IR_UNPARSED_ARGUMENTS 1 IR_OUTPUT)
endif()


set(include_flags "")
foreach(flag IN ITEMS ${IR_INCLUDES})
set(include_flags "${include_flags}" "-I${flag}")
endforeach()

set(output_files "")
foreach(source IN ITEMS ${IR_SOURCES})
set(outputfile "${CMAKE_CURRENT_BINARY_DIR}/${source}.ll" )
set(inputfile "${CMAKE_CURRENT_SOURCE_DIR}/${source}" )

add_custom_command(OUTPUT ${outputfile}
COMMAND clang++ # TODO: Use CMAKE_CXX_COMPILER
ARGS ${include_flags} ${CMAKE_CXX_FLAGS} "-S" "-emit-llvm" "-fPIC" "-o" ${outputfile} ${inputfile}
)

set(output_files ${output_files} ${outputfile} )
endforeach()

add_custom_target(${IR_TARGET}
DEPENDS ${output_files})

SET(${IR_OUTPUT} "${output_files}" CACHE INTERNAL ${IR_OUTPUT})
endfunction ()


function (microsoft_link_ir)
set(prefix "LINK")

set(flags "")
set(singleValues TARGET OUTPUT)
set(multiValues DEPENDS SOURCES)
cmake_parse_arguments(${prefix}
"${flags}"
"${singleValues}"
"${multiValues}"
${ARGN})

add_custom_command(OUTPUT ${LINK_OUTPUT}
COMMAND llvm-link
ARGS "-S" "-o" ${LINK_OUTPUT} ${LINK_SOURCES}
DEPENDS ${LINK_DEPENDS}
COMMAND_EXPAND_LISTS)

add_custom_target(${LINK_TARGET}
DEPENDS ${LINK_OUTPUT})

endfunction()
26 changes: 26 additions & 0 deletions src/Qir/Runtime/lib/QIR/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ set(rt_sup_source_files

# Produce object lib we'll use to create a shared lib (so/dll) later on
add_library(qir-rt-support-obj OBJECT ${rt_sup_source_files})

target_source_from_qir(qir-rt-support-obj bridge-rt.ll)
target_include_directories(qir-rt-support-obj PUBLIC
${public_includes}
Expand All @@ -31,6 +32,14 @@ target_include_directories(qir-rt-support-obj PUBLIC
set_property(TARGET qir-rt-support-obj PROPERTY POSITION_INDEPENDENT_CODE ON)
target_compile_definitions(qir-rt-support-obj PRIVATE EXPORT_QIR_API)


#+++++++++++++++++++++++++++++++++++++
# qir-rt as LLVM IR
#+++++++++++++++++++++++++++++++++++++
microsoft_add_ir_library(qir-rt-support-obj-ir qir-rt-support-obj-ir-files SOURCES ${rt_sup_source_files} INCLUDES ${public_includes} ${common_includes})



#+++++++++++++++++++++++++++++++++++++
# qir-qis
#+++++++++++++++++++++++++++++++++++++
Expand All @@ -55,3 +64,20 @@ install(TARGETS Microsoft.Quantum.Qir.Runtime
LIBRARY DESTINATION "${CMAKE_BINARY_DIR}/bin"
ARCHIVE DESTINATION "${CMAKE_BINARY_DIR}/bin"
)


#+++++++++++++++++++++++++++++++++++++
# qir-rt combined LLVM IR
#+++++++++++++++++++++++++++++++++++++

microsoft_link_ir(
TARGET runtime-qir
OUTPUT "runtime.ll"
DEPENDS qir-rt-support-obj-ir
SOURCES ${qir-rt-support-obj-ir-files}
)