Skip to main content

llvm_assembler/formats/llvm/reader/
mod.rs

1use gaia_types::Result;
2use oak_core::{Builder, ParseSession};
3use oak_llvm_ir::{LLirBuilder, LLvmLanguage, LLirRoot};
4
5/// LLVM IR 读取器
6pub struct LLvmReader {
7    language: LLvmLanguage,
8}
9
10impl Default for LLvmReader {
11    fn default() -> Self {
12        Self::new()
13    }
14}
15
16impl LLvmReader {
17    pub fn new() -> Self {
18        Self {
19            language: LLvmLanguage::default(),
20        }
21    }
22
23    /// 从字符串解析 LLVM IR
24    pub fn read(&self, source: &str) -> Result<LLirRoot> {
25        let builder = LLirBuilder::new(&self.language);
26        let mut session_cache = ParseSession::<LLvmLanguage>::default();
27        let diagnostics = builder.build(source, &[], &mut session_cache);
28
29        match diagnostics.result {
30            Ok(root) => Ok(root),
31            Err(e) => {
32                let message = e.to_string();
33                Err(gaia_types::GaiaError::custom_error(message))
34            }
35        }
36    }
37}
38
39/// 解析 LLVM IR 字符串为 AST
40pub fn parse(source: &str) -> Result<LLirRoot> {
41    LLvmReader::new().read(source)
42}