Mercurial > projects > ldc
view ir/irlandingpad.h @ 948:780530d1cad3
Revert templates to old behavior.
While emitting a template instantiation only once is good for compile times
and binary sizes, it doesn't work with linkonce linkage as inlined function
bodies could be discarded. Since we don't want to inhibit inlining, templates
are reverted to the previous behavior, where an instantiation is emitted for
each module using it.
In the future, a custom inlining pass may allow us to switch back to
common/weak linkage and reenable smart template instance emission.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Sun, 08 Feb 2009 21:44:46 +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