aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
diff options
context:
space:
mode:
authorMatheus Izvekov <mizvekov@gmail.com>2021-07-02 00:26:17 +0200
committerMatheus Izvekov <mizvekov@gmail.com>2021-07-26 22:15:26 +0200
commitf84c70a3793909ec16b3e53a502f0f9ea99c6af3 (patch)
tree9291e7d8873bba0594df89ef8fd765f2426ee84a /llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
parentdead50d4427cbdd5f41c02c5441270822f702730 (diff)
downloadllvm-f84c70a3793909ec16b3e53a502f0f9ea99c6af3.zip
llvm-f84c70a3793909ec16b3e53a502f0f9ea99c6af3.tar.gz
llvm-f84c70a3793909ec16b3e53a502f0f9ea99c6af3.tar.bz2
[CodeView] Saturate values bigger than supported by APInt.
This fixes an assert firing when compiling code which involves 128 bit integrals. This would trigger runtime checks similar to this: ``` Assertion failed: getMinSignedBits() <= 64 && "Too many bits for int64_t", file llvm/include/llvm/ADT/APInt.h, line 1646 ``` To get around this, we just saturate those big values. Reviewed By: rnk Differential Revision: https://reviews.llvm.org/D105320
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp60
1 files changed, 25 insertions, 35 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
index cbfdd04..bbb0504 100644
--- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
@@ -2116,6 +2116,7 @@ TypeIndex CodeViewDebug::lowerTypeEnum(const DICompositeType *Ty) {
// We assume that the frontend provides all members in source declaration
// order, which is what MSVC does.
if (auto *Enumerator = dyn_cast_or_null<DIEnumerator>(Element)) {
+ // FIXME: Is it correct to always emit these as unsigned here?
EnumeratorRecord ER(MemberAccess::Public,
APSInt(Enumerator->getValue(), true),
Enumerator->getName());
@@ -3157,6 +3158,27 @@ void CodeViewDebug::emitGlobalVariableList(ArrayRef<CVGlobalVariable> Globals) {
}
}
+void CodeViewDebug::emitConstantSymbolRecord(const DIType *DTy, APSInt &Value,
+ const std::string &QualifiedName) {
+ MCSymbol *SConstantEnd = beginSymbolRecord(SymbolKind::S_CONSTANT);
+ OS.AddComment("Type");
+ OS.emitInt32(getTypeIndex(DTy).getIndex());
+
+ OS.AddComment("Value");
+
+ // Encoded integers shouldn't need more than 10 bytes.
+ uint8_t Data[10];
+ BinaryStreamWriter Writer(Data, llvm::support::endianness::little);
+ CodeViewRecordIO IO(Writer);
+ cantFail(IO.mapEncodedInteger(Value));
+ StringRef SRef((char *)Data, Writer.getOffset());
+ OS.emitBinaryData(SRef);
+
+ OS.AddComment("Name");
+ emitNullTerminatedSymbolName(OS, QualifiedName);
+ endSymbolRecord(SConstantEnd);
+}
+
void CodeViewDebug::emitStaticConstMemberList() {
for (const DIDerivedType *DTy : StaticConstMembers) {
const DIScope *Scope = DTy->getScope();
@@ -3172,24 +3194,8 @@ void CodeViewDebug::emitStaticConstMemberList() {
else
llvm_unreachable("cannot emit a constant without a value");
- std::string QualifiedName = getFullyQualifiedName(Scope, DTy->getName());
-
- MCSymbol *SConstantEnd = beginSymbolRecord(SymbolKind::S_CONSTANT);
- OS.AddComment("Type");
- OS.emitInt32(getTypeIndex(DTy->getBaseType()).getIndex());
- OS.AddComment("Value");
-
- // Encoded integers shouldn't need more than 10 bytes.
- uint8_t Data[10];
- BinaryStreamWriter Writer(Data, llvm::support::endianness::little);
- CodeViewRecordIO IO(Writer);
- cantFail(IO.mapEncodedInteger(Value));
- StringRef SRef((char *)Data, Writer.getOffset());
- OS.emitBinaryData(SRef);
-
- OS.AddComment("Name");
- emitNullTerminatedSymbolName(OS, QualifiedName);
- endSymbolRecord(SConstantEnd);
+ emitConstantSymbolRecord(DTy->getBaseType(), Value,
+ getFullyQualifiedName(Scope, DTy->getName()));
}
}
@@ -3253,22 +3259,6 @@ void CodeViewDebug::emitDebugInfoForGlobal(const CVGlobalVariable &CVGV) {
? true
: DebugHandlerBase::isUnsignedDIType(DIGV->getType());
APSInt Value(APInt(/*BitWidth=*/64, DIE->getElement(1)), isUnsigned);
-
- MCSymbol *SConstantEnd = beginSymbolRecord(SymbolKind::S_CONSTANT);
- OS.AddComment("Type");
- OS.emitInt32(getTypeIndex(DIGV->getType()).getIndex());
- OS.AddComment("Value");
-
- // Encoded integers shouldn't need more than 10 bytes.
- uint8_t data[10];
- BinaryStreamWriter Writer(data, llvm::support::endianness::little);
- CodeViewRecordIO IO(Writer);
- cantFail(IO.mapEncodedInteger(Value));
- StringRef SRef((char *)data, Writer.getOffset());
- OS.emitBinaryData(SRef);
-
- OS.AddComment("Name");
- emitNullTerminatedSymbolName(OS, QualifiedName);
- endSymbolRecord(SConstantEnd);
+ emitConstantSymbolRecord(DIGV->getType(), Value, QualifiedName);
}
}