mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
4a10e2a415
Summary: Add an SMLoc to CodeInit that records the source line it originated from. This allows tablegen to point precisely at portions of code when reporting errors within the CodeInit. For example, in the upcoming GlobalISel combiner, it can report undefined expansions and point at the instance of the expansion. This is achieved using something like: SMLoc::getFromPointer(SMLoc::getPointer() + (StringRef - CodeInit::getValue())) The location is lost when producing a CodeInit by string concatenation so a fallback SMLoc is required (e.g. the Record::getLoc()) but that's pretty rare for CodeInits. There's a reasonable case for extending tracking of a couple other Init objects, for example StringInit's are often parsed and it would be good to point inside the string when reporting errors about that. However, location tracking also harms de-duplication. This is fine for CodeInit where there's only a few hundred of them (~160 for X86) and it may be worth it for StringInit (~86k up to ~1.9M for roughly 15MB increase for X86). However the origin tracking would be a _terrible_ idea for IntInit, BitInit, and UnsetInit. I haven't measured either of those three but BitInit would most likely be on the order of increasing the current 2 BitInit values up to billions. Reviewers: volkan, aditya_nandakumar, bogner, paquette, aemerson Reviewed By: paquette Subscribers: javed.absar, kristof.beyls, dexonsmith, llvm-commits, kristina Tags: #llvm Differential Revision: https://reviews.llvm.org/D58141 llvm-svn: 355245
53 lines
1.6 KiB
C++
53 lines
1.6 KiB
C++
//===- StringSet.h - The LLVM Compiler Driver -------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// StringSet - A set-like wrapper for the StringMap.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_ADT_STRINGSET_H
|
|
#define LLVM_ADT_STRINGSET_H
|
|
|
|
#include "llvm/ADT/StringMap.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Support/Allocator.h"
|
|
#include <cassert>
|
|
#include <initializer_list>
|
|
#include <utility>
|
|
|
|
namespace llvm {
|
|
|
|
/// StringSet - A wrapper for StringMap that provides set-like functionality.
|
|
template <class AllocatorTy = MallocAllocator>
|
|
class StringSet : public StringMap<char, AllocatorTy> {
|
|
using base = StringMap<char, AllocatorTy>;
|
|
|
|
public:
|
|
StringSet() = default;
|
|
StringSet(std::initializer_list<StringRef> S) {
|
|
for (StringRef X : S)
|
|
insert(X);
|
|
}
|
|
explicit StringSet(AllocatorTy A) : base(A) {}
|
|
|
|
std::pair<typename base::iterator, bool> insert(StringRef Key) {
|
|
assert(!Key.empty());
|
|
return base::insert(std::make_pair(Key, '\0'));
|
|
}
|
|
|
|
template <typename InputIt>
|
|
void insert(const InputIt &Begin, const InputIt &End) {
|
|
for (auto It = Begin; It != End; ++It)
|
|
base::insert(std::make_pair(*It, '\0'));
|
|
}
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_ADT_STRINGSET_H
|