Mercurial > projects > ldc
view ir/irlandingpad.h @ 920:545f54041d91
Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Fixed align N; in asm blocks.
Fixed inreg parameter passing on x86 for ref/out params.
Removed support for lazy initialization of function local static variables, I have no idea why I ever implemented this, it's not in the D spec, and DMD doesn't support it :P
Some of the global variable related changes might cause minor regressions, but they should be easily fixable.
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Tue, 03 Feb 2009 08:54:57 +0100 |
parents | eef8ac26c66c |
children | dc608dc33081 |
line wrap: on
line source
#ifndef LDC_IR_IRLANDINGPADINFO_H #define LDC_IR_IRLANDINGPADINFO_H #include "ir/ir.h" #include "statement.h" #include <deque> #include <stack> // only to be used within IRLandingPad // holds information about a single catch or finally struct IRLandingPadInfo { // default constructor for being able to store in a vector IRLandingPadInfo() : target(NULL), finallyBody(NULL), catchType(NULL) {} // constructor for catch IRLandingPadInfo(Catch* catchstmt, llvm::BasicBlock* end); // constructor for finally IRLandingPadInfo(Statement* finallystmt); // the target catch bb if this is a catch // or the target finally bb if this is a finally llvm::BasicBlock* target; // nonzero if this is a finally Statement* finallyBody; // nonzero if this is a catch ClassDeclaration* catchType; }; // holds information about all possible catch and finally actions // and can emit landing pads to be called from the unwind runtime struct IRLandingPad { IRLandingPad() : catch_var(NULL) {} // builds a new landing pad according to given infos // and the ones on the stack. also stores it as invoke target void push(llvm::BasicBlock* inBB); // add catch information, will be used in next call to push void addCatch(Catch* catchstmt, llvm::BasicBlock* end); // add finally information, will be used in next call to push void addFinally(Statement* finallystmt); // pops the most recently constructed landing pad bb // and its infos void pop(); // gets the current landing pad llvm::BasicBlock* get(); // creates or gets storage for exception object LLValue* getExceptionStorage(); private: // constructs the landing pad from infos void constructLandingPad(llvm::BasicBlock* inBB); // information needed to create landing pads std::deque<IRLandingPadInfo> infos; std::deque<IRLandingPadInfo> unpushed_infos; // the number of infos we had before the push std::stack<size_t> nInfos; // the target for invokes std::stack<llvm::BasicBlock*> padBBs; // associate increasing ints with each unique classdecl encountered std::map<ClassDeclaration*, int> catchToInt; // storage for the catch variable LLValue* catch_var; }; #endif