================
@@ -2036,8 +2036,31 @@ DIE *DwarfUnit::getOrCreateStaticMemberDIE(const 
DIDerivedType *DT) {
 
   if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT->getConstant()))
     addConstantValue(StaticMemberDIE, CI, Ty);
-  if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT->getConstant()))
+  else if (const ConstantFP *CFP =
+               dyn_cast_or_null<ConstantFP>(DT->getConstant()))
     addConstantFPValue(StaticMemberDIE, CFP);
+  else if (auto *CDS =
+               dyn_cast_or_null<ConstantDataSequential>(DT->getConstant())) {
+    // Emit each element byte-by-byte in target byte order. We avoid
+    // getRawDataValues() because it exposes host endianness, which
+    // produces incorrect DWARF on big-endian hosts cross-compiling
+    // for little-endian targets (and vice versa).
+    auto *Block = new (DIEValueAllocator) DIEBlock;
+    unsigned NumElts = CDS->getNumElements();
+    unsigned ElemByteSize = CDS->getElementType()->getPrimitiveSizeInBits() / 
8;
+    bool IsLE = Asm->getDataLayout().isLittleEndian();
+    for (unsigned I = 0; I < NumElts; ++I) {
+      APInt Val = CDS->getElementAsAPInt(I);
+      for (unsigned J = 0; J < ElemByteSize; ++J) {
+        unsigned BitOff = IsLE ? (J * 8) : ((ElemByteSize - 1 - J) * 8);
+        addUInt(*Block, dwarf::DW_FORM_data1,
+                Val.extractBitsAsZExtValue(8, BitOff));
+      }
+    }
----------------
Michael137 wrote:

I think we can replace this whole thing with a call to `addIntAsBlock`

https://github.com/llvm/llvm-project/pull/184804
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to