1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
#pragma once
#include "../Arena.h"
#include "../Reg.h"
#include "../Operand.h"
namespace code {
namespace x86 {
STORM_PKG(core.asm.x86);
/**
* Arena for X86 (TODO: factor windows/unix versions of this one!)
*/
class Arena : public code::Arena {
STORM_CLASS;
public:
// Create.
STORM_CTOR Arena();
/**
* Transform.
*/
virtual code::Arena::TransformInfo STORM_FN transformInfo(Listing *src) const;
virtual void STORM_FN output(Listing *src, Output *to) const;
/**
* Outputs.
*/
virtual LabelOutput *STORM_FN labelOutput() const;
virtual CodeOutput *STORM_FN codeOutput(Binary *owner, LabelOutput *size) const;
/**
* Registers.
*/
virtual void STORM_FN removeFnRegs(RegSet *from) const;
virtual RegSet *STORM_FN fnResultRegs() const;
virtual Instr *STORM_FN saveFnResultReg(Reg reg, Operand to) const;
virtual Instr *STORM_FN restoreFnResultReg(Reg reg, Operand from) const;
/**
* Misc.
*/
virtual Listing *STORM_FN redirect(Bool member, TypeDesc *result, Array<TypeDesc *> *params, Ref fn, Operand param);
virtual Listing *STORM_FN engineRedirect(TypeDesc *result, Array<TypeDesc *> *params, Ref fn, Operand engine);
virtual Nat STORM_FN firstParamId(MAYBE(TypeDesc *) desc);
virtual Operand STORM_FN firstParamLoc(Nat id);
virtual Reg STORM_FN functionDispatchReg();
/**
* Replacing functions.
*/
virtual code::Arena::Skeleton *STORM_FN compatibleFrameSkeleton(Binary *binary, Nat offset);
virtual void updateEhInfo(const void *function, size_t offset, void *framePointer);
virtual void STORM_FN resizeStackFrame(Listing *out, Reg tmpReg, Binary *newSz);
};
}
}
|