saqut-compiler/src/ir/ir_program.hpp

57 lines
2.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ============================================================================
// 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 <string>
#include <unordered_map>
#include <vector>
#include "ir/ir_function.hpp"
struct IRProgram {
// Fonksiyon adı → IRFunction (hızlı arama için)
std::unordered_map<std::string, IRFunction> functions;
// Ekleme sırası (dump'ta orijinal sırayla göstermek için)
std::vector<std::string> 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<std::string> 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