// ============================================================================ // saQut IR — IRProgram (Bir .sqt Dosyasının Tüm IR İçeriği) // // IRProgram, üretilen tüm fonksiyonları tutar. // Interpreter programı çalıştırmak için bu yapıyı kullanır. // // NEDEN İKİ YAPIDA TUTUYORUZ? // - functionOrder: fonksiyonları tanımlandıkları sırayla tutar (dump için) // - functions (unordered_map): CALL instruction'larında isimle hızlı arama için // // NOT: unordered_map değer semantiğiyle (IRFunction by value) tutar. // findFunction() bir pointer döndürür — bu pointer tüm addFunction() çağrıları // bittikten sonra alınmalıdır. Interpreter program üretildikten sonra çalıştığı // için bu kural otomatik olarak sağlanır. // ============================================================================ #ifndef SAQUT_IR_PROGRAM #define SAQUT_IR_PROGRAM #include #include #include #include "ir/ir_function.hpp" struct IRProgram { // Fonksiyon adı → IRFunction (hızlı arama için) std::unordered_map functions; // Ekleme sırası (dump'ta orijinal sırayla göstermek için) std::vector functionOrder; // Modül-düzeyi değişkenler (LOAD_GLOBAL / STORE_GLOBAL için) // Bunlar "global" değil — bu IRProgram'ın temsil ettiği tek modüle aittir. // Çok-modüllü derlemede her modülün kendi IRProgram'ı (veya ayrı slot alanı) olur. // TODO(#modül-scope): moduleId alanı eklenince Interpreter bu alana // frame.function->moduleId üzerinden erişecek (bkz. TODO.md). int globalCount = 0; std::vector globalNames; // index → isim (dump için) // Yeni fonksiyon ekle void addFunction(IRFunction fn) { functionOrder.push_back(fn.name); functions.emplace(fn.name, std::move(fn)); } // İsimle ara — bulunamazsa nullptr döner IRFunction* findFunction(const std::string& name) { auto it = functions.find(name); return (it != functions.end()) ? &it->second : nullptr; } // Tüm fonksiyonları ekleme sırasıyla yazdır void dump() const; }; #endif // SAQUT_IR_PROGRAM