40 строки
1.8 KiB
C++
40 строки
1.8 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// DxilPoisonValues.h //
|
|
// Copyright (C) Microsoft Corporation. All rights reserved. //
|
|
// This file is distributed under the University of Illinois Open Source //
|
|
// License. See LICENSE.TXT for details. //
|
|
// //
|
|
// Allows insertion of poisoned values with error messages that get //
|
|
// cleaned up late in the compiler. //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
#pragma once
|
|
|
|
#include "llvm/IR/DebugLoc.h"
|
|
|
|
namespace llvm {
|
|
class Instruction;
|
|
class Type;
|
|
class Value;
|
|
class Module;
|
|
} // namespace llvm
|
|
|
|
namespace hlsl {
|
|
// Create a special dx.poison.* instruction with debug location and an error
|
|
// message. The reason for this is certain invalid code is allowed in the code
|
|
// as long as it is removed by optimization at the end of compilation. We only
|
|
// want to emit the error for real if we are sure the code with the problem is
|
|
// in the final DXIL.
|
|
//
|
|
// This "emits" an error message with the specified type. If by the end the
|
|
// compilation it is still used, then FinalizePoisonValues will emit the correct
|
|
// error for real.
|
|
llvm::Value *CreatePoisonValue(llvm::Type *ty, const llvm::Twine &errMsg,
|
|
llvm::DebugLoc DL, llvm::Instruction *InsertPt);
|
|
|
|
// If there's any dx.poison.* values present in the module, emit them. Returns
|
|
// true M was modified in any way.
|
|
bool FinalizePoisonValues(llvm::Module &M);
|
|
} // namespace hlsl
|