microsoft/qdk

Public

mirrored from https://github.com/microsoft/qdkAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
e874bfb8e1dbfc3eec7aebe87f45fc0cb4c547b6

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

compiler/qsc/src/codegen.rs

64lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use qsc_codegen::qir::fir_to_qir;
5use qsc_data_structures::language_features::LanguageFeatures;
6use qsc_frontend::compile::{PackageStore, SourceMap, TargetCapabilityFlags};
7use qsc_partial_eval::ProgramEntry;
8use qsc_passes::{PackageType, PassContext};
9
10use crate::compile;
11
12pub fn get_qir(
13 sources: SourceMap,
14 language_features: LanguageFeatures,
15 capabilities: TargetCapabilityFlags,
16) -> Result<String, String> {
17 let core = compile::core();
18 let mut package_store = PackageStore::new(core);
19 let std = compile::std(&package_store, capabilities);
20 let std = package_store.insert(std);
21
22 let (unit, errors) = crate::compile::compile(
23 &package_store,
24 &[std],
25 sources,
26 PackageType::Exe,
27 capabilities,
28 language_features,
29 );
30
31 // Ensure it compiles before trying to add it to the store.
32 if !errors.is_empty() {
33 // This should never happen, as the program should be checked for errors before trying to
34 // generate code for it. But just in case, simply report the failure.
35 return Err("Failed to generate QIR".to_string());
36 }
37
38 let package_id = package_store.insert(unit);
39 let (fir_store, fir_package_id) = qsc_passes::lower_hir_to_fir(&package_store, package_id);
40 let caps_results = PassContext::run_fir_passes_on_fir(&fir_store, fir_package_id, capabilities);
41 let package = fir_store.get(fir_package_id);
42 let entry = ProgramEntry {
43 exec_graph: package.entry_exec_graph.clone(),
44 expr: (
45 fir_package_id,
46 package
47 .entry
48 .expect("package must have an entry expression"),
49 )
50 .into(),
51 };
52 // Ensure it compiles before trying to add it to the store.
53 match caps_results {
54 Ok(compute_properties) => {
55 fir_to_qir(&fir_store, capabilities, Some(compute_properties), &entry)
56 .map_err(|e| e.to_string())
57 }
58 Err(_) => {
59 // This should never happen, as the program should be checked for errors before trying to
60 // generate code for it. But just in case, simply report the failure.
61 Err("Failed to generate QIR".to_string())
62 }
63 }
64}
65