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, LLirRoot, LLvmLanguage};
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 { language: LLvmLanguage::default() }
19    }
20
21    /// 从字符串解析 LLVM IR
22    pub fn read(&self, source: &str) -> Result<LLirRoot> {
23        let builder = LLirBuilder::new(&self.language);
24        let mut session_cache = ParseSession::<LLvmLanguage>::default();
25        let diagnostics = builder.build(source, &[], &mut session_cache);
26
27        match diagnostics.result {
28            Ok(root) => Ok(root),
29            Err(e) => {
30                let message = e.to_string();
31                Err(gaia_types::GaiaError::custom_error(message))
32            }
33        }
34    }
35}
36
37/// 解析 LLVM IR 字符串为 AST
38pub fn parse(source: &str) -> Result<LLirRoot> {
39    LLvmReader::new().read(source)
40}