aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/ExecutionEngine/Interpreter/Interpreter.cpp
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2014-08-19 00:13:19 +0000
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2014-08-19 00:13:19 +0000
commit171699083d11672faca505edb98dac28c0efd59d (patch)
tree6be4ccb1bc02dcd4575a3fc8a47240338e2e9d55 /llvm/lib/ExecutionEngine/Interpreter/Interpreter.cpp
parent8e3669586b60d18e78da9b356575c4b59854b1a4 (diff)
downloadllvm-171699083d11672faca505edb98dac28c0efd59d.zip
llvm-171699083d11672faca505edb98dac28c0efd59d.tar.gz
llvm-171699083d11672faca505edb98dac28c0efd59d.tar.bz2
LLParser: Handle BlockAddresses on-the-fly
Previously all `blockaddress()` constants were treated as forward references. They were resolved twice: once at the end of the function in question, and again at the end of the module. Furthermore, if the same blockaddress was referenced N times, the parser created N distinct `GlobalVariable`s (one for each reference). Instead, resolve all block addresses at the beginning of the function, creating the standard `BasicBlock` forward references used for all other basic block references. After the function, all references can be resolved immediately. To check for the condition of parsing block addresses from within the same function, I created a reference to the current per-function-state in `BlockAddressPFS`. Also, create only one forward-reference per basic block. Because forward references to block addresses are rare, the data structure here shouldn't matter. If somehow it does someday, this can be pretty easily changed to a `DenseMap<std::pair<ValID, ValID>, GV>`. This is part of PR20515. llvm-svn: 215952
Diffstat (limited to 'llvm/lib/ExecutionEngine/Interpreter/Interpreter.cpp')
0 files changed, 0 insertions, 0 deletions