Commit 9d70080
committed
[CIR] Add support for typeid l-value emission
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:
1. Added emitCXXTypeidExpr() in CIRGenExprCXX.cpp
- Handles both type operands (typeid(Type)) and expression operands
(typeid(expr))
- Retrieves the RTTI descriptor via getAddrOfRTTIDescriptor()
- Looks up the GlobalOp to determine the correct pointer type
- Creates a GetGlobalOp to materialize the address at runtime
- Polymorphic type vtable lookup is marked as NYI
2. Added emitCXXTypeidLValue() in CIRGenExpr.cpp
- Calls emitCXXTypeidExpr() to get the RTTI descriptor pointer
- Performs a bitcast from !u8i pointer to the proper type_info type
- Creates an LValue with appropriate alignment for reference binding
3. Extended the emitLValue() switch statement to handle CXXTypeidExpr
What works:
- typeid with type operands: typeid(int), typeid(MyClass)
- typeid with non-polymorphic expression operands: typeid(obj)
- Reference binding: const std::type_info& ti = typeid(...)
- Function argument passing: foo(typeid(...))
- Built-in types, class types, and struct types
What doesn't work yet:
- typeid with polymorphic types requiring vtable lookup
(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
- Non-polymorphic struct types
- Expression operands
- Built-in types (int, double)
- Function argument passing
- All tests pass
Regression testing:
- All 394 CIR CodeGen tests pass (379 passed, 14 unsupported, 1 expected fail)
- Code formatted with clang-format
- Code checked with clang-tidy (warnings consistent with existing codebase)
Differential Revision: N/A
ghstack-source-id: 261e71d
Pull-Request: #20001 parent 78c0ba0 commit 9d70080
File tree
4 files changed
+196
-0
lines changed- clang
- lib/CIR/CodeGen
- test/CIR/CodeGen
4 files changed
+196
-0
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2769 | 2769 | | |
2770 | 2770 | | |
2771 | 2771 | | |
| 2772 | + | |
| 2773 | + | |
2772 | 2774 | | |
2773 | 2775 | | |
2774 | 2776 | | |
| |||
3489 | 3491 | | |
3490 | 3492 | | |
3491 | 3493 | | |
| 3494 | + | |
| 3495 | + | |
| 3496 | + | |
| 3497 | + | |
| 3498 | + | |
| 3499 | + | |
| 3500 | + | |
| 3501 | + | |
| 3502 | + | |
| 3503 | + | |
| 3504 | + | |
| 3505 | + | |
| 3506 | + | |
| 3507 | + | |
| 3508 | + | |
| 3509 | + | |
| 3510 | + | |
| 3511 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1809 | 1809 | | |
1810 | 1810 | | |
1811 | 1811 | | |
| 1812 | + | |
| 1813 | + | |
| 1814 | + | |
| 1815 | + | |
| 1816 | + | |
| 1817 | + | |
| 1818 | + | |
| 1819 | + | |
| 1820 | + | |
| 1821 | + | |
| 1822 | + | |
| 1823 | + | |
| 1824 | + | |
| 1825 | + | |
| 1826 | + | |
| 1827 | + | |
| 1828 | + | |
| 1829 | + | |
| 1830 | + | |
| 1831 | + | |
| 1832 | + | |
| 1833 | + | |
| 1834 | + | |
| 1835 | + | |
| 1836 | + | |
| 1837 | + | |
| 1838 | + | |
| 1839 | + | |
| 1840 | + | |
| 1841 | + | |
| 1842 | + | |
| 1843 | + | |
| 1844 | + | |
| 1845 | + | |
| 1846 | + | |
| 1847 | + | |
| 1848 | + | |
| 1849 | + | |
| 1850 | + | |
| 1851 | + | |
| 1852 | + | |
| 1853 | + | |
| 1854 | + | |
| 1855 | + | |
| 1856 | + | |
| 1857 | + | |
| 1858 | + | |
| 1859 | + | |
| 1860 | + | |
| 1861 | + | |
| 1862 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2134 | 2134 | | |
2135 | 2135 | | |
2136 | 2136 | | |
| 2137 | + | |
| 2138 | + | |
| 2139 | + | |
| 2140 | + | |
| 2141 | + | |
| 2142 | + | |
2137 | 2143 | | |
2138 | 2144 | | |
2139 | 2145 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
0 commit comments