Hello, Devang Patel wrote:> > > On Oct 25, 2010, at 12:09 PM, Xinfinity wrote: > >> #pragma my_pragma{ >> code >> } > >> I use a map >> (source_location, pragma) and I insert the dummy instruction when this >> location is reached in the code generator. It seems difficult to attach >> the >> metadata to the first and the last instruction emitted for the compound >> statement, as the "code" inside the pragma region can be anything. >> >> Do you consider it would be a better idea to attach metadata to all >> instructions emitted between source_location marking the beginning and >> the >> source_location marking the end of the region? > > Yes, that's how, now, we keep track of lexical scopes for debug info's > use. > - > Devang > >It seems I need some more guidance in these matters. So the plan is to attach metadata to all instructions contained in the scope of the pragma. In this respect, I create a boolean inside CodeGenFunction which is set to true once we reach the pragma and reset to false, when we exit the pragma scope. The set and reset functions are called from CGStmt in EmitCompoundStmt, if there is a pragma corresponding to the left brace and the right brace of the compound statement. Next, I tried to attach metadata to all instructions emitted, if the boolean is set to true. However this is rather a tedious work, as it implies modifying all files in clang::CodeGen. Actually, for each generated instruction I should check if it is in the pragma region and in this case attach metadata info. I am not sure if tracking all the instructions and verifying them is the best idea. Another idea would be to create a boolean as part of the IRBuilder and set it from CodeGen. And for each instruction inserted by the IRBuilder to check the boolean and attach metadata if necessary. But I think this is too specialized to my particular needs and it would not be a good solution. Is there a cleaner method? Thanks, Alexandra -- View this message in context: http://old.nabble.com/Prevent-instruction-elimination-tp30046067p30059252.html Sent from the LLVM - Dev mailing list archive at Nabble.com.
On Oct 26, 2010, at 9:23 AM, Xinfinity wrote:> > Hello, > > > Devang Patel wrote: >> >> >> On Oct 25, 2010, at 12:09 PM, Xinfinity wrote: >> >>> #pragma my_pragma{ >>> code >>> } >> >>> I use a map >>> (source_location, pragma) and I insert the dummy instruction when this >>> location is reached in the code generator. It seems difficult to attach >>> the >>> metadata to the first and the last instruction emitted for the compound >>> statement, as the "code" inside the pragma region can be anything. >>> >>> Do you consider it would be a better idea to attach metadata to all >>> instructions emitted between source_location marking the beginning and >>> the >>> source_location marking the end of the region? >> >> Yes, that's how, now, we keep track of lexical scopes for debug info's >> use. >> - >> Devang >> >> > It seems I need some more guidance in these matters. So the plan is to > attach metadata to all instructions contained in the scope of the pragma. In > this respect, I create a boolean inside CodeGenFunction which is set to true > once we reach the pragma and reset to false, when we exit the pragma scope. > The set and reset functions are called from > CGStmt in EmitCompoundStmt, if there is a pragma corresponding to the left > brace and the right brace of the compound statement. > > Next, I tried to attach metadata to all instructions emitted, if the boolean > is set to true. However this is rather a tedious work, as it implies > modifying all files in clang::CodeGen. Actually, for each generated > instruction I should check if it is in the pragma region and in this case > attach metadata info. I am not sure if tracking all the instructions and > verifying them is the best idea. > > Another idea would be to create a boolean as part of the IRBuilder and set > it from CodeGen. And for each instruction inserted by the IRBuilder to check > the boolean and attach metadata if necessary. But I think this is too > specialized to my particular needs and it would not be a good solution. > Is there a cleaner method?Setting a bit in IRBuilder is simpler. Why not use special purpose IRBuilder based on standard IRBuilder ? Another alternative is to take two step approach: step 1: insert special intrinsics to mark begin and end of your special scopes. step 2: immediately after clang finishes generating IR, run your special pass to remove your special intrinsics and update all instructions in the scope appropriately. This way, you'll be able to localize your changes. - Devang
On Tue, Oct 26, 2010 at 7:21 PM, Devang Patel <dpatel at apple.com> wrote:> > On Oct 26, 2010, at 9:23 AM, Xinfinity wrote: >> Another idea would be to create a boolean as part of the IRBuilder and set >> it from CodeGen. And for each instruction inserted by the IRBuilder to check >> the boolean and attach metadata if necessary. But I think this is too >> specialized to my particular needs and it would not be a good solution. >> Is there a cleaner method? > > Setting a bit in IRBuilder is simpler. Why not use special purpose IRBuilder based on standard IRBuilder ? > Another alternative is to take two step approach: > > step 1: insert special intrinsics to mark begin and end of your special scopes. > step 2: immediately after clang finishes generating IR, run your special pass to remove your special intrinsics and update all instructions in the scope appropriately. > > This way, you'll be able to localize your changes.There's yet another way to implement this. Currently, IRBuilder keeps track of a DebugLoc to set debug information on instructions generated. You could generalize this to keeping a SmallVector<std::pair<unsigned /*Kind*/, MDNode* /*Data*/>, N> (or SmallSet/DenseMap/whatever) of metadata to set on generated instructions. Debug information is then just a pair consisting of LLVMContext::MD_dbg and debugloc.getAsMDNode(Context)). Once you have this, you'd just need to call something like Builder.addMetaData(MyKind, MyData) when entering your pragma'd block and Builder.removeMetaData(MyKind) when exiting it. Some other points: - This could be useful for other people too, so it might be accepted as a patch. - Kind can also be a const char* if you prefer, but the unsigned ID is probably more efficient when replacing or deleting Data of a pre-existing Kind. Helper methods that accept StringRefs can easily be added by calling Context.getMDKindID(name) before delegating to the unsigned version. - This would probably make IRBuilder a bit more expensive to copy if there's an additional allocation (i.e. if the SmallVector/SmallSet got overfull, or if you're using a DenseMap). - I'm not sure how efficient it is to convert DebugLoc back and forth to MDNode* (adding "dbg" metadata as an MDNode* automatically converts it back because Instruction stores a DebugLoc) so maybe it should still be handled specially. Benchmarking to see if it makes any difference should be easy enough, just time compilation of something large with clang -g...