LLVM: lib/Target/DirectX/DXILWriter/DXILWriterPass.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

31

32using namespace llvm;

34

35namespace {

37 raw_ostream &OS;

38

39public:

40 static char ID;

41 WriteDXILPass() : ModulePass(ID), OS(dbgs()) {

43 }

44

45 explicit WriteDXILPass(raw_ostream &o) : ModulePass(ID), OS(o) {

47 }

48

49 StringRef getPassName() const override { return "Bitcode Writer"; }

50

51 bool runOnModule(Module &M) override {

53 return false;

54 }

55 void getAnalysisUsage(AnalysisUsage &AU) const override {

57 }

58};

59

60static void legalizeLifetimeIntrinsics(Module &M) {

64 Intrinsic::ID LifetimeIIDs[2] = {Intrinsic::lifetime_start,

65 Intrinsic::lifetime_end};

68 if (F)

69 continue;

70

71

72

73

74 AttributeList Attr;

75 Attr = Attr.addFnAttribute(Ctx, Attribute::NoUnwind);

76 FunctionCallee LifetimeCallee = M.getOrInsertFunction(

78

79

80

84 "Expected user of a lifetime intrinsic function to be a CallInst");

85

86

87

92

93

94

95

98 "The pointer operand of a lifetime intrinsic call must be an "

99 "AllocaInst");

100 std::optional AllocSize =

102 assert(AllocSize.has_value() &&

103 "Expected the allocation size of AllocaInst to be known");

105 LifetimeCallee,

106 {ConstantInt::get(I64Ty, AllocSize.value().getFixedValue()),

107 NoOpBitCast},

111

113 }

114

115 F->eraseFromParent();

116 }

117}

118

119static void removeLifetimeIntrinsics(Module &M) {

120 Intrinsic::ID LifetimeIIDs[2] = {Intrinsic::lifetime_start,

121 Intrinsic::lifetime_end};

124 if (F)

125 continue;

126

129 assert(CI && "Expected user of lifetime function to be a CallInst");

131 assert(BCI && "Expected pointer operand of CallInst to be a BitCastInst");

134 }

135 F->eraseFromParent();

136 }

137}

138

140public:

141 static char ID;

142 EmbedDXILPass() : ModulePass(ID) {

144 }

145

146 StringRef getPassName() const override { return "DXIL Embedder"; }

147

148 bool runOnModule(Module &M) override {

149 std::string Data;

150 llvm::raw_string_ostream OS(Data);

151

152

153

154 legalizeLifetimeIntrinsics(M);

155

157

158

159

160

161 removeLifetimeIntrinsics(M);

162

165 auto *GV = new llvm::GlobalVariable(M, ModuleConstant->getType(), true,

167 ModuleConstant, "dx.dxil");

168 GV->setSection("DXIL");

169 GV->setAlignment(Align(4));

171 return true;

172 }

173

174 void getAnalysisUsage(AnalysisUsage &AU) const override {

176 }

177};

178}

179

180char WriteDXILPass::ID = 0;

182 false, true)

186

188 return new WriteDXILPass(Str);

189}

190

191char EmbedDXILPass::ID = 0;

192INITIALIZE_PASS(EmbedDXILPass, "dxil-embed", "Embed DXIL", false, true)

193

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

This file contains the declarations for the subclasses of Constant, which represent the different fla...

This file provides a bitcode writing pass.

This file defines the DenseMap class.

Module.h This file contains the declarations for the Module class.

This header defines various interfaces for pass management in LLVM.

Machine Check Debug Module

This is the interface to build a ModuleSummaryIndex for a module.

#define INITIALIZE_PASS_DEPENDENCY(depName)

#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)

#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)

#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)

an instruction to allocate memory on the stack

LLVM_ABI std::optional< TypeSize > getAllocationSize(const DataLayout &DL) const

Get allocation size in bytes.

void setPreservesAll()

Set by analyses that do not transform their input at all.

Functions, function parameters, and return types can have attributes to indicate how they should be t...

This class represents a no-op cast from one type to another.

AttributeSet getParamAttributes(unsigned ArgNo) const

Return the param attributes for this call.

Value * getArgOperand(unsigned i) const

void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind)

Adds the attribute to the indicated argument.

This class represents a function call, abstracting a target machine's calling convention.

static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)

static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)

Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...

static Constant * get(LLVMContext &Context, ArrayRef< ElementTy > Elts)

get() constructor - Return a constant with array type with an element count and element type matching...

A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...

@ PrivateLinkage

Like Internal, but omit from symbol table.

LLVM_ABI InstListType::iterator eraseFromParent()

This method unlinks 'this' from the containing basic block and deletes it.

LLVM_ABI const DataLayout & getDataLayout() const

Get the data layout of the module this instruction belongs to.

static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)

This static method is the primary way of constructing an IntegerType.

This is an important class for using LLVM in a threaded context.

ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...

Legacy wrapper pass to provide the ModuleSummaryIndex object.

A Module instance is used to store all the information related to an LLVM module.

static LLVM_ABI PassRegistry * getPassRegistry()

getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...

static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)

This constructs a pointer to an object of the specified type in a numbered address space.

The instances of the Type class are immutable: once they are created, they are never changed.

static LLVM_ABI Type * getVoidTy(LLVMContext &C)

LLVM Value Representation.

Type * getType() const

All values are typed, get the type of this value.

self_iterator getIterator()

This class implements an extremely fast bulk output stream that can only output to a stream.

constexpr char Align[]

Key for Kernel::Arg::Metadata::mAlign.

LLVM_ABI StringRef getName(ID id)

Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx".

LLVM_ABI StringRef getBaseName(ID id)

Return the LLVM name for an intrinsic, without encoded types for overloading, such as "llvm....

void WriteDXILToFile(const Module &M, raw_ostream &Out)

Write the specified module to the specified raw output stream.

This is an optimization pass for GlobalISel generic memory operations.

ArrayRef< CharT > arrayRefFromStringRef(StringRef Input)

Construct a string ref from an array ref of unsigned chars.

decltype(auto) dyn_cast(const From &Val)

dyn_cast - Return the argument parameter cast to the specified type.

ModulePass * createDXILWriterPass(raw_ostream &Str)

Create and return a pass that writes the module to the specified ostream.

Definition DXILWriterPass.cpp:187

iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)

Make a range that does early increment to allow mutation of the underlying range without disrupting i...

LLVM_ABI raw_ostream & dbgs()

dbgs() - This returns a reference to a raw_ostream for debugging messages.

void initializeEmbedDXILPassPass(PassRegistry &)

Initializer for dxil embedder pass.

FunctionAddr VTableAddr uintptr_t uintptr_t Data

LLVM_ABI void appendToCompilerUsed(Module &M, ArrayRef< GlobalValue * > Values)

Adds global values to the llvm.compiler.used list.

ModulePass * createDXILEmbedderPass()

Create and return a pass that writes the module to a global variable in the module for later emission...

Definition DXILWriterPass.cpp:194

decltype(auto) cast(const From &Val)

cast - Return the argument parameter cast to the specified type.

void initializeWriteDXILPassPass(PassRegistry &)

Initializer for dxil writer pass.