Lines Matching full:builder
1 //===- ConstantInitBuilder.h - Builder for LLVM IR constants ----*- C++ -*-===//
35 /// A convenience builder class for complex constant initializers,
40 /// ConstantInitBuilder builder(CGM);
41 /// auto toplevel = builder.beginStruct();
43 /// auto widgetArray = builder.beginArray();
102 ConstantInitBuilderBase &Builder;
112 return Builder.Buffer;
116 return Builder.Buffer;
119 ConstantAggregateBuilderBase(ConstantInitBuilderBase &builder,
121 : Builder(builder), Parent(parent), Begin(builder.Buffer.size()) {
123 assert(!parent->Frozen && "parent already has child builder active");
126 assert(!builder.Frozen && "builder already has child builder active");
127 builder.Frozen = true;
132 assert(Finished && "didn't finish aggregate builder");
136 assert(!Frozen && "child builder still active");
137 assert(!Finished && "builder already finished");
141 "parent not frozen while child builder active");
144 assert(Builder.Frozen &&
145 "builder not frozen while child builder active");
146 Builder.Frozen = false;
159 : Builder(other.Builder), Parent(other.Parent), Begin(other.Begin),
171 assert(!this->Finished && "cannot query after finishing builder");
172 assert(!this->Frozen && "cannot query while sub-builder is active");
182 /// Abandon this builder completely.
185 Builder.abandon(Begin);
191 assert(!Finished && "cannot add more values after finishing builder");
193 Builder.Buffer.push_back(value);
217 assert(!Finished && "cannot add more values after finishing builder");
219 Builder.Buffer.append(values.begin(), values.end());
260 assert(!Finished && "cannot add more values after finishing builder");
262 return getOffsetFromGlobalTo(Builder.Buffer.size());
275 /// (2) finishing the entire builder.
282 assert(!Finished && "cannot add more values after finishing builder");
284 Builder.Buffer.push_back(nullptr);
285 return Builder.Buffer.size() - 1;
300 assert(!Finished && "cannot change values after finishing builder");
302 llvm::Constant *&slot = Builder.Buffer[position.Index];
325 getGEPIndicesTo(indices, Builder.Buffer.size());
358 ConstantAggregateBuilderTemplateBase(InitBuilder &builder,
360 : super(builder, parent) {}
366 return ArrayBuilder(static_cast<InitBuilder&>(this->Builder), this, eltTy);
370 return StructBuilder(static_cast<InitBuilder&>(this->Builder), this, ty);
373 /// Given that this builder was created by beginning an array or struct
374 /// component on the given parent builder, finish the array/struct
379 /// builder. This aids in readability by making it easier to find the
380 /// places that add components to a builder, as well as "bookending"
381 /// the sub-builder more explicitly.
383 assert(this->Parent == &parent && "adding to non-parent builder");
387 /// Given that this builder was created by beginning an array or struct
392 assert(!this->Parent && "finishing non-root builder");
393 return this->Builder.createGlobal(asImpl().finishImpl(),
397 /// Given that this builder was created by beginning an array or struct
401 assert(!this->Parent && "finishing non-root builder");
402 return this->Builder.setGlobalInitializer(global, asImpl().finishImpl());
405 /// Given that this builder was created by beginning an array or struct
412 /// a dependency on the original builder; it is an error to pass it aside.
414 assert(!this->Parent && "finishing non-root builder");
415 return this->Builder.createFuture(asImpl().finishImpl());
437 ConstantArrayBuilderTemplateBase(InitBuilder &builder,
440 : super(builder, parent), EltTy(eltTy) {}
444 /// builder.
451 /// easily customize the builder classes used by ConstantInitBuilder,
473 ConstantStructBuilderTemplateBase(InitBuilder &builder,
476 : super(builder, parent), StructTy(structTy) {
495 /// builder.
502 /// easily customize the builder classes used by ConstantInitBuilder,
556 ConstantArrayBuilder(ConstantInitBuilder &builder,
559 : ConstantArrayBuilderTemplateBase(builder, parent, eltTy) {}
573 ConstantStructBuilder(ConstantInitBuilder &builder,
576 : ConstantStructBuilderTemplateBase(builder, parent, structTy) {}