mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-06 04:31:08 +00:00
102 lines
3.4 KiB
C++
102 lines
3.4 KiB
C++
|
//===- DebugInfoMetadata.cpp - Implement debug info metadata --------------===//
|
||
|
//
|
||
|
// The LLVM Compiler Infrastructure
|
||
|
//
|
||
|
// This file is distributed under the University of Illinois Open Source
|
||
|
// License. See LICENSE.TXT for details.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
//
|
||
|
// This file implements the debug info Metadata classes.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
|
||
|
#include "llvm/IR/DebugInfoMetadata.h"
|
||
|
#include "LLVMContextImpl.h"
|
||
|
#include "MetadataImpl.h"
|
||
|
|
||
|
using namespace llvm;
|
||
|
|
||
|
MDLocation::MDLocation(LLVMContext &C, StorageType Storage, unsigned Line,
|
||
|
unsigned Column, ArrayRef<Metadata *> MDs)
|
||
|
: MDNode(C, MDLocationKind, Storage, MDs) {
|
||
|
assert((MDs.size() == 1 || MDs.size() == 2) &&
|
||
|
"Expected a scope and optional inlined-at");
|
||
|
|
||
|
// Set line and column.
|
||
|
assert(Line < (1u << 24) && "Expected 24-bit line");
|
||
|
assert(Column < (1u << 16) && "Expected 16-bit column");
|
||
|
|
||
|
SubclassData32 = Line;
|
||
|
SubclassData16 = Column;
|
||
|
}
|
||
|
|
||
|
static void adjustLine(unsigned &Line) {
|
||
|
// Set to unknown on overflow. Still use 24 bits for now.
|
||
|
if (Line >= (1u << 24))
|
||
|
Line = 0;
|
||
|
}
|
||
|
|
||
|
static void adjustColumn(unsigned &Column) {
|
||
|
// Set to unknown on overflow. We only have 16 bits to play with here.
|
||
|
if (Column >= (1u << 16))
|
||
|
Column = 0;
|
||
|
}
|
||
|
|
||
|
MDLocation *MDLocation::getImpl(LLVMContext &Context, unsigned Line,
|
||
|
unsigned Column, Metadata *Scope,
|
||
|
Metadata *InlinedAt, StorageType Storage,
|
||
|
bool ShouldCreate) {
|
||
|
// Fixup line/column.
|
||
|
adjustLine(Line);
|
||
|
adjustColumn(Column);
|
||
|
|
||
|
if (Storage == Uniqued) {
|
||
|
if (auto *N =
|
||
|
getUniqued(Context.pImpl->MDLocations,
|
||
|
MDLocationInfo::KeyTy(Line, Column, Scope, InlinedAt)))
|
||
|
return N;
|
||
|
if (!ShouldCreate)
|
||
|
return nullptr;
|
||
|
} else {
|
||
|
assert(ShouldCreate && "Expected non-uniqued nodes to always be created");
|
||
|
}
|
||
|
|
||
|
SmallVector<Metadata *, 2> Ops;
|
||
|
Ops.push_back(Scope);
|
||
|
if (InlinedAt)
|
||
|
Ops.push_back(InlinedAt);
|
||
|
return storeImpl(new (Ops.size())
|
||
|
MDLocation(Context, Storage, Line, Column, Ops),
|
||
|
Storage, Context.pImpl->MDLocations);
|
||
|
}
|
||
|
|
||
|
GenericDebugNode *GenericDebugNode::getImpl(LLVMContext &Context, unsigned Tag,
|
||
|
StringRef Header,
|
||
|
ArrayRef<Metadata *> DwarfOps,
|
||
|
StorageType Storage,
|
||
|
bool ShouldCreate) {
|
||
|
unsigned Hash = 0;
|
||
|
if (Storage == Uniqued) {
|
||
|
GenericDebugNodeInfo::KeyTy Key(Tag, Header, DwarfOps);
|
||
|
if (auto *N = getUniqued(Context.pImpl->GenericDebugNodes, Key))
|
||
|
return N;
|
||
|
if (!ShouldCreate)
|
||
|
return nullptr;
|
||
|
Hash = Key.getHash();
|
||
|
} else {
|
||
|
assert(ShouldCreate && "Expected non-uniqued nodes to always be created");
|
||
|
}
|
||
|
|
||
|
// Use a nullptr for empty headers.
|
||
|
Metadata *PreOps[] = {Header.empty() ? nullptr
|
||
|
: MDString::get(Context, Header)};
|
||
|
return storeImpl(new (DwarfOps.size() + 1) GenericDebugNode(
|
||
|
Context, Storage, Hash, Tag, PreOps, DwarfOps),
|
||
|
Storage, Context.pImpl->GenericDebugNodes);
|
||
|
}
|
||
|
|
||
|
void GenericDebugNode::recalculateHash() {
|
||
|
setHash(GenericDebugNodeInfo::KeyTy::calculateHash(this));
|
||
|
}
|