2020-11-13 22:33:57 -05:00
|
|
|
/*!
|
|
|
|
* @file CodeGenerator.h
|
|
|
|
* Generate object files from a FileEnv using an emitter::ObjectGenerator.
|
|
|
|
* Populates a DebugInfo.
|
|
|
|
* Currently owns the logic for emitting the function prologues.
|
|
|
|
*/
|
|
|
|
|
2020-09-13 21:32:55 -04:00
|
|
|
#pragma once
|
2020-09-05 16:37:37 -04:00
|
|
|
|
2020-09-06 16:58:25 -04:00
|
|
|
#include "Env.h"
|
|
|
|
#include "goalc/emitter/ObjectGenerator.h"
|
|
|
|
|
2020-11-13 22:33:57 -05:00
|
|
|
class DebugInfo;
|
2021-02-09 20:59:14 -05:00
|
|
|
class TypeSystem;
|
2020-11-13 22:33:57 -05:00
|
|
|
|
2020-09-06 16:58:25 -04:00
|
|
|
class CodeGenerator {
|
|
|
|
public:
|
2020-11-13 22:33:57 -05:00
|
|
|
CodeGenerator(FileEnv* env, DebugInfo* debug_info);
|
2021-02-09 20:59:14 -05:00
|
|
|
std::vector<u8> run(const TypeSystem* ts);
|
2021-08-01 17:46:55 -04:00
|
|
|
emitter::ObjectGeneratorStats get_obj_stats() const { return m_gen.get_stats(); }
|
2020-09-06 16:58:25 -04:00
|
|
|
|
|
|
|
private:
|
2021-08-26 20:33:00 -04:00
|
|
|
void do_function(const std::shared_ptr<FunctionEnv>& env, int f_idx);
|
|
|
|
void do_goal_function(const std::shared_ptr<FunctionEnv>& env, int f_idx);
|
|
|
|
void do_asm_function(const std::shared_ptr<FunctionEnv>& env, int f_idx, bool allow_saved_regs);
|
2020-09-06 16:58:25 -04:00
|
|
|
emitter::ObjectGenerator m_gen;
|
2020-11-13 22:33:57 -05:00
|
|
|
FileEnv* m_fe = nullptr;
|
|
|
|
DebugInfo* m_debug_info = nullptr;
|
2020-09-06 16:58:25 -04:00
|
|
|
};
|