diff --git a/src/QirRuntime/lib/QIR/CMakeLists.txt b/src/QirRuntime/lib/QIR/CMakeLists.txt index 8f1d7226ee1..a9afbe799ef 100644 --- a/src/QirRuntime/lib/QIR/CMakeLists.txt +++ b/src/QirRuntime/lib/QIR/CMakeLists.txt @@ -22,6 +22,7 @@ set(rt_sup_source_files delegated.cpp strings.cpp utils.cpp + rtOut.cpp ) add_library(qir-rt-support ${rt_sup_source_files}) diff --git a/src/QirRuntime/lib/QIR/bridge-rt.ll b/src/QirRuntime/lib/QIR/bridge-rt.ll index ebb41b97528..71498842c92 100644 --- a/src/QirRuntime/lib/QIR/bridge-rt.ll +++ b/src/QirRuntime/lib/QIR/bridge-rt.ll @@ -108,6 +108,10 @@ declare i8* @quantum__rt_string_get_data(%"struct.QirString"* %str) declare i32 @quantum__rt_string_get_length(%"struct.QirString"* %str) +;------------------------------------------------------------------------------ +; message +; +declare void @quantum__rt__message(%"struct.QirString"* %str) ;======================================================================================================================= ; __quantum__rt__* bridge implementation @@ -138,6 +142,12 @@ define dllexport void @__quantum__rt__fail(%String* %.str) { ret void } +define dllexport void @__quantum__rt__message(%String* %.str) { + %str = bitcast %String* %.str to %"struct.QirString"* + call void @quantum__rt__message(%"struct.QirString"* %str) + ret void +} + ;------------------------------------------------------------------------------ ; qubits bridge @@ -480,19 +490,20 @@ define dllexport %String* @__quantum__rt__range_to_string(%Range %.range) { ret %String* %.str } -define i8* @__quantum__rt_string_get_data(%String* %.str) { +define dllexport i8* @__quantum__rt_string_get_data(%String* %.str) { %str = bitcast %String* %.str to %"struct.QirString"* %result = call i8* @quantum__rt_string_get_data(%"struct.QirString"* %str) ret i8* %result } -define i32 @__quantum__rt_string_get_length(%String* %.str) { +define dllexport i32 @__quantum__rt_string_get_length(%String* %.str) { %str = bitcast %String* %.str to %"struct.QirString"* %result = call i32 @quantum__rt_string_get_length(%"struct.QirString"* %str) ret i32 %result } + ;------------------------------------------------------------------------------ ; bigints bridge ; diff --git a/src/QirRuntime/lib/QSharpFoundation/intrinsicsOut.cpp b/src/QirRuntime/lib/QIR/rtOut.cpp similarity index 86% rename from src/QirRuntime/lib/QSharpFoundation/intrinsicsOut.cpp rename to src/QirRuntime/lib/QIR/rtOut.cpp index 99eb2292dac..5f921c706fc 100644 --- a/src/QirRuntime/lib/QSharpFoundation/intrinsicsOut.cpp +++ b/src/QirRuntime/lib/QIR/rtOut.cpp @@ -4,8 +4,7 @@ #include #include "QirTypes.hpp" -#include "SimFactory.hpp" -#include "qsharp__foundation__qis.hpp" +#include "QirRuntime.hpp" // Forward declarations: static std::ostream& GetOutputStream(); @@ -13,7 +12,7 @@ static std::ostream& GetOutputStream(); // Public API: extern "C" { - void quantum__qis__message__body(QirString* qstr) // NOLINT + void quantum__rt__message(QirString* qstr) // NOLINT { GetOutputStream() << qstr->str << std::endl; } diff --git a/src/QirRuntime/lib/QIR/utils.cpp b/src/QirRuntime/lib/QIR/utils.cpp index 00bd1959ed5..16ab94fa645 100644 --- a/src/QirRuntime/lib/QIR/utils.cpp +++ b/src/QirRuntime/lib/QIR/utils.cpp @@ -59,10 +59,4 @@ extern "C" throw std::runtime_error(str); } - // Include the given message in the computation's execution log or equivalent. - // TODO: should we allow the user to register their own output? - void quantum__rt__message(QirString* msg) // NOLINT - { - std::cout << msg->str; - } } \ No newline at end of file diff --git a/src/QirRuntime/lib/QSharpFoundation/CMakeLists.txt b/src/QirRuntime/lib/QSharpFoundation/CMakeLists.txt index 6318dc7f062..216b971b9d8 100644 --- a/src/QirRuntime/lib/QSharpFoundation/CMakeLists.txt +++ b/src/QirRuntime/lib/QSharpFoundation/CMakeLists.txt @@ -13,7 +13,6 @@ compile_from_qir(qsharp-foundation-qis ${qsharp_foundation_qis_target}) # set(qsharp_foundation_sup_source_files intrinsicsMath.cpp - intrinsicsOut.cpp conditionals.cpp ) diff --git a/src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll b/src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll index 4bc362335c1..71b45b7c692 100644 --- a/src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll +++ b/src/QirRuntime/lib/QSharpFoundation/qsharp-foundation-qis.ll @@ -31,13 +31,14 @@ %struct.QirString = type opaque %PauliId = type i32 -declare void @quantum__qis__message__body(%struct.QirString* %str) +declare dllimport void @quantum__rt__message(%"struct.QirString"* %str) ;=============================================================================== ; +; To do: remove this function after the https://github.com/microsoft/qsharp-runtime/issues/578 is resolved. define dllexport void @__quantum__qis__message__body(%String* %.str) { %str = bitcast %String* %.str to %struct.QirString* - call void @quantum__qis__message__body(%struct.QirString* %str) + call void @quantum__rt__message(%"struct.QirString"* %str) ret void } diff --git a/src/QirRuntime/lib/QSharpFoundation/qsharp__foundation__qis.hpp b/src/QirRuntime/lib/QSharpFoundation/qsharp__foundation__qis.hpp index 3c15948463b..5e64f5f0751 100644 --- a/src/QirRuntime/lib/QSharpFoundation/qsharp__foundation__qis.hpp +++ b/src/QirRuntime/lib/QSharpFoundation/qsharp__foundation__qis.hpp @@ -27,8 +27,6 @@ namespace Quantum */ extern "C" { - QIR_SHARED_API void quantum__qis__message__body(QirString* qstr); // NOLINT - // Q# Math: QIR_SHARED_API bool quantum__qis__isnan__body(double d); // NOLINT QIR_SHARED_API double quantum__qis__infinity__body(); // NOLINT diff --git a/src/QirRuntime/public/QirRuntime.hpp b/src/QirRuntime/public/QirRuntime.hpp index 563af6a2d50..f7f393eaaa0 100644 --- a/src/QirRuntime/public/QirRuntime.hpp +++ b/src/QirRuntime/public/QirRuntime.hpp @@ -5,6 +5,7 @@ #include #include // for va_list +#include #include "CoreTypes.hpp" #include "QirTypes.hpp" @@ -302,4 +303,13 @@ extern "C" // Returns true if the first big integer is greater than or equal to the second, false otherwise. // TODO QIR_SHARED_API bool quantum__rt__bigint_greater_eq(QirBigInt*, QirBigInt*); // NOLINT -} \ No newline at end of file +} + +// To do: consider extracting to QirRuntimeOut.hpp +namespace Microsoft // Replace with `namespace Microsoft::Quantum` after migration to C++17. +{ +namespace Quantum +{ + QIR_SHARED_API std::ostream& SetOutputStream(std::ostream & newOStream); +} // namespace Microsoft +} // namespace Quantum diff --git a/src/QirRuntime/public/SimFactory.hpp b/src/QirRuntime/public/SimFactory.hpp index f8ab837443e..14128657262 100644 --- a/src/QirRuntime/public/SimFactory.hpp +++ b/src/QirRuntime/public/SimFactory.hpp @@ -18,6 +18,5 @@ namespace Quantum // Full State Simulator QIR_SHARED_API std::unique_ptr CreateFullstateSimulator(); - QIR_SHARED_API std::ostream& SetOutputStream(std::ostream& newOStream); } // namespace Quantum } // namespace Microsoft \ No newline at end of file diff --git a/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp b/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp index a7d47893926..9331edc0a0f 100644 --- a/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp +++ b/src/QirRuntime/test/QIR-static/qir-test-ouput.cpp @@ -6,8 +6,7 @@ #include "catch.hpp" #include "QirTypes.hpp" -#include "SimFactory.hpp" -#include "qsharp__foundation_internal.hpp" +#include "QirRuntime.hpp" extern "C" void Microsoft__Quantum__Testing__QIR__Out__MessageTest__body(void*); // NOLINT