mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-26 14:25:18 +00:00
Revert r259035, it introduces a cyclic library dependency
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259045 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
39f8bee93d
commit
b95072ef89
@ -1,55 +0,0 @@
|
||||
//===- llvm/Support/DiagnosticInfoCodeGen.h - Diagnostic Declaration ---*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file declares the different classes involved in codegen diagnostics.
|
||||
//
|
||||
// Diagnostics reporting is still done as part of the LLVMContext.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CODEGEN_DIAGNOSTICINFOCODEGEN_H
|
||||
#define LLVM_CODEGEN_DIAGNOSTICINFOCODEGEN_H
|
||||
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/IR/DiagnosticInfo.h"
|
||||
#include "llvm/IR/DiagnosticPrinter.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
/// Diagnostic information for unsupported feature in backend.
|
||||
class DiagnosticInfoUnsupported
|
||||
: public DiagnosticInfoWithDebugLocBase {
|
||||
private:
|
||||
const Twine &Msg;
|
||||
const SDValue Value;
|
||||
|
||||
public:
|
||||
/// \p Fn is the function where the diagnostic is being emitted. \p DLoc is
|
||||
/// the location information to use in the diagnostic. If line table
|
||||
/// information is available, the diagnostic will include the source code
|
||||
/// location. \p Msg is the message to show. Note that this class does not
|
||||
/// copy this message, so this reference must be valid for the whole life time
|
||||
/// of the diagnostic.
|
||||
DiagnosticInfoUnsupported(const Function &Fn, const Twine &Msg,
|
||||
SDLoc DLoc = SDLoc(), SDValue Value = SDValue())
|
||||
: DiagnosticInfoWithDebugLocBase(DK_Unsupported, DS_Error, Fn,
|
||||
DLoc.getDebugLoc()),
|
||||
Msg(Msg), Value(Value) {}
|
||||
|
||||
static bool classof(const DiagnosticInfo *DI) {
|
||||
return DI->getKind() == DK_Unsupported;
|
||||
}
|
||||
|
||||
const Twine &getMessage() const { return Msg; }
|
||||
|
||||
void print(DiagnosticPrinter &DP) const;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
@ -60,7 +60,6 @@ enum DiagnosticKind {
|
||||
DK_OptimizationFailure,
|
||||
DK_MIRParser,
|
||||
DK_PGOProfile,
|
||||
DK_Unsupported,
|
||||
DK_FirstPluginKind
|
||||
};
|
||||
|
||||
@ -276,16 +275,32 @@ private:
|
||||
const Twine &Msg;
|
||||
};
|
||||
|
||||
/// Common features for diagnostics with an associated DebugLoc
|
||||
class DiagnosticInfoWithDebugLocBase : public DiagnosticInfo {
|
||||
/// Common features for diagnostics dealing with optimization remarks.
|
||||
class DiagnosticInfoOptimizationBase : public DiagnosticInfo {
|
||||
public:
|
||||
/// \p PassName is the name of the pass emitting this diagnostic.
|
||||
/// \p Fn is the function where the diagnostic is being emitted. \p DLoc is
|
||||
/// the location information to use in the diagnostic.
|
||||
DiagnosticInfoWithDebugLocBase(enum DiagnosticKind Kind,
|
||||
/// the location information to use in the diagnostic. If line table
|
||||
/// information is available, the diagnostic will include the source code
|
||||
/// location. \p Msg is the message to show. Note that this class does not
|
||||
/// copy this message, so this reference must be valid for the whole life time
|
||||
/// of the diagnostic.
|
||||
DiagnosticInfoOptimizationBase(enum DiagnosticKind Kind,
|
||||
enum DiagnosticSeverity Severity,
|
||||
const Function &Fn,
|
||||
const DebugLoc &DLoc)
|
||||
: DiagnosticInfo(Kind, Severity), Fn(Fn), DLoc(DLoc) {}
|
||||
const char *PassName, const Function &Fn,
|
||||
const DebugLoc &DLoc, const Twine &Msg)
|
||||
: DiagnosticInfo(Kind, Severity), PassName(PassName), Fn(Fn), DLoc(DLoc),
|
||||
Msg(Msg) {}
|
||||
|
||||
/// \see DiagnosticInfo::print.
|
||||
void print(DiagnosticPrinter &DP) const override;
|
||||
|
||||
/// Return true if this optimization remark is enabled by one of
|
||||
/// of the LLVM command line flags (-pass-remarks, -pass-remarks-missed,
|
||||
/// or -pass-remarks-analysis). Note that this only handles the LLVM
|
||||
/// flags. We cannot access Clang flags from here (they are handled
|
||||
/// in BackendConsumer::OptimizationRemarkHandler).
|
||||
virtual bool isEnabled() const = 0;
|
||||
|
||||
/// Return true if location information is available for this diagnostic.
|
||||
bool isLocationAvailable() const;
|
||||
@ -299,45 +314,9 @@ public:
|
||||
/// the source file name, line number and column.
|
||||
void getLocation(StringRef *Filename, unsigned *Line, unsigned *Column) const;
|
||||
|
||||
const char *getPassName() const { return PassName; }
|
||||
const Function &getFunction() const { return Fn; }
|
||||
const DebugLoc &getDebugLoc() const { return DLoc; }
|
||||
|
||||
private:
|
||||
/// Function where this diagnostic is triggered.
|
||||
const Function &Fn;
|
||||
|
||||
/// Debug location where this diagnostic is triggered.
|
||||
DebugLoc DLoc;
|
||||
};
|
||||
|
||||
/// Common features for diagnostics dealing with optimization remarks.
|
||||
class DiagnosticInfoOptimizationBase : public DiagnosticInfoWithDebugLocBase {
|
||||
public:
|
||||
/// \p PassName is the name of the pass emitting this diagnostic.
|
||||
/// \p Fn is the function where the diagnostic is being emitted. \p DLoc is
|
||||
/// the location information to use in the diagnostic. If line table
|
||||
/// information is available, the diagnostic will include the source code
|
||||
/// location. \p Msg is the message to show. Note that this class does not
|
||||
/// copy this message, so this reference must be valid for the whole life time
|
||||
/// of the diagnostic.
|
||||
DiagnosticInfoOptimizationBase(enum DiagnosticKind Kind,
|
||||
enum DiagnosticSeverity Severity,
|
||||
const char *PassName, const Function &Fn,
|
||||
const DebugLoc &DLoc, const Twine &Msg)
|
||||
: DiagnosticInfoWithDebugLocBase(Kind, Severity, Fn, DLoc),
|
||||
PassName(PassName), Msg(Msg) {}
|
||||
|
||||
/// \see DiagnosticInfo::print.
|
||||
void print(DiagnosticPrinter &DP) const override;
|
||||
|
||||
/// Return true if this optimization remark is enabled by one of
|
||||
/// of the LLVM command line flags (-pass-remarks, -pass-remarks-missed,
|
||||
/// or -pass-remarks-analysis). Note that this only handles the LLVM
|
||||
/// flags. We cannot access Clang flags from here (they are handled
|
||||
/// in BackendConsumer::OptimizationRemarkHandler).
|
||||
virtual bool isEnabled() const = 0;
|
||||
|
||||
const char *getPassName() const { return PassName; }
|
||||
const Twine &getMsg() const { return Msg; }
|
||||
|
||||
private:
|
||||
@ -346,6 +325,12 @@ private:
|
||||
/// be emitted.
|
||||
const char *PassName;
|
||||
|
||||
/// Function where this diagnostic is triggered.
|
||||
const Function &Fn;
|
||||
|
||||
/// Debug location where this diagnostic is triggered.
|
||||
DebugLoc DLoc;
|
||||
|
||||
/// Message to report.
|
||||
const Twine &Msg;
|
||||
};
|
||||
|
@ -18,7 +18,6 @@ add_llvm_library(LLVMCodeGen
|
||||
CriticalAntiDepBreaker.cpp
|
||||
DeadMachineInstructionElim.cpp
|
||||
DFAPacketizer.cpp
|
||||
DiagnosticInfoCodeGen.cpp
|
||||
DwarfEHPrepare.cpp
|
||||
EarlyIfConversion.cpp
|
||||
EdgeBundles.cpp
|
||||
|
@ -1,33 +0,0 @@
|
||||
//===- llvm/Support/DiagnosticInfoCodeGen.cpp - Diagnostic Definitions -*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines the different classes involved in codegen diagnostics.
|
||||
//
|
||||
// Diagnostics reporting is still done as part of the LLVMContext.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/CodeGen/DiagnosticInfoCodeGen.h"
|
||||
#include "llvm/IR/DiagnosticPrinter.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
void DiagnosticInfoUnsupported::print(DiagnosticPrinter &DP) const {
|
||||
std::string Str;
|
||||
raw_string_ostream OS(Str);
|
||||
|
||||
OS << getLocationStr() << ": in function " << getFunction().getName() << ' '
|
||||
<< *getFunction().getFunctionType() << ": " << Msg;
|
||||
if (Value)
|
||||
Value->print(OS);
|
||||
OS << '\n';
|
||||
OS.flush();
|
||||
DP << Str;
|
||||
}
|
||||
|
||||
}
|
@ -138,11 +138,11 @@ void DiagnosticInfoPGOProfile::print(DiagnosticPrinter &DP) const {
|
||||
DP << getMsg();
|
||||
}
|
||||
|
||||
bool DiagnosticInfoWithDebugLocBase::isLocationAvailable() const {
|
||||
bool DiagnosticInfoOptimizationBase::isLocationAvailable() const {
|
||||
return getDebugLoc();
|
||||
}
|
||||
|
||||
void DiagnosticInfoWithDebugLocBase::getLocation(StringRef *Filename,
|
||||
void DiagnosticInfoOptimizationBase::getLocation(StringRef *Filename,
|
||||
unsigned *Line,
|
||||
unsigned *Column) const {
|
||||
DILocation *L = getDebugLoc();
|
||||
@ -152,7 +152,7 @@ void DiagnosticInfoWithDebugLocBase::getLocation(StringRef *Filename,
|
||||
*Column = L->getColumn();
|
||||
}
|
||||
|
||||
const std::string DiagnosticInfoWithDebugLocBase::getLocationStr() const {
|
||||
const std::string DiagnosticInfoOptimizationBase::getLocationStr() const {
|
||||
StringRef Filename("<unknown>");
|
||||
unsigned Line = 0;
|
||||
unsigned Column = 0;
|
||||
|
26
lib/Target/AMDGPU/AMDGPUDiagnosticInfoUnsupported.cpp
Normal file
26
lib/Target/AMDGPU/AMDGPUDiagnosticInfoUnsupported.cpp
Normal file
@ -0,0 +1,26 @@
|
||||
//===-- AMDGPUDiagnosticInfoUnsupported.cpp -------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "AMDGPUDiagnosticInfoUnsupported.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
DiagnosticInfoUnsupported::DiagnosticInfoUnsupported(
|
||||
const Function &Fn,
|
||||
const Twine &Desc,
|
||||
DiagnosticSeverity Severity)
|
||||
: DiagnosticInfo(getKindID(), Severity),
|
||||
Description(Desc),
|
||||
Fn(Fn) { }
|
||||
|
||||
int DiagnosticInfoUnsupported::KindID = 0;
|
||||
|
||||
void DiagnosticInfoUnsupported::print(DiagnosticPrinter &DP) const {
|
||||
DP << "unsupported " << getDescription() << " in " << Fn.getName();
|
||||
}
|
48
lib/Target/AMDGPU/AMDGPUDiagnosticInfoUnsupported.h
Normal file
48
lib/Target/AMDGPU/AMDGPUDiagnosticInfoUnsupported.h
Normal file
@ -0,0 +1,48 @@
|
||||
//===-- AMDGPUDiagnosticInfoUnsupported.h - Error reporting -----*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUDIAGNOSTICINFOUNSUPPORTED_H
|
||||
#define LLVM_LIB_TARGET_AMDGPU_AMDGPUDIAGNOSTICINFOUNSUPPORTED_H
|
||||
|
||||
#include "llvm/IR/DiagnosticInfo.h"
|
||||
#include "llvm/IR/DiagnosticPrinter.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
/// Diagnostic information for unimplemented or unsupported feature reporting.
|
||||
class DiagnosticInfoUnsupported : public DiagnosticInfo {
|
||||
private:
|
||||
const Twine &Description;
|
||||
const Function &Fn;
|
||||
|
||||
static int KindID;
|
||||
|
||||
static int getKindID() {
|
||||
if (KindID == 0)
|
||||
KindID = llvm::getNextAvailablePluginDiagnosticKind();
|
||||
return KindID;
|
||||
}
|
||||
|
||||
public:
|
||||
DiagnosticInfoUnsupported(const Function &Fn, const Twine &Desc,
|
||||
DiagnosticSeverity Severity = DS_Error);
|
||||
|
||||
const Function &getFunction() const { return Fn; }
|
||||
const Twine &getDescription() const { return Description; }
|
||||
|
||||
void print(DiagnosticPrinter &DP) const override;
|
||||
|
||||
static bool classof(const DiagnosticInfo *DI) {
|
||||
return DI->getKind() == getKindID();
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
@ -12,6 +12,7 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "AMDGPUDiagnosticInfoUnsupported.h"
|
||||
#include "AMDGPUInstrInfo.h"
|
||||
#include "AMDGPUISelLowering.h" // For AMDGPUISD
|
||||
#include "AMDGPURegisterInfo.h"
|
||||
@ -20,7 +21,6 @@
|
||||
#include "SIDefines.h"
|
||||
#include "SIISelLowering.h"
|
||||
#include "SIMachineFunctionInfo.h"
|
||||
#include "llvm/CodeGen/DiagnosticInfoCodeGen.h"
|
||||
#include "llvm/CodeGen/FunctionLoweringInfo.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
@ -1220,7 +1220,7 @@ SDNode *AMDGPUDAGToDAGISel::SelectAddrSpaceCast(SDNode *N) {
|
||||
|
||||
const MachineFunction &MF = CurDAG->getMachineFunction();
|
||||
DiagnosticInfoUnsupported NotImplemented(*MF.getFunction(),
|
||||
"addrspacecast not implemented", DL);
|
||||
"addrspacecast not implemented");
|
||||
CurDAG->getContext()->diagnose(NotImplemented);
|
||||
|
||||
assert(Subtarget->hasFlatAddressSpace() &&
|
||||
|
@ -15,6 +15,7 @@
|
||||
|
||||
#include "AMDGPUISelLowering.h"
|
||||
#include "AMDGPU.h"
|
||||
#include "AMDGPUDiagnosticInfoUnsupported.h"
|
||||
#include "AMDGPUFrameLowering.h"
|
||||
#include "AMDGPUIntrinsicInfo.h"
|
||||
#include "AMDGPURegisterInfo.h"
|
||||
@ -22,7 +23,6 @@
|
||||
#include "R600MachineFunctionInfo.h"
|
||||
#include "SIMachineFunctionInfo.h"
|
||||
#include "llvm/CodeGen/CallingConvLower.h"
|
||||
#include "llvm/CodeGen/DiagnosticInfoCodeGen.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
@ -609,7 +609,7 @@ SDValue AMDGPUTargetLowering::LowerCall(CallLoweringInfo &CLI,
|
||||
else if (const GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
|
||||
FuncName = G->getGlobal()->getName();
|
||||
|
||||
DiagnosticInfoUnsupported NoCalls(Fn, "unsupported call to function " + FuncName, CLI.DL);
|
||||
DiagnosticInfoUnsupported NoCalls(Fn, "call to function " + FuncName);
|
||||
DAG.getContext()->diagnose(NoCalls);
|
||||
return SDValue();
|
||||
}
|
||||
@ -618,7 +618,7 @@ SDValue AMDGPUTargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
const Function &Fn = *DAG.getMachineFunction().getFunction();
|
||||
|
||||
DiagnosticInfoUnsupported NoDynamicAlloca(Fn, "unsupported dynamic alloca", SDLoc(Op));
|
||||
DiagnosticInfoUnsupported NoDynamicAlloca(Fn, "dynamic alloca");
|
||||
DAG.getContext()->diagnose(NoDynamicAlloca);
|
||||
return SDValue();
|
||||
}
|
||||
@ -865,8 +865,8 @@ SDValue AMDGPUTargetLowering::LowerGlobalAddress(AMDGPUMachineFunction* MFI,
|
||||
}
|
||||
|
||||
const Function &Fn = *DAG.getMachineFunction().getFunction();
|
||||
DiagnosticInfoUnsupported BadInit(
|
||||
Fn, "unsupported initializer for address space", SDLoc(Op));
|
||||
DiagnosticInfoUnsupported BadInit(Fn,
|
||||
"initializer for address space");
|
||||
DAG.getContext()->diagnose(BadInit);
|
||||
return SDValue();
|
||||
}
|
||||
|
@ -18,6 +18,7 @@ add_llvm_target(AMDGPUCodeGen
|
||||
AMDGPUAnnotateKernelFeatures.cpp
|
||||
AMDGPUAnnotateUniformValues.cpp
|
||||
AMDGPUAsmPrinter.cpp
|
||||
AMDGPUDiagnosticInfoUnsupported.cpp
|
||||
AMDGPUFrameLowering.cpp
|
||||
AMDGPUTargetObjectFile.cpp
|
||||
AMDGPUIntrinsicInfo.cpp
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
#include "SIISelLowering.h"
|
||||
#include "AMDGPU.h"
|
||||
#include "AMDGPUDiagnosticInfoUnsupported.h"
|
||||
#include "AMDGPUIntrinsicInfo.h"
|
||||
#include "AMDGPUSubtarget.h"
|
||||
#include "SIInstrInfo.h"
|
||||
@ -28,7 +29,6 @@
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/ADT/StringSwitch.h"
|
||||
#include "llvm/CodeGen/CallingConvLower.h"
|
||||
#include "llvm/CodeGen/DiagnosticInfoCodeGen.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
@ -591,8 +591,7 @@ SDValue SITargetLowering::LowerFormalArguments(
|
||||
|
||||
if (Subtarget->isAmdHsaOS() && Info->getShaderType() != ShaderType::COMPUTE) {
|
||||
const Function *Fn = MF.getFunction();
|
||||
DiagnosticInfoUnsupported NoGraphicsHSA(
|
||||
*Fn, "unsupported non-compute shaders with HSA", DL);
|
||||
DiagnosticInfoUnsupported NoGraphicsHSA(*Fn, "non-compute shaders with HSA");
|
||||
DAG.getContext()->diagnose(NoGraphicsHSA);
|
||||
return SDValue();
|
||||
}
|
||||
@ -1321,9 +1320,8 @@ SDValue SITargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
|
||||
switch (IntrinsicID) {
|
||||
case Intrinsic::amdgcn_dispatch_ptr:
|
||||
if (!Subtarget->isAmdHsaOS()) {
|
||||
DiagnosticInfoUnsupported BadIntrin(
|
||||
*MF.getFunction(), "unsupported hsa intrinsic without hsa target",
|
||||
DL);
|
||||
DiagnosticInfoUnsupported BadIntrin(*MF.getFunction(),
|
||||
"hsa intrinsic without hsa target");
|
||||
DAG.getContext()->diagnose(BadIntrin);
|
||||
return DAG.getUNDEF(VT);
|
||||
}
|
||||
|
@ -17,7 +17,6 @@
|
||||
#include "BPFTargetMachine.h"
|
||||
#include "BPFSubtarget.h"
|
||||
#include "llvm/CodeGen/CallingConvLower.h"
|
||||
#include "llvm/CodeGen/DiagnosticInfoCodeGen.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
@ -29,10 +28,66 @@
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/IR/DiagnosticInfo.h"
|
||||
#include "llvm/IR/DiagnosticPrinter.h"
|
||||
using namespace llvm;
|
||||
|
||||
#define DEBUG_TYPE "bpf-lower"
|
||||
|
||||
namespace {
|
||||
|
||||
// Diagnostic information for unimplemented or unsupported feature reporting.
|
||||
class DiagnosticInfoUnsupported : public DiagnosticInfo {
|
||||
private:
|
||||
// Debug location where this diagnostic is triggered.
|
||||
DebugLoc DLoc;
|
||||
const Twine &Description;
|
||||
const Function &Fn;
|
||||
SDValue Value;
|
||||
|
||||
static int KindID;
|
||||
|
||||
static int getKindID() {
|
||||
if (KindID == 0)
|
||||
KindID = llvm::getNextAvailablePluginDiagnosticKind();
|
||||
return KindID;
|
||||
}
|
||||
|
||||
public:
|
||||
DiagnosticInfoUnsupported(SDLoc DLoc, const Function &Fn, const Twine &Desc,
|
||||
SDValue Value)
|
||||
: DiagnosticInfo(getKindID(), DS_Error), DLoc(DLoc.getDebugLoc()),
|
||||
Description(Desc), Fn(Fn), Value(Value) {}
|
||||
|
||||
void print(DiagnosticPrinter &DP) const override {
|
||||
std::string Str;
|
||||
raw_string_ostream OS(Str);
|
||||
|
||||
if (DLoc) {
|
||||
auto DIL = DLoc.get();
|
||||
StringRef Filename = DIL->getFilename();
|
||||
unsigned Line = DIL->getLine();
|
||||
unsigned Column = DIL->getColumn();
|
||||
OS << Filename << ':' << Line << ':' << Column << ' ';
|
||||
}
|
||||
|
||||
OS << "in function " << Fn.getName() << ' ' << *Fn.getFunctionType() << '\n'
|
||||
<< Description;
|
||||
if (Value)
|
||||
Value->print(OS);
|
||||
OS << '\n';
|
||||
OS.flush();
|
||||
DP << Str;
|
||||
}
|
||||
|
||||
static bool classof(const DiagnosticInfo *DI) {
|
||||
return DI->getKind() == getKindID();
|
||||
}
|
||||
};
|
||||
|
||||
int DiagnosticInfoUnsupported::KindID = 0;
|
||||
}
|
||||
|
||||
BPFTargetLowering::BPFTargetLowering(const TargetMachine &TM,
|
||||
const BPFSubtarget &STI)
|
||||
: TargetLowering(TM) {
|
||||
@ -181,16 +236,16 @@ SDValue BPFTargetLowering::LowerFormalArguments(
|
||||
InVals.push_back(ArgValue);
|
||||
}
|
||||
} else {
|
||||
DiagnosticInfoUnsupported Err(
|
||||
*MF.getFunction(), "defined with too many args", DL);
|
||||
DiagnosticInfoUnsupported Err(DL, *MF.getFunction(),
|
||||
"defined with too many args", SDValue());
|
||||
DAG.getContext()->diagnose(Err);
|
||||
}
|
||||
}
|
||||
|
||||
if (IsVarArg || MF.getFunction()->hasStructRetAttr()) {
|
||||
DiagnosticInfoUnsupported Err(
|
||||
*MF.getFunction(),
|
||||
"functions with VarArgs or StructRet are not supported", DL);
|
||||
DL, *MF.getFunction(),
|
||||
"functions with VarArgs or StructRet are not supported", SDValue());
|
||||
DAG.getContext()->diagnose(Err);
|
||||
}
|
||||
|
||||
@ -230,8 +285,8 @@ SDValue BPFTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
unsigned NumBytes = CCInfo.getNextStackOffset();
|
||||
|
||||
if (Outs.size() >= 6) {
|
||||
DiagnosticInfoUnsupported Err(*MF.getFunction(), "too many args to ",
|
||||
CLI.DL, Callee);
|
||||
DiagnosticInfoUnsupported Err(CLI.DL, *MF.getFunction(),
|
||||
"too many args to ", Callee);
|
||||
DAG.getContext()->diagnose(Err);
|
||||
}
|
||||
|
||||
@ -240,8 +295,8 @@ SDValue BPFTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
||||
if (!Flags.isByVal())
|
||||
continue;
|
||||
|
||||
DiagnosticInfoUnsupported Err(
|
||||
*MF.getFunction(), "pass by value not supported ", CLI.DL, Callee);
|
||||
DiagnosticInfoUnsupported Err(CLI.DL, *MF.getFunction(),
|
||||
"pass by value not supported ", Callee);
|
||||
DAG.getContext()->diagnose(Err);
|
||||
}
|
||||
|
||||
@ -343,8 +398,8 @@ BPFTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
|
||||
CCState CCInfo(CallConv, IsVarArg, MF, RVLocs, *DAG.getContext());
|
||||
|
||||
if (MF.getFunction()->getReturnType()->isAggregateType()) {
|
||||
DiagnosticInfoUnsupported Err(
|
||||
*MF.getFunction(), "only integer returns supported", DL);
|
||||
DiagnosticInfoUnsupported Err(DL, *MF.getFunction(),
|
||||
"only integer returns supported", SDValue());
|
||||
DAG.getContext()->diagnose(Err);
|
||||
}
|
||||
|
||||
@ -388,8 +443,8 @@ SDValue BPFTargetLowering::LowerCallResult(
|
||||
CCState CCInfo(CallConv, IsVarArg, MF, RVLocs, *DAG.getContext());
|
||||
|
||||
if (Ins.size() >= 2) {
|
||||
DiagnosticInfoUnsupported Err(*MF.getFunction(),
|
||||
"only small returns supported", DL);
|
||||
DiagnosticInfoUnsupported Err(DL, *MF.getFunction(),
|
||||
"only small returns supported", SDValue());
|
||||
DAG.getContext()->diagnose(Err);
|
||||
}
|
||||
|
||||
|
@ -19,10 +19,10 @@
|
||||
#include "WebAssemblyTargetMachine.h"
|
||||
#include "llvm/CodeGen/Analysis.h"
|
||||
#include "llvm/CodeGen/CallingConvLower.h"
|
||||
#include "llvm/CodeGen/DiagnosticInfoCodeGen.h"
|
||||
#include "llvm/CodeGen/MachineJumpTableInfo.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/IR/DiagnosticInfo.h"
|
||||
#include "llvm/IR/DiagnosticPrinter.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/Intrinsics.h"
|
||||
@ -35,6 +35,61 @@ using namespace llvm;
|
||||
|
||||
#define DEBUG_TYPE "wasm-lower"
|
||||
|
||||
namespace {
|
||||
// Diagnostic information for unimplemented or unsupported feature reporting.
|
||||
// TODO: This code is copied from BPF and AMDGPU; consider factoring it out
|
||||
// and sharing code.
|
||||
class DiagnosticInfoUnsupported final : public DiagnosticInfo {
|
||||
private:
|
||||
// Debug location where this diagnostic is triggered.
|
||||
DebugLoc DLoc;
|
||||
const Twine &Description;
|
||||
const Function &Fn;
|
||||
SDValue Value;
|
||||
|
||||
static int KindID;
|
||||
|
||||
static int getKindID() {
|
||||
if (KindID == 0)
|
||||
KindID = llvm::getNextAvailablePluginDiagnosticKind();
|
||||
return KindID;
|
||||
}
|
||||
|
||||
public:
|
||||
DiagnosticInfoUnsupported(SDLoc DLoc, const Function &Fn, const Twine &Desc,
|
||||
SDValue Value)
|
||||
: DiagnosticInfo(getKindID(), DS_Error), DLoc(DLoc.getDebugLoc()),
|
||||
Description(Desc), Fn(Fn), Value(Value) {}
|
||||
|
||||
void print(DiagnosticPrinter &DP) const override {
|
||||
std::string Str;
|
||||
raw_string_ostream OS(Str);
|
||||
|
||||
if (DLoc) {
|
||||
auto DIL = DLoc.get();
|
||||
StringRef Filename = DIL->getFilename();
|
||||
unsigned Line = DIL->getLine();
|
||||
unsigned Column = DIL->getColumn();
|
||||
OS << Filename << ':' << Line << ':' << Column << ' ';
|
||||
}
|
||||
|
||||
OS << "in function " << Fn.getName() << ' ' << *Fn.getFunctionType() << '\n'
|
||||
<< Description;
|
||||
if (Value)
|
||||
Value->print(OS);
|
||||
OS << '\n';
|
||||
OS.flush();
|
||||
DP << Str;
|
||||
}
|
||||
|
||||
static bool classof(const DiagnosticInfo *DI) {
|
||||
return DI->getKind() == getKindID();
|
||||
}
|
||||
};
|
||||
|
||||
int DiagnosticInfoUnsupported::KindID = 0;
|
||||
} // end anonymous namespace
|
||||
|
||||
WebAssemblyTargetLowering::WebAssemblyTargetLowering(
|
||||
const TargetMachine &TM, const WebAssemblySubtarget &STI)
|
||||
: TargetLowering(TM), Subtarget(&STI) {
|
||||
@ -255,7 +310,7 @@ bool WebAssemblyTargetLowering::allowsMisalignedMemoryAccesses(
|
||||
static void fail(SDLoc DL, SelectionDAG &DAG, const char *msg) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
DAG.getContext()->diagnose(
|
||||
DiagnosticInfoUnsupported(*MF.getFunction(), msg, DL));
|
||||
DiagnosticInfoUnsupported(DL, *MF.getFunction(), msg, SDValue()));
|
||||
}
|
||||
|
||||
// Test whether the given calling convention is supported.
|
||||
|
@ -1,6 +1,6 @@
|
||||
; RUN: not llc -O0 -march=amdgcn -mcpu=bonaire -mattr=-promote-alloca < %s 2>&1 | FileCheck -check-prefix=ERROR %s
|
||||
|
||||
; ERROR: addrspacecast not implemented
|
||||
; ERROR: unsupported addrspacecast not implemented
|
||||
|
||||
; XUN: llc -O0 -march=amdgcn -mcpu=bonaire -mattr=-promote-alloca < %s | FileCheck -check-prefix=CHECK -check-prefix=CHECK-NO-PROMOTE %s
|
||||
; XUN: llc -O0 -march=amdgcn -mcpu=bonaire -mattr=+promote-alloca < %s | FileCheck -check-prefix=CHECK -check-prefix=CHECK-PROMOTE %s
|
||||
|
@ -2,7 +2,7 @@
|
||||
; RUN: not llc -march=amdgcn -mcpu=tonga -verify-machineinstrs< %s 2>&1 | FileCheck %s
|
||||
; RUN: not llc -march=r600 -mcpu=cypress < %s 2>&1 | FileCheck %s
|
||||
|
||||
; CHECK: in function test_call_external{{.*}}: unsupported call to function external_function
|
||||
; CHECK: error: unsupported call to function external_function in test_call_external
|
||||
|
||||
|
||||
declare i32 @external_function(i32) nounwind
|
||||
|
@ -2,7 +2,7 @@
|
||||
; RUN: not llc -march=amdgcn -mcpu=tahiti -mattr=-promote-alloca -verify-machineinstrs < %s 2>&1 | FileCheck %s
|
||||
; RUN: not llc -march=r600 -mcpu=cypress < %s 2>&1 | FileCheck %s
|
||||
|
||||
; CHECK: in function test_dynamic_stackalloc{{.*}}: unsupported dynamic alloca
|
||||
; CHECK: error: unsupported dynamic alloca in test_dynamic_stackalloc
|
||||
|
||||
define void @test_dynamic_stackalloc(i32 addrspace(1)* %out, i32 %n) {
|
||||
%alloca = alloca i32, i32 %n
|
||||
|
@ -1,7 +1,7 @@
|
||||
; RUN: not llc -march=amdgcn -mcpu=SI < %s 2>&1 | FileCheck %s
|
||||
; RUN: not llc -march=amdgcn -mcpu=tonga < %s 2>&1 | FileCheck %s
|
||||
|
||||
; CHECK: in function load_init_global_global{{.*}}: unsupported initializer for address space
|
||||
; CHECK: error: unsupported initializer for address space in load_init_global_global
|
||||
|
||||
@lds = addrspace(1) global [256 x i32] zeroinitializer
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
; RUN: not llc -march=amdgcn -mcpu=SI < %s 2>&1 | FileCheck %s
|
||||
; RUN: not llc -march=amdgcn -mcpu=tonga < %s 2>&1 | FileCheck %s
|
||||
|
||||
; CHECK: in function load_init_lds_global{{.*}}: unsupported initializer for address space
|
||||
; CHECK: error: unsupported initializer for address space in load_init_lds_global
|
||||
|
||||
@lds = addrspace(3) global [8 x i32] [i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8]
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
; RUN: not llc -march=amdgcn -mcpu=SI < %s 2>&1 | FileCheck %s
|
||||
; RUN: not llc -march=amdgcn -mcpu=tonga < %s 2>&1 | FileCheck %s
|
||||
|
||||
; CHECK: in function load_zeroinit_lds_global{{.*}}: unsupported initializer for address space
|
||||
; CHECK: error: unsupported initializer for address space in load_zeroinit_lds_global
|
||||
|
||||
@lds = addrspace(3) global [256 x i32] zeroinitializer
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=kaveri -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
|
||||
; RUN: not llc -mtriple=amdgcn-unknown-unknown -mcpu=kaveri -verify-machineinstrs < %s 2>&1 | FileCheck -check-prefix=ERROR %s
|
||||
|
||||
; ERROR: in function test{{.*}}: unsupported hsa intrinsic without hsa target
|
||||
; ERROR: error: unsupported hsa intrinsic without hsa target in test
|
||||
|
||||
; GCN-LABEL: {{^}}test:
|
||||
; GCN: enable_sgpr_dispatch_ptr = 1
|
||||
|
@ -1,6 +1,6 @@
|
||||
; RUN: not llc -march=amdgcn -mtriple=amdgcn-unknown-amdhsa < %s 2>&1 | FileCheck %s
|
||||
|
||||
; CHECK: in function pixel_s{{.*}}: unsupported non-compute shaders with HSA
|
||||
; CHECK: error: unsupported non-compute shaders with HSA in pixel_shader
|
||||
define void @pixel_shader() #0 {
|
||||
ret void
|
||||
}
|
||||
|
@ -6,7 +6,7 @@
|
||||
declare void @foo(float*) #0
|
||||
declare void @foo.varargs(...) #0
|
||||
|
||||
; CHECK: in function crash_call_constexpr_cast{{.*}}: unsupported call to function foo
|
||||
; CHECK: error: unsupported call to function foo in crash_call_constexpr_cast
|
||||
define void @crash_call_constexpr_cast() #0 {
|
||||
%alloca = alloca i32
|
||||
call void bitcast (void (float*)* @foo to void (i32*)*)(i32* %alloca) #0
|
||||
|
Loading…
x
Reference in New Issue
Block a user