llvm-project/llvm/lib/AsmParser
Duncan P. N. Exon Smith 171699083d 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
2014-08-19 00:13:19 +00:00
..
CMakeLists.txt build/CMake: Finish removal of add_llvm_library_dependencies. 2011-11-29 19:25:30 +00:00
LLLexer.cpp These classes only need a StringRef, not a MemoryBuffer. 2014-08-18 22:28:28 +00:00
LLLexer.h These classes only need a StringRef, not a MemoryBuffer. 2014-08-18 22:28:28 +00:00
LLParser.cpp LLParser: Handle BlockAddresses on-the-fly 2014-08-19 00:13:19 +00:00
LLParser.h LLParser: Handle BlockAddresses on-the-fly 2014-08-19 00:13:19 +00:00
LLToken.h Canonicalize header guards into a common format. 2014-08-13 16:26:38 +00:00
LLVMBuild.txt LLVMBuild: Remove trailing newline, which irked me. 2011-12-12 19:48:00 +00:00
Makefile
Parser.cpp These classes only need a StringRef, not a MemoryBuffer. 2014-08-18 22:28:28 +00:00
module.modulemap [modules] Add module maps for LLVM. These are not quite ready for prime-time 2014-05-21 02:46:14 +00:00