diff options
| author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2016-04-17 03:58:21 +0000 |
|---|---|---|
| committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2016-04-17 03:58:21 +0000 |
| commit | 5ab2be094e9b1e75a91b214a214d07e58aacef53 (patch) | |
| tree | f95cbcc8b7e39181f9ae9e9983c5bed8c5f49496 /llvm/include | |
| parent | 05ebfd09382b8dc8cd26eaf8fb91fb73ce48290e (diff) | |
| download | bcm5719-llvm-5ab2be094e9b1e75a91b214a214d07e58aacef53.tar.gz bcm5719-llvm-5ab2be094e9b1e75a91b214a214d07e58aacef53.zip | |
IR: Use an explicit map for debug info type uniquing
Rather than relying on the structural equivalence of DICompositeType to
merge type definitions, use an explicit map on the LLVMContext that
LLParser and BitcodeReader consult when constructing new nodes.
Each non-forward-declaration DICompositeType with a non-empty
'identifier:' field is stored/loaded from the type map, and the first
definiton will "win".
This map is opt-in: clients that expect ODR types from different modules
to be merged must call LLVMContext::ensureDITypeMap.
- Clients that just happen to load more than one Module in the same
LLVMContext won't magically merge types.
- Clients (like LTO) that want to continue to merge types based on ODR
identifiers should opt-in immediately.
I have updated LTOCodeGenerator.cpp, the two "linking" spots in
gold-plugin.cpp, and llvm-link (unless -disable-debug-info-type-map) to
set this.
With this in place, it will be straightforward to remove the DITypeRef
concept (i.e., referencing types by their 'identifier:' string rather
than pointing at them directly).
llvm-svn: 266549
Diffstat (limited to 'llvm/include')
| -rw-r--r-- | llvm/include/llvm/IR/LLVMContext.h | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/include/llvm/IR/LLVMContext.h b/llvm/include/llvm/IR/LLVMContext.h index 2a381b1724b..34541995c4c 100644 --- a/llvm/include/llvm/IR/LLVMContext.h +++ b/llvm/include/llvm/IR/LLVMContext.h @@ -25,6 +25,8 @@ class StringRef; class Twine; class Instruction; class Module; +class MDString; +class DIType; class SMDiagnostic; class DiagnosticInfo; template <typename T> class SmallVectorImpl; @@ -113,6 +115,23 @@ public: /// especially in release mode. void setDiscardValueNames(bool Discard); + /// Whether there is a string map for uniquing debug info types with + /// identifiers across the context. Off by default. + bool hasDITypeMap() const; + void ensureDITypeMap(); + void destroyDITypeMap(); + + /// Get or insert the DIType mapped to the given string. + /// + /// Returns the address of the current \a DIType pointer mapped to \c S, + /// inserting a mapping to \c nullptr if \c S was not previously mapped. + /// This method has no effect (and returns \c nullptr instead of a valid + /// address) if \a hasDITypeMap() is \c false. + /// + /// \post If \a hasDITypeMap(), \c S will have a (possibly null) mapping. + /// \note The returned address is only valid until the next call. + DIType **getOrInsertDITypeMapping(const MDString &S); + typedef void (*InlineAsmDiagHandlerTy)(const SMDiagnostic&, void *Context, unsigned LocCookie); |

