mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-29 16:12:44 +00:00
now that AsmPrinter::EmitInlineAsm is factored right, we can eliminate the
cookie argument to the SourceMgr diagnostic stuff. This cleanly separates LLVMContext's inlineasm handler from the sourcemgr error handling definition, increasing type safety and cleaning things up. llvm-svn: 119486
This commit is contained in:
parent
f8ffd59ccb
commit
99b8654169
@ -21,6 +21,7 @@ class LLVMContextImpl;
|
||||
class StringRef;
|
||||
class Instruction;
|
||||
class Module;
|
||||
class SMDiagnostic;
|
||||
template <typename T> class SmallVectorImpl;
|
||||
|
||||
/// This is an important class for using LLVM in a threaded context. It
|
||||
@ -49,18 +50,23 @@ public:
|
||||
/// custom metadata IDs registered in this LLVMContext.
|
||||
void getMDKindNames(SmallVectorImpl<StringRef> &Result) const;
|
||||
|
||||
|
||||
typedef void (*InlineAsmDiagHandlerTy)(const SMDiagnostic&, void *Context,
|
||||
unsigned LocCookie);
|
||||
|
||||
/// setInlineAsmDiagnosticHandler - This method sets a handler that is invoked
|
||||
/// when problems with inline asm are detected by the backend. The first
|
||||
/// argument is a function pointer (of type SourceMgr::DiagHandlerTy) and the
|
||||
/// second is a context pointer that gets passed into the DiagHandler.
|
||||
/// argument is a function pointer and the second is a context pointer that
|
||||
/// gets passed into the DiagHandler.
|
||||
///
|
||||
/// LLVMContext doesn't take ownership or interpreter either of these
|
||||
/// LLVMContext doesn't take ownership or interpret either of these
|
||||
/// pointers.
|
||||
void setInlineAsmDiagnosticHandler(void *DiagHandler, void *DiagContext = 0);
|
||||
void setInlineAsmDiagnosticHandler(InlineAsmDiagHandlerTy DiagHandler,
|
||||
void *DiagContext = 0);
|
||||
|
||||
/// getInlineAsmDiagnosticHandler - Return the diagnostic handler set by
|
||||
/// setInlineAsmDiagnosticHandler.
|
||||
void *getInlineAsmDiagnosticHandler() const;
|
||||
InlineAsmDiagHandlerTy getInlineAsmDiagnosticHandler() const;
|
||||
|
||||
/// getInlineAsmDiagnosticContext - Return the diagnostic context set by
|
||||
/// setInlineAsmDiagnosticHandler.
|
||||
|
@ -36,8 +36,7 @@ public:
|
||||
/// DiagHandlerTy - Clients that want to handle their own diagnostics in a
|
||||
/// custom way can register a function pointer+context as a diagnostic
|
||||
/// handler. It gets called each time PrintMessage is invoked.
|
||||
typedef void (*DiagHandlerTy)(const SMDiagnostic&, void *Context,
|
||||
unsigned LocCookie);
|
||||
typedef void (*DiagHandlerTy)(const SMDiagnostic&, void *Context);
|
||||
private:
|
||||
struct SrcBuffer {
|
||||
/// Buffer - The memory buffer for the file.
|
||||
@ -61,7 +60,6 @@ private:
|
||||
|
||||
DiagHandlerTy DiagHandler;
|
||||
void *DiagContext;
|
||||
unsigned DiagLocCookie;
|
||||
|
||||
SourceMgr(const SourceMgr&); // DO NOT IMPLEMENT
|
||||
void operator=(const SourceMgr&); // DO NOT IMPLEMENT
|
||||
@ -74,12 +72,10 @@ public:
|
||||
}
|
||||
|
||||
/// setDiagHandler - Specify a diagnostic handler to be invoked every time
|
||||
/// PrintMessage is called. Ctx and Cookie are passed into the handler when
|
||||
/// it is invoked.
|
||||
void setDiagHandler(DiagHandlerTy DH, void *Ctx = 0, unsigned Cookie = 0) {
|
||||
/// PrintMessage is called. Ctx is passed into the handler when it is invoked.
|
||||
void setDiagHandler(DiagHandlerTy DH, void *Ctx = 0) {
|
||||
DiagHandler = DH;
|
||||
DiagContext = Ctx;
|
||||
DiagLocCookie = Cookie;
|
||||
}
|
||||
|
||||
const SrcBuffer &getBufferInfo(unsigned i) const {
|
||||
|
@ -37,7 +37,7 @@ using namespace llvm;
|
||||
namespace {
|
||||
struct SrcMgrDiagInfo {
|
||||
const MDNode *LocInfo;
|
||||
void *DiagHandler;
|
||||
LLVMContext::InlineAsmDiagHandlerTy DiagHandler;
|
||||
void *DiagContext;
|
||||
};
|
||||
}
|
||||
@ -45,8 +45,7 @@ namespace {
|
||||
/// SrcMgrDiagHandler - This callback is invoked when the SourceMgr for an
|
||||
/// inline asm has an error in it. diagInfo is a pointer to the SrcMgrDiagInfo
|
||||
/// struct above.
|
||||
static void SrcMgrDiagHandler(const SMDiagnostic &Diag, void *diagInfo,
|
||||
unsigned locCookie) {
|
||||
static void SrcMgrDiagHandler(const SMDiagnostic &Diag, void *diagInfo) {
|
||||
SrcMgrDiagInfo *DiagInfo = static_cast<SrcMgrDiagInfo *>(diagInfo);
|
||||
assert(DiagInfo && "Diagnostic context not passed down?");
|
||||
|
||||
@ -56,10 +55,7 @@ static void SrcMgrDiagHandler(const SMDiagnostic &Diag, void *diagInfo,
|
||||
if (const ConstantInt *CI = dyn_cast<ConstantInt>(LocInfo->getOperand(0)))
|
||||
LocCookie = CI->getZExtValue();
|
||||
|
||||
SourceMgr::DiagHandlerTy ChainHandler =
|
||||
(SourceMgr::DiagHandlerTy)(intptr_t)DiagInfo->DiagHandler;
|
||||
|
||||
ChainHandler(Diag, DiagInfo->DiagContext, LocCookie);
|
||||
DiagInfo->DiagHandler(Diag, DiagInfo->DiagContext, LocCookie);
|
||||
}
|
||||
|
||||
/// EmitInlineAsm - Emit a blob of inline asm to the output streamer.
|
||||
@ -85,11 +81,11 @@ void AsmPrinter::EmitInlineAsm(StringRef Str, const MDNode *LocMDNode) const {
|
||||
// If the current LLVMContext has an inline asm handler, set it in SourceMgr.
|
||||
LLVMContext &LLVMCtx = MMI->getModule()->getContext();
|
||||
bool HasDiagHandler = false;
|
||||
if (void *DiagHandler = LLVMCtx.getInlineAsmDiagnosticHandler()) {
|
||||
if (LLVMCtx.getInlineAsmDiagnosticHandler() != 0) {
|
||||
// If the source manager has an issue, we arrange for SrcMgrDiagHandler
|
||||
// to be invoked, getting DiagInfo passed into it.
|
||||
DiagInfo.LocInfo = LocMDNode;
|
||||
DiagInfo.DiagHandler = DiagHandler;
|
||||
DiagInfo.DiagHandler = LLVMCtx.getInlineAsmDiagnosticHandler();
|
||||
DiagInfo.DiagContext = LLVMCtx.getInlineAsmDiagnosticContext();
|
||||
SrcMgr.setDiagHandler(SrcMgrDiagHandler, &DiagInfo);
|
||||
HasDiagHandler = true;
|
||||
|
@ -178,8 +178,7 @@ void SourceMgr::PrintMessage(SMLoc Loc, const Twine &Msg,
|
||||
const char *Type, bool ShowLine) const {
|
||||
// Report the message with the diagnostic handler if present.
|
||||
if (DiagHandler) {
|
||||
DiagHandler(GetMessage(Loc, Msg, Type, ShowLine),
|
||||
DiagContext, DiagLocCookie);
|
||||
DiagHandler(GetMessage(Loc, Msg, Type, ShowLine), DiagContext);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -53,15 +53,17 @@ void LLVMContext::removeModule(Module *M) {
|
||||
// Recoverable Backend Errors
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
void LLVMContext::setInlineAsmDiagnosticHandler(void *DiagHandler,
|
||||
void *DiagContext) {
|
||||
void LLVMContext::
|
||||
setInlineAsmDiagnosticHandler(InlineAsmDiagHandlerTy DiagHandler,
|
||||
void *DiagContext) {
|
||||
pImpl->InlineAsmDiagHandler = DiagHandler;
|
||||
pImpl->InlineAsmDiagContext = DiagContext;
|
||||
}
|
||||
|
||||
/// getInlineAsmDiagnosticHandler - Return the diagnostic handler set by
|
||||
/// setInlineAsmDiagnosticHandler.
|
||||
void *LLVMContext::getInlineAsmDiagnosticHandler() const {
|
||||
LLVMContext::InlineAsmDiagHandlerTy
|
||||
LLVMContext::getInlineAsmDiagnosticHandler() const {
|
||||
return pImpl->InlineAsmDiagHandler;
|
||||
}
|
||||
|
||||
@ -95,8 +97,7 @@ void LLVMContext::emitError(unsigned LocCookie, StringRef ErrorStr) {
|
||||
// If we do have an error handler, we can report the error and keep going.
|
||||
SMDiagnostic Diag("", "error: " + ErrorStr.str());
|
||||
|
||||
((SourceMgr::DiagHandlerTy)(intptr_t)pImpl->InlineAsmDiagHandler)
|
||||
(Diag, pImpl->InlineAsmDiagContext, LocCookie);
|
||||
pImpl->InlineAsmDiagHandler(Diag, pImpl->InlineAsmDiagContext, LocCookie);
|
||||
|
||||
}
|
||||
|
||||
|
@ -119,7 +119,8 @@ public:
|
||||
/// will be automatically deleted if this context is deleted.
|
||||
SmallPtrSet<Module*, 4> OwnedModules;
|
||||
|
||||
void *InlineAsmDiagHandler, *InlineAsmDiagContext;
|
||||
LLVMContext::InlineAsmDiagHandlerTy InlineAsmDiagHandler;
|
||||
void *InlineAsmDiagContext;
|
||||
|
||||
typedef DenseMap<DenseMapAPIntKeyInfo::KeyTy, ConstantInt*,
|
||||
DenseMapAPIntKeyInfo> IntMapTy;
|
||||
|
Loading…
x
Reference in New Issue
Block a user