[CIR] Add support for typeid l-value emission #2000
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Stack from ghstack (oldest at bottom):
Summary:
This patch implements support for emitting typeid expressions as
l-values in ClangIR, enabling code patterns such as:
const std::type_info& ti = typeid(MyClass);
auto& ref = typeid(int);
void foo(const std::type_info& ti) { foo(typeid(SomeType)); }
This is a common pattern in C++ code that uses RTTI for logging,
serialization, debugging, and type introspection.
Implementation:
The implementation follows the traditional LLVM CodeGen approach:
Added emitCXXTypeidExpr() in CIRGenExprCXX.cpp
(typeid(expr))
Added emitCXXTypeidLValue() in CIRGenExpr.cpp
Extended the emitLValue() switch statement to handle CXXTypeidExpr
What works:
What doesn't work yet:
(e.g., typeid(*basePtr) where the dynamic type differs from static type)
This is marked with llvm_unreachable() and will be implemented separately.
Test Plan:
Added comprehensive test coverage in clang/test/CIR/CodeGen/typeid-lvalue.cpp
Regression testing:
Differential Revision: N/A