2828#include " llvm/IR/Intrinsics.h"
2929#include " llvm/IR/Module.h"
3030#include " llvm/Support/raw_ostream.h"
31+ #include " llvm/Support/MathExtras.h"
3132
3233#include " DxilDiaSession.h"
3334#include " DxilDiaTableSymbols.h"
@@ -596,10 +597,11 @@ class SymbolManagerInit {
596597 TypeInfo (const TypeInfo &) = delete ;
597598 TypeInfo (TypeInfo &&) = default ;
598599
599- explicit TypeInfo (DWORD dwTypeID) : m_dwTypeID(dwTypeID) {}
600+ TypeInfo (DWORD dwTypeID, uint64_t alignInBits ) : m_dwTypeID(dwTypeID), m_alignInBytes(alignInBits / 8 ) {}
600601
601602 DWORD GetTypeID () const { return m_dwTypeID; }
602603 DWORD GetCurrentSizeInBytes () const { return m_dwCurrentSizeInBytes; }
604+ uint64_t GetAlignmentInBytes () const { return m_alignInBytes; }
603605 const std::vector<llvm::DIType *> &GetLayout () const { return m_Layout; }
604606
605607 void Embed (const TypeInfo &TI);
@@ -610,6 +612,7 @@ class SymbolManagerInit {
610612 DWORD m_dwTypeID;
611613 std::vector<llvm::DIType *> m_Layout;
612614 DWORD m_dwCurrentSizeInBytes = 0 ;
615+ uint64_t m_alignInBytes;
613616 };
614617 using TypeToInfoMap = llvm::DenseMap<llvm::DIType *, std::unique_ptr<TypeInfo> >;
615618
@@ -662,9 +665,9 @@ class SymbolManagerInit {
662665 HRESULT GetTypeInfo (llvm::DIType *T, TypeInfo **TI);
663666
664667 template <typename Factory, typename ... Args>
665- HRESULT AddType (DWORD dwParentID, llvm::DIType *T, DWORD *pNewSymID, Args&&... args) {
668+ HRESULT AddType (DWORD dwParentID, llvm::DIType *T, DWORD *pNewSymID, uint64_t alignment, Args&&... args) {
666669 IFR (AddSymbol<Factory>(dwParentID, pNewSymID, std::forward<Args>(args)...));
667- if (!m_TypeToInfo.insert (std::make_pair (T, llvm::make_unique<TypeInfo>(*pNewSymID))).second ) {
670+ if (!m_TypeToInfo.insert (std::make_pair (T, llvm::make_unique<TypeInfo>(*pNewSymID, alignment ))).second ) {
668671 return E_FAIL;
669672 }
670673 return S_OK;
@@ -1140,13 +1143,22 @@ void dxil_dia::hlsl_symbols::SymbolManagerInit::TypeInfo::Embed(const TypeInfo &
11401143 for (const auto &E : TI.GetLayout ()) {
11411144 m_Layout.emplace_back (E);
11421145 }
1146+ uint64_t alignmentInBytes = TI.GetAlignmentInBytes ();
1147+ if (alignmentInBytes != 0 ) {
1148+ m_dwCurrentSizeInBytes =
1149+ llvm::RoundUpToAlignment (m_dwCurrentSizeInBytes, alignmentInBytes);
1150+ }
11431151 m_dwCurrentSizeInBytes += TI.m_dwCurrentSizeInBytes ;
11441152}
11451153
11461154void dxil_dia::hlsl_symbols::SymbolManagerInit::TypeInfo::AddBasicType (llvm::DIBasicType *BT) {
11471155 m_Layout.emplace_back (BT);
11481156
11491157 static constexpr DWORD kNumBitsPerByte = 8 ;
1158+ uint64_t alignmentInBytes = BT->getAlignInBits () / kNumBitsPerByte ;
1159+ if (alignmentInBytes != 0 ) {
1160+ m_dwCurrentSizeInBytes = llvm::RoundUpToAlignment (m_dwCurrentSizeInBytes, alignmentInBytes);
1161+ }
11501162 m_dwCurrentSizeInBytes += BT->getSizeInBits () / kNumBitsPerByte ;
11511163}
11521164
@@ -1402,7 +1414,7 @@ HRESULT dxil_dia::hlsl_symbols::SymbolManagerInit::CreateSubroutineType(DWORD dw
14021414 };
14031415 }
14041416
1405- IFR (AddType<symbol_factory::Type>(dwParentID, ST, pNewTypeID, SymTagFunctionType, ST, LazyName));
1417+ IFR (AddType<symbol_factory::Type>(dwParentID, ST, pNewTypeID, 0 /* alignment */ , SymTagFunctionType, ST, LazyName));
14061418
14071419 return S_OK;
14081420}
@@ -1418,7 +1430,7 @@ HRESULT dxil_dia::hlsl_symbols::SymbolManagerInit::CreateBasicType(DWORD dwParen
14181430 return S_OK;
14191431 };
14201432
1421- IFR (AddType<symbol_factory::Type>(dwParentID, BT, pNewTypeID, SymTagBaseType, BT, LazyName));
1433+ IFR (AddType<symbol_factory::Type>(dwParentID, BT, pNewTypeID, BT-> getAlignInBits (), SymTagBaseType, BT, LazyName));
14221434
14231435 TypeInfo *TI;
14241436 IFR (GetTypeInfo (BT, &TI));
@@ -1477,7 +1489,7 @@ HRESULT dxil_dia::hlsl_symbols::SymbolManagerInit::CreateCompositeType(DWORD dwP
14771489 return S_OK;
14781490 };
14791491
1480- IFR (AddType<symbol_factory::Type>(dwParentID, CT, pNewTypeID, SymTagArrayType, CT, LazyName));
1492+ IFR (AddType<symbol_factory::Type>(dwParentID, CT, pNewTypeID, BaseType-> getAlignInBits (), SymTagArrayType, CT, LazyName));
14811493 TypeInfo *ctTI;
14821494 IFR (GetTypeInfo (CT, &ctTI));
14831495 TypeInfo *baseTI;
@@ -1512,7 +1524,7 @@ HRESULT dxil_dia::hlsl_symbols::SymbolManagerInit::CreateCompositeType(DWORD dwP
15121524 return S_OK;
15131525 };
15141526
1515- IFR (AddType<symbol_factory::UDT>(dwParentID, CT, pNewTypeID, CT, LazyName));
1527+ IFR (AddType<symbol_factory::UDT>(dwParentID, CT, pNewTypeID, CT-> getAlignInBits (), CT , LazyName));
15161528
15171529 TypeInfo *udtTI;
15181530 IFR (GetTypeInfo (CT, &udtTI));
@@ -1612,7 +1624,7 @@ HRESULT dxil_dia::hlsl_symbols::SymbolManagerInit::CreateHLSLVectorType(llvm::DI
16121624 }
16131625
16141626 const DWORD dwParentID = HlslProgramId;
1615- IFR (AddType<symbol_factory::VectorType>(dwParentID, T, pNewTypeID, T, dwElemTyID, ElemCnt->getLimitedValue ()));
1627+ IFR (AddType<symbol_factory::VectorType>(dwParentID, T, pNewTypeID, T-> getAlignInBits (), T , dwElemTyID, ElemCnt->getLimitedValue ()));
16161628
16171629 TypeInfo *vecTI;
16181630 IFR (GetTypeInfo (T, &vecTI));
@@ -1676,7 +1688,7 @@ HRESULT dxil_dia::hlsl_symbols::SymbolManagerInit::HandleDerivedType(DWORD dwPar
16761688 return E_FAIL;
16771689 }
16781690
1679- IFR (AddType<symbol_factory::TypedefType>(dwParentID, DT, pNewTypeID, DT, dwBaseTypeID));
1691+ IFR (AddType<symbol_factory::TypedefType>(dwParentID, DT, pNewTypeID, BaseTy-> getAlignInBits (), DT, dwBaseTypeID));
16801692
16811693 TypeInfo *dtTI;
16821694 IFR (GetTypeInfo (DT, &dtTI));
@@ -1715,7 +1727,7 @@ HRESULT dxil_dia::hlsl_symbols::SymbolManagerInit::HandleDerivedType(DWORD dwPar
17151727 }
17161728 }
17171729
1718- IFR (AddType<symbol_factory::Type>(dwParentID, DT, pNewTypeID, st, DT, LazyName));
1730+ IFR (AddType<symbol_factory::Type>(dwParentID, DT, pNewTypeID, DT-> getAlignInBits (), st, DT, LazyName));
17191731
17201732 if (DT->getTag () == llvm::dwarf::DW_TAG_const_type) {
17211733 TypeInfo *dtTI;
@@ -1788,13 +1800,16 @@ HRESULT dxil_dia::hlsl_symbols::SymbolManagerInit::CreateUDTField(DWORD dwParent
17881800 DWORD dwLVTypeID;
17891801 IFR (CreateType (FieldTy, &dwLVTypeID));
17901802 if (m_pCurUDT != nullptr ) {
1791- const DWORD dwOffsetInBytes = CurrentUDTInfo ().GetCurrentSizeInBytes ();
1803+ TypeInfo *lvTI;
1804+ IFR (GetTypeInfo (FieldTy, &lvTI));
1805+ const DWORD dwOffsetInBytes =
1806+ (lvTI->GetAlignmentInBytes () == 0 )
1807+ ? CurrentUDTInfo ().GetCurrentSizeInBytes ()
1808+ : llvm::RoundUpToAlignment (CurrentUDTInfo ().GetCurrentSizeInBytes (), lvTI->GetAlignmentInBytes ());
17921809 DXASSERT_ARGS (dwOffsetInBytes == Field->getOffsetInBits () / 8 ,
17931810 " %d vs %d" ,
17941811 dwOffsetInBytes,
17951812 Field->getOffsetInBits () / 8 );
1796- TypeInfo *lvTI;
1797- IFR (GetTypeInfo (FieldTy, &lvTI));
17981813 CurrentUDTInfo ().Embed (*lvTI);
17991814 }
18001815
0 commit comments