<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Nov 19, 2016, at 1:06 PM, Galina Kistanova <<a href="mailto:gkistanova@gmail.com" class="">gkistanova@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class=""><div class=""><div class=""><div class="">Hello John,<br class=""><br class=""></div>This change has introduced alignment problems for some variables.<br class=""><br class="">The build bots are broken.<br class=""><a href="http://lab.llvm.org:8011/builders/clang-3stage-ubuntu/builds/355" class="">http://lab.llvm.org:8011/builders/clang-3stage-ubuntu/builds/355</a><br class=""><a href="http://lab.llvm.org:8011/builders/clang-with-lto-ubuntu/builds/308" class="">http://lab.llvm.org:8011/builders/clang-with-lto-ubuntu/builds/308</a><br class=""><br class=""></div>Could you take care of the issue, please?<br class=""></div></div></div></div></blockquote><div><br class=""></div>Please let me know if r287458 fixes the problem.</div><div><br class=""></div><div>John.</div><div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><div class=""><br class=""></div>Thanks<br class=""><br class=""></div>Galina<br class=""><br class=""><div class=""><div class=""><br class=""></div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Sat, Nov 19, 2016 at 12:17 AM, John McCall via cfe-commits <span dir="ltr" class=""><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rjmccall<br class="">
Date: Sat Nov 19 02:17:24 2016<br class="">
New Revision: 287437<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=287437&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project?rev=287437&view=rev</a><br class="">
Log:<br class="">
Introduce a helper class for building complex constant initializers. NFC.<br class="">
<br class="">
I've adopted this in most of the places it makes sense, but v-tables<br class="">
and CGObjCMac will need a second pass.<br class="">
<br class="">
Added:<br class="">
cfe/trunk/lib/CodeGen/<wbr class="">ConstantBuilder.h<br class="">
Modified:<br class="">
cfe/trunk/include/clang/AST/<wbr class="">DeclObjC.h<br class="">
cfe/trunk/lib/CodeGen/<wbr class="">CGBlocks.cpp<br class="">
cfe/trunk/lib/CodeGen/<wbr class="">CGCUDANV.cpp<br class="">
cfe/trunk/lib/CodeGen/<wbr class="">CGObjCGNU.cpp<br class="">
cfe/trunk/lib/CodeGen/<wbr class="">CGOpenMPRuntime.cpp<br class="">
cfe/trunk/lib/CodeGen/<wbr class="">CodeGenModule.cpp<br class="">
<br class="">
Modified: cfe/trunk/include/clang/AST/<wbr class="">DeclObjC.h<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclObjC.h?rev=287437&r1=287436&r2=287437&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/include/<wbr class="">clang/AST/DeclObjC.h?rev=<wbr class="">287437&r1=287436&r2=287437&<wbr class="">view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/include/clang/AST/<wbr class="">DeclObjC.h (original)<br class="">
+++ cfe/trunk/include/clang/AST/<wbr class="">DeclObjC.h Sat Nov 19 02:17:24 2016<br class="">
@@ -870,6 +870,9 @@ public:<br class="">
PropertyControl getPropertyImplementation() const {<br class="">
return PropertyControl(<wbr class="">PropertyImplementation);<br class="">
}<br class="">
+ bool isOptional() const {<br class="">
+ return getPropertyImplementation() == PropertyControl::Optional;<br class="">
+ }<br class="">
<br class="">
void setPropertyIvarDecl(<wbr class="">ObjCIvarDecl *Ivar) {<br class="">
PropertyIvarDecl = Ivar;<br class="">
<br class="">
Modified: cfe/trunk/lib/CodeGen/<wbr class="">CGBlocks.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBlocks.cpp?rev=287437&r1=287436&r2=287437&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/CodeGen/<wbr class="">CGBlocks.cpp?rev=287437&r1=<wbr class="">287436&r2=287437&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/lib/CodeGen/<wbr class="">CGBlocks.cpp (original)<br class="">
+++ cfe/trunk/lib/CodeGen/<wbr class="">CGBlocks.cpp Sat Nov 19 02:17:24 2016<br class="">
@@ -16,6 +16,7 @@<br class="">
#include "CGObjCRuntime.h"<br class="">
#include "CodeGenFunction.h"<br class="">
#include "CodeGenModule.h"<br class="">
+#include "ConstantBuilder.h"<br class="">
#include "clang/AST/DeclObjC.h"<br class="">
#include "llvm/ADT/SmallSet.h"<br class="">
#include "llvm/IR/CallSite.h"<br class="">
@@ -77,63 +78,63 @@ static llvm::Constant *buildBlockDescrip<br class="">
const CGBlockInfo &blockInfo) {<br class="">
ASTContext &C = CGM.getContext();<br class="">
<br class="">
- llvm::Type *ulong = CGM.getTypes().ConvertType(C.<wbr class="">UnsignedLongTy);<br class="">
- llvm::Type *i8p = nullptr;<br class="">
+ llvm::IntegerType *ulong =<br class="">
+ cast<llvm::IntegerType>(CGM.<wbr class="">getTypes().ConvertType(C.<wbr class="">UnsignedLongTy));<br class="">
+ llvm::PointerType *i8p = nullptr;<br class="">
if (CGM.getLangOpts().OpenCL)<br class="">
i8p =<br class="">
llvm::Type::getInt8PtrTy(<br class="">
CGM.getLLVMContext(), C.getTargetAddressSpace(<wbr class="">LangAS::opencl_constant));<br class="">
else<br class="">
- i8p = CGM.getTypes().ConvertType(C.<wbr class="">VoidPtrTy);<br class="">
+ i8p = CGM.VoidPtrTy;<br class="">
<br class="">
- SmallVector<llvm::Constant*, 6> elements;<br class="">
+ ConstantBuilder builder(CGM);<br class="">
+ auto elements = builder.beginStruct();<br class="">
<br class="">
// reserved<br class="">
- elements.push_back(llvm::<wbr class="">ConstantInt::get(ulong, 0));<br class="">
+ elements.addInt(ulong, 0);<br class="">
<br class="">
// Size<br class="">
// FIXME: What is the right way to say this doesn't fit? We should give<br class="">
// a user diagnostic in that case. Better fix would be to change the<br class="">
// API to size_t.<br class="">
- elements.push_back(llvm::<wbr class="">ConstantInt::get(ulong,<br class="">
- blockInfo.BlockSize.<wbr class="">getQuantity()));<br class="">
+ elements.addInt(ulong, blockInfo.BlockSize.<wbr class="">getQuantity());<br class="">
<br class="">
// Optional copy/dispose helpers.<br class="">
if (blockInfo.NeedsCopyDispose) {<br class="">
// copy_func_helper_decl<br class="">
- elements.push_back(<wbr class="">buildCopyHelper(CGM, blockInfo));<br class="">
+ elements.add(buildCopyHelper(<wbr class="">CGM, blockInfo));<br class="">
<br class="">
// destroy_func_decl<br class="">
- elements.push_back(<wbr class="">buildDisposeHelper(CGM, blockInfo));<br class="">
+ elements.add(<wbr class="">buildDisposeHelper(CGM, blockInfo));<br class="">
}<br class="">
<br class="">
// Signature. Mandatory ObjC-style method descriptor @encode sequence.<br class="">
std::string typeAtEncoding =<br class="">
CGM.getContext().<wbr class="">getObjCEncodingForBlock(<wbr class="">blockInfo.getBlockExpr());<br class="">
- elements.push_back(llvm::<wbr class="">ConstantExpr::getBitCast(<br class="">
+ elements.add(llvm::<wbr class="">ConstantExpr::getBitCast(<br class="">
CGM.GetAddrOfConstantCString(<wbr class="">typeAtEncoding).getPointer(), i8p));<br class="">
<br class="">
// GC layout.<br class="">
if (C.getLangOpts().ObjC1) {<br class="">
if (CGM.getLangOpts().getGC() != LangOptions::NonGC)<br class="">
- elements.push_back(CGM.<wbr class="">getObjCRuntime().<wbr class="">BuildGCBlockLayout(CGM, blockInfo));<br class="">
+ elements.add(CGM.<wbr class="">getObjCRuntime().<wbr class="">BuildGCBlockLayout(CGM, blockInfo));<br class="">
else<br class="">
- elements.push_back(CGM.<wbr class="">getObjCRuntime().<wbr class="">BuildRCBlockLayout(CGM, blockInfo));<br class="">
+ elements.add(CGM.<wbr class="">getObjCRuntime().<wbr class="">BuildRCBlockLayout(CGM, blockInfo));<br class="">
}<br class="">
else<br class="">
- elements.push_back(llvm::<wbr class="">Constant::getNullValue(i8p));<br class="">
-<br class="">
- llvm::Constant *init = llvm::ConstantStruct::getAnon(<wbr class="">elements);<br class="">
+ elements.addNullPointer(i8p);<br class="">
<br class="">
unsigned AddrSpace = 0;<br class="">
if (C.getLangOpts().OpenCL)<br class="">
AddrSpace = C.getTargetAddressSpace(<wbr class="">LangAS::opencl_constant);<br class="">
+<br class="">
llvm::GlobalVariable *global =<br class="">
- new llvm::GlobalVariable(CGM.<wbr class="">getModule(), init->getType(), true,<br class="">
- llvm::GlobalValue::<wbr class="">InternalLinkage,<br class="">
- init, "__block_descriptor_tmp", nullptr,<br class="">
- llvm::GlobalValue::<wbr class="">NotThreadLocal,<br class="">
- AddrSpace);<br class="">
+ elements.<wbr class="">finishAndCreateGlobal("__<wbr class="">block_descriptor_tmp",<br class="">
+ CGM.getPointerAlign(),<br class="">
+ /*constant*/ true,<br class="">
+ llvm::GlobalValue::<wbr class="">InternalLinkage,<br class="">
+ AddrSpace);<br class="">
<br class="">
return llvm::ConstantExpr::<wbr class="">getBitCast(global, CGM.getBlockDescriptorType());<br class="">
}<br class="">
@@ -1080,36 +1081,31 @@ static llvm::Constant *buildGlobalBlock(<br class="">
assert(blockInfo.CanBeGlobal);<br class="">
<br class="">
// Generate the constants for the block literal initializer.<br class="">
- llvm::Constant *fields[BlockHeaderSize];<br class="">
+ ConstantBuilder builder(CGM);<br class="">
+ auto fields = builder.beginStruct();<br class="">
<br class="">
// isa<br class="">
- fields[0] = CGM.getNSConcreteGlobalBlock()<wbr class="">;<br class="">
+ fields.add(CGM.<wbr class="">getNSConcreteGlobalBlock());<br class="">
<br class="">
// __flags<br class="">
BlockFlags flags = BLOCK_IS_GLOBAL | BLOCK_HAS_SIGNATURE;<br class="">
if (blockInfo.UsesStret) flags |= BLOCK_USE_STRET;<br class="">
<br class="">
- fields[1] = llvm::ConstantInt::get(CGM.<wbr class="">IntTy, flags.getBitMask());<br class="">
+ fields.addInt(CGM.IntTy, flags.getBitMask());<br class="">
<br class="">
// Reserved<br class="">
- fields[2] = llvm::Constant::getNullValue(<wbr class="">CGM.IntTy);<br class="">
+ fields.addInt(CGM.IntTy, 0);<br class="">
<br class="">
// Function<br class="">
- fields[3] = blockFn;<br class="">
+ fields.add(blockFn);<br class="">
<br class="">
// Descriptor<br class="">
- fields[4] = buildBlockDescriptor(CGM, blockInfo);<br class="">
-<br class="">
- llvm::Constant *init = llvm::ConstantStruct::getAnon(<wbr class="">fields);<br class="">
+ fields.add(<wbr class="">buildBlockDescriptor(CGM, blockInfo));<br class="">
<br class="">
- llvm::GlobalVariable *literal =<br class="">
- new llvm::GlobalVariable(CGM.<wbr class="">getModule(),<br class="">
- init->getType(),<br class="">
- /*constant*/ true,<br class="">
- llvm::GlobalVariable::<wbr class="">InternalLinkage,<br class="">
- init,<br class="">
- "__block_literal_global");<br class="">
- literal->setAlignment(<wbr class="">blockInfo.BlockAlign.<wbr class="">getQuantity());<br class="">
+ llvm::Constant *literal =<br class="">
+ fields.finishAndCreateGlobal("<wbr class="">__block_literal_global",<br class="">
+ blockInfo.BlockAlign,<br class="">
+ /*constant*/ true);<br class="">
<br class="">
// Return a constant of the appropriately-casted type.<br class="">
llvm::Type *requiredType =<br class="">
<br class="">
Modified: cfe/trunk/lib/CodeGen/<wbr class="">CGCUDANV.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCUDANV.cpp?rev=287437&r1=287436&r2=287437&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/CodeGen/<wbr class="">CGCUDANV.cpp?rev=287437&r1=<wbr class="">287436&r2=287437&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/lib/CodeGen/<wbr class="">CGCUDANV.cpp (original)<br class="">
+++ cfe/trunk/lib/CodeGen/<wbr class="">CGCUDANV.cpp Sat Nov 19 02:17:24 2016<br class="">
@@ -15,6 +15,7 @@<br class="">
#include "CGCUDARuntime.h"<br class="">
#include "CodeGenFunction.h"<br class="">
#include "CodeGenModule.h"<br class="">
+#include "ConstantBuilder.h"<br class="">
#include "clang/AST/Decl.h"<br class="">
#include "llvm/IR/BasicBlock.h"<br class="">
#include "llvm/IR/CallSite.h"<br class="">
@@ -29,7 +30,8 @@ namespace {<br class="">
class CGNVCUDARuntime : public CGCUDARuntime {<br class="">
<br class="">
private:<br class="">
- llvm::Type *IntTy, *SizeTy, *VoidTy;<br class="">
+ llvm::IntegerType *IntTy, *SizeTy;<br class="">
+ llvm::Type *VoidTy;<br class="">
llvm::PointerType *CharPtrTy, *VoidPtrTy, *VoidPtrPtrTy;<br class="">
<br class="">
/// Convenience reference to LLVM Context<br class="">
@@ -95,9 +97,9 @@ CGNVCUDARuntime::<wbr class="">CGNVCUDARuntime(CodeGen<br class="">
CodeGen::CodeGenTypes &Types = CGM.getTypes();<br class="">
ASTContext &Ctx = CGM.getContext();<br class="">
<br class="">
- IntTy = Types.ConvertType(Ctx.IntTy);<br class="">
- SizeTy = Types.ConvertType(Ctx.<wbr class="">getSizeType());<br class="">
- VoidTy = llvm::Type::getVoidTy(Context)<wbr class="">;<br class="">
+ IntTy = CGM.IntTy;<br class="">
+ SizeTy = CGM.SizeTy;<br class="">
+ VoidTy = CGM.VoidTy;<br class="">
<br class="">
CharPtrTy = llvm::PointerType::getUnqual(<wbr class="">Types.ConvertType(Ctx.CharTy))<wbr class="">;<br class="">
VoidPtrTy = cast<llvm::PointerType>(Types.<wbr class="">ConvertType(Ctx.VoidPtrTy));<br class="">
@@ -296,16 +298,21 @@ llvm::Function *CGNVCUDARuntime::makeMod<br class="">
CGM.getTriple().isMacOSX() ? "__NV_CUDA,__fatbin" : ".nvFatBinSegment";<br class="">
<br class="">
// Create initialized wrapper structure that points to the loaded GPU binary<br class="">
- llvm::Constant *Values[] = {<br class="">
- llvm::ConstantInt::get(IntTy, 0x466243b1), // Fatbin wrapper magic.<br class="">
- llvm::ConstantInt::get(IntTy, 1), // Fatbin version.<br class="">
- makeConstantString(<wbr class="">GpuBinaryOrErr.get()-><wbr class="">getBuffer(), // Data.<br class="">
- "", FatbinConstantName, 8),<br class="">
- llvm::ConstantPointerNull::<wbr class="">get(VoidPtrTy)}; // Unused in fatbin v1.<br class="">
- llvm::GlobalVariable *FatbinWrapper = new llvm::GlobalVariable(<br class="">
- TheModule, FatbinWrapperTy, true, llvm::GlobalValue::<wbr class="">InternalLinkage,<br class="">
- llvm::ConstantStruct::get(<wbr class="">FatbinWrapperTy, Values),<br class="">
- "__cuda_fatbin_wrapper");<br class="">
+ ConstantBuilder Builder(CGM);<br class="">
+ auto Values = Builder.beginStruct(<wbr class="">FatbinWrapperTy);<br class="">
+ // Fatbin wrapper magic.<br class="">
+ Values.addInt(IntTy, 0x466243b1);<br class="">
+ // Fatbin version.<br class="">
+ Values.addInt(IntTy, 1);<br class="">
+ // Data.<br class="">
+ Values.add(makeConstantString(<wbr class="">GpuBinaryOrErr.get()-><wbr class="">getBuffer(),<br class="">
+ "", FatbinConstantName, 8));<br class="">
+ // Unused in fatbin v1.<br class="">
+ Values.add(llvm::<wbr class="">ConstantPointerNull::get(<wbr class="">VoidPtrTy));<br class="">
+ llvm::GlobalVariable *FatbinWrapper =<br class="">
+ Values.finishAndCreateGlobal("<wbr class="">__cuda_fatbin_wrapper",<br class="">
+ CGM.getPointerAlign(),<br class="">
+ /*constant*/ true);<br class="">
FatbinWrapper->setSection(<wbr class="">FatbinSectionName);<br class="">
<br class="">
// GpuBinaryHandle = __cudaRegisterFatBinary(&<wbr class="">FatbinWrapper);<br class="">
<br class="">
Modified: cfe/trunk/lib/CodeGen/<wbr class="">CGObjCGNU.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCGNU.cpp?rev=287437&r1=287436&r2=287437&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/CodeGen/<wbr class="">CGObjCGNU.cpp?rev=287437&r1=<wbr class="">287436&r2=287437&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/lib/CodeGen/<wbr class="">CGObjCGNU.cpp (original)<br class="">
+++ cfe/trunk/lib/CodeGen/<wbr class="">CGObjCGNU.cpp Sat Nov 19 02:17:24 2016<br class="">
@@ -18,6 +18,7 @@<br class="">
#include "CGCleanup.h"<br class="">
#include "CodeGenFunction.h"<br class="">
#include "CodeGenModule.h"<br class="">
+#include "ConstantBuilder.h"<br class="">
#include "clang/AST/ASTContext.h"<br class="">
#include "clang/AST/Decl.h"<br class="">
#include "clang/AST/DeclObjC.h"<br class="">
@@ -190,47 +191,17 @@ protected:<br class="">
/// Generates a global structure, initialized by the elements in the vector.<br class="">
/// The element types must match the types of the structure elements in the<br class="">
/// first argument.<br class="">
- llvm::GlobalVariable *MakeGlobal(llvm::StructType *Ty,<br class="">
- ArrayRef<llvm::Constant *> V,<br class="">
+ llvm::GlobalVariable *MakeGlobal(llvm::Constant *C,<br class="">
CharUnits Align,<br class="">
StringRef Name="",<br class="">
llvm::GlobalValue::<wbr class="">LinkageTypes linkage<br class="">
=llvm::GlobalValue::<wbr class="">InternalLinkage) {<br class="">
- llvm::Constant *C = llvm::ConstantStruct::get(Ty, V);<br class="">
- auto GV = new llvm::GlobalVariable(<wbr class="">TheModule, Ty, false,<br class="">
+ auto GV = new llvm::GlobalVariable(<wbr class="">TheModule, C->getType(), false,<br class="">
linkage, C, Name);<br class="">
GV->setAlignment(Align.<wbr class="">getQuantity());<br class="">
return GV;<br class="">
}<br class="">
<br class="">
- /// Generates a global array. The vector must contain the same number of<br class="">
- /// elements that the array type declares, of the type specified as the array<br class="">
- /// element type.<br class="">
- llvm::GlobalVariable *MakeGlobal(llvm::ArrayType *Ty,<br class="">
- ArrayRef<llvm::Constant *> V,<br class="">
- CharUnits Align,<br class="">
- StringRef Name="",<br class="">
- llvm::GlobalValue::<wbr class="">LinkageTypes linkage<br class="">
- =llvm::GlobalValue::<wbr class="">InternalLinkage) {<br class="">
- llvm::Constant *C = llvm::ConstantArray::get(Ty, V);<br class="">
- auto GV = new llvm::GlobalVariable(<wbr class="">TheModule, Ty, false,<br class="">
- linkage, C, Name);<br class="">
- GV->setAlignment(Align.<wbr class="">getQuantity());<br class="">
- return GV;<br class="">
- }<br class="">
-<br class="">
- /// Generates a global array, inferring the array type from the specified<br class="">
- /// element type and the size of the initialiser.<br class="">
- llvm::GlobalVariable *MakeGlobalArray(llvm::Type *Ty,<br class="">
- ArrayRef<llvm::Constant *> V,<br class="">
- CharUnits Align,<br class="">
- StringRef Name="",<br class="">
- llvm::GlobalValue::<wbr class="">LinkageTypes linkage<br class="">
- =llvm::GlobalValue::<wbr class="">InternalLinkage) {<br class="">
- llvm::ArrayType *ArrayTy = llvm::ArrayType::get(Ty, V.size());<br class="">
- return MakeGlobal(ArrayTy, V, Align, Name, linkage);<br class="">
- }<br class="">
-<br class="">
/// Returns a property name and encoding string.<br class="">
llvm::Constant *MakePropertyEncodingString(<wbr class="">const ObjCPropertyDecl *PD,<br class="">
const Decl *Container) {<br class="">
@@ -251,7 +222,7 @@ protected:<br class="">
}<br class="">
<br class="">
/// Push the property attributes into two structure fields.<br class="">
- void PushPropertyAttributes(std::<wbr class="">vector<llvm::Constant*> &Fields,<br class="">
+ void PushPropertyAttributes(<wbr class="">ConstantBuilder::StructBuilder &Fields,<br class="">
ObjCPropertyDecl *property, bool isSynthesized=true, bool<br class="">
isDynamic=true) {<br class="">
int attrs = property-><wbr class="">getPropertyAttributes();<br class="">
@@ -263,7 +234,7 @@ protected:<br class="">
attrs &= ~ObjCPropertyDecl::OBJC_PR_<wbr class="">strong;<br class="">
}<br class="">
// The first flags field has the same attribute values as clang uses internally<br class="">
- Fields.push_back(llvm::<wbr class="">ConstantInt::get(Int8Ty, attrs & 0xff));<br class="">
+ Fields.addInt(Int8Ty, attrs & 0xff);<br class="">
attrs >>= 8;<br class="">
attrs <<= 2;<br class="">
// For protocol properties, synthesized and dynamic have no meaning, so we<br class="">
@@ -273,10 +244,10 @@ protected:<br class="">
attrs |= isDynamic ? (1<<1) : 0;<br class="">
// The second field is the next four fields left shifted by two, with the<br class="">
// low bit set to indicate whether the field is synthesized or dynamic.<br class="">
- Fields.push_back(llvm::<wbr class="">ConstantInt::get(Int8Ty, attrs & 0xff));<br class="">
+ Fields.addInt(Int8Ty, attrs & 0xff);<br class="">
// Two padding fields<br class="">
- Fields.push_back(llvm::<wbr class="">ConstantInt::get(Int8Ty, 0));<br class="">
- Fields.push_back(llvm::<wbr class="">ConstantInt::get(Int8Ty, 0));<br class="">
+ Fields.addInt(Int8Ty, 0);<br class="">
+ Fields.addInt(Int8Ty, 0);<br class="">
}<br class="">
<br class="">
/// Ensures that the value has the required type, by inserting a bitcast if<br class="">
@@ -1233,14 +1204,15 @@ llvm::Constant *CGObjCGNUstep::GetEHType<br class="">
llvm::Constant *typeName =<br class="">
ExportUniqueString(className, "__objc_eh_typename_");<br class="">
<br class="">
- std::vector<llvm::Constant*> fields;<br class="">
- fields.push_back(BVtable);<br class="">
- fields.push_back(typeName);<br class="">
- llvm::Constant *TI =<br class="">
- MakeGlobal(llvm::StructType::<wbr class="">get(PtrToInt8Ty, PtrToInt8Ty, nullptr),<br class="">
- fields, CGM.getPointerAlign(),<br class="">
- "__objc_eh_typeinfo_" + className,<br class="">
- llvm::GlobalValue::<wbr class="">LinkOnceODRLinkage);<br class="">
+ ConstantBuilder builder(CGM);<br class="">
+ auto fields = builder.beginStruct();<br class="">
+ fields.add(BVtable);<br class="">
+ fields.add(typeName);<br class="">
+ llvm::Constant *TI =<br class="">
+ fields.finishAndCreateGlobal("<wbr class="">__objc_eh_typeinfo_" + className,<br class="">
+ CGM.getPointerAlign(),<br class="">
+ /*constant*/ false,<br class="">
+ llvm::GlobalValue::<wbr class="">LinkOnceODRLinkage);<br class="">
return llvm::ConstantExpr::<wbr class="">getBitCast(TI, PtrToInt8Ty);<br class="">
}<br class="">
<br class="">
@@ -1270,13 +1242,13 @@ ConstantAddress CGObjCGNU::GenerateConst<br class="">
else if (isa->getType() != PtrToIdTy)<br class="">
isa = llvm::ConstantExpr::<wbr class="">getBitCast(isa, PtrToIdTy);<br class="">
<br class="">
- std::vector<llvm::Constant*> Ivars;<br class="">
- Ivars.push_back(isa);<br class="">
- Ivars.push_back(<wbr class="">MakeConstantString(Str));<br class="">
- Ivars.push_back(llvm::<wbr class="">ConstantInt::get(IntTy, Str.size()));<br class="">
- llvm::Constant *ObjCStr = MakeGlobal(<br class="">
- llvm::StructType::get(<wbr class="">PtrToIdTy, PtrToInt8Ty, IntTy, nullptr),<br class="">
- Ivars, Align, ".objc_str");<br class="">
+ ConstantBuilder Builder(CGM);<br class="">
+ auto Fields = Builder.beginStruct();<br class="">
+ Fields.add(isa);<br class="">
+ Fields.add(MakeConstantString(<wbr class="">Str));<br class="">
+ Fields.addInt(IntTy, Str.size());<br class="">
+ llvm::Constant *ObjCStr =<br class="">
+ Fields.finishAndCreateGlobal("<wbr class="">.objc_str", Align);<br class="">
ObjCStr = llvm::ConstantExpr::<wbr class="">getBitCast(ObjCStr, PtrToInt8Ty);<br class="">
ObjCStrings[Str] = ObjCStr;<br class="">
ConstantStrings.push_back(<wbr class="">ObjCStr);<br class="">
@@ -1551,13 +1523,20 @@ GenerateMethodList(StringRef ClassName,<br class="">
bool isClassMethodList) {<br class="">
if (MethodSels.empty())<br class="">
return NULLPtr;<br class="">
+<br class="">
+ ConstantBuilder Builder(CGM);<br class="">
+<br class="">
+ auto MethodList = Builder.beginStruct();<br class="">
+ MethodList.addNullPointer(CGM.<wbr class="">Int8PtrTy);<br class="">
+ MethodList.addInt(Int32Ty, MethodTypes.size());<br class="">
+<br class="">
// Get the method structure type.<br class="">
llvm::StructType *ObjCMethodTy = llvm::StructType::get(<br class="">
PtrToInt8Ty, // Really a selector, but the runtime creates it us.<br class="">
PtrToInt8Ty, // Method types<br class="">
IMPTy, //Method pointer<br class="">
nullptr);<br class="">
- std::vector<llvm::Constant*> Methods;<br class="">
+ auto Methods = MethodList.beginArray();<br class="">
for (unsigned int i = 0, e = MethodTypes.size(); i < e; ++i) {<br class="">
llvm::Constant *Method =<br class="">
TheModule.getFunction(<wbr class="">SymbolNameForMethod(ClassName, CategoryName,<br class="">
@@ -1567,34 +1546,14 @@ GenerateMethodList(StringRef ClassName,<br class="">
llvm::Constant *C = MakeConstantString(MethodSels[<wbr class="">i].getAsString());<br class="">
Method = llvm::ConstantExpr::<wbr class="">getBitCast(Method,<br class="">
IMPTy);<br class="">
- Methods.push_back(<br class="">
+ Methods.add(<br class="">
llvm::ConstantStruct::get(<wbr class="">ObjCMethodTy, {C, MethodTypes[i], Method}));<br class="">
}<br class="">
-<br class="">
- // Array of method structures<br class="">
- llvm::ArrayType *ObjCMethodArrayTy = llvm::ArrayType::get(<wbr class="">ObjCMethodTy,<br class="">
- Methods.size());<br class="">
- llvm::Constant *MethodArray = llvm::ConstantArray::get(<wbr class="">ObjCMethodArrayTy,<br class="">
- Methods);<br class="">
-<br class="">
- // Structure containing list pointer, array and array count<br class="">
- llvm::StructType *ObjCMethodListTy = llvm::StructType::create(<wbr class="">VMContext);<br class="">
- llvm::Type *NextPtrTy = llvm::PointerType::getUnqual(<wbr class="">ObjCMethodListTy);<br class="">
- ObjCMethodListTy->setBody(<br class="">
- NextPtrTy,<br class="">
- IntTy,<br class="">
- ObjCMethodArrayTy,<br class="">
- nullptr);<br class="">
-<br class="">
- Methods.clear();<br class="">
- Methods.push_back(llvm::<wbr class="">ConstantPointerNull::get(<br class="">
- llvm::PointerType::getUnqual(<wbr class="">ObjCMethodListTy)));<br class="">
- Methods.push_back(llvm::<wbr class="">ConstantInt::get(Int32Ty, MethodTypes.size()));<br class="">
- Methods.push_back(MethodArray)<wbr class="">;<br class="">
+ MethodList.add(Methods.finish(<wbr class="">));<br class="">
<br class="">
// Create an instance of the structure<br class="">
- return MakeGlobal(ObjCMethodListTy, Methods, CGM.getPointerAlign(),<br class="">
- ".objc_method_list");<br class="">
+ return MethodList.<wbr class="">finishAndCreateGlobal(".objc_<wbr class="">method_list",<br class="">
+ CGM.getPointerAlign());<br class="">
}<br class="">
<br class="">
/// Generates an IvarList. Used in construction of a objc_class.<br class="">
@@ -1602,35 +1561,36 @@ llvm::Constant *CGObjCGNU::<br class="">
GenerateIvarList(ArrayRef<<wbr class="">llvm::Constant *> IvarNames,<br class="">
ArrayRef<llvm::Constant *> IvarTypes,<br class="">
ArrayRef<llvm::Constant *> IvarOffsets) {<br class="">
- if (IvarNames.size() == 0)<br class="">
+ if (IvarNames.empty())<br class="">
return NULLPtr;<br class="">
- // Get the method structure type.<br class="">
+<br class="">
+ ConstantBuilder Builder(CGM);<br class="">
+<br class="">
+ // Structure containing array count followed by array.<br class="">
+ auto IvarList = Builder.beginStruct();<br class="">
+ IvarList.addInt(IntTy, (int)IvarNames.size());<br class="">
+<br class="">
+ // Get the ivar structure type.<br class="">
llvm::StructType *ObjCIvarTy = llvm::StructType::get(<br class="">
PtrToInt8Ty,<br class="">
PtrToInt8Ty,<br class="">
IntTy,<br class="">
nullptr);<br class="">
- std::vector<llvm::Constant*> Ivars;<br class="">
+<br class="">
+ // Array of ivar structures.<br class="">
+ auto Ivars = IvarList.beginArray(<wbr class="">ObjCIvarTy);<br class="">
for (unsigned int i = 0, e = IvarNames.size() ; i < e ; i++) {<br class="">
- Ivars.push_back(llvm::<wbr class="">ConstantStruct::get(<br class="">
- ObjCIvarTy, {IvarNames[i], IvarTypes[i], IvarOffsets[i]}));<br class="">
+ auto Ivar = Ivars.beginStruct(ObjCIvarTy);<br class="">
+ Ivar.add(IvarNames[i]);<br class="">
+ Ivar.add(IvarTypes[i]);<br class="">
+ Ivar.add(IvarOffsets[i]);<br class="">
+ Ivars.add(Ivar.finish());<br class="">
}<br class="">
-<br class="">
- // Array of method structures<br class="">
- llvm::ArrayType *ObjCIvarArrayTy = llvm::ArrayType::get(<wbr class="">ObjCIvarTy,<br class="">
- IvarNames.size());<br class="">
-<br class="">
- llvm::Constant *Elements[] = {<br class="">
- llvm::ConstantInt::get(IntTy, (int)IvarNames.size()),<br class="">
- llvm::ConstantArray::get(<wbr class="">ObjCIvarArrayTy, Ivars)};<br class="">
- // Structure containing array and array count<br class="">
- llvm::StructType *ObjCIvarListTy = llvm::StructType::get(IntTy,<br class="">
- ObjCIvarArrayTy,<br class="">
- nullptr);<br class="">
+ IvarList.add(Ivars.finish());<br class="">
<br class="">
// Create an instance of the structure<br class="">
- return MakeGlobal(ObjCIvarListTy, Elements, CGM.getPointerAlign(),<br class="">
- ".objc_ivar_list");<br class="">
+ return IvarList.<wbr class="">finishAndCreateGlobal(".objc_<wbr class="">ivar_list",<br class="">
+ CGM.getPointerAlign());<br class="">
}<br class="">
<br class="">
/// Generate a class structure<br class="">
@@ -1678,34 +1638,55 @@ llvm::Constant *CGObjCGNU::GenerateClass<br class="">
IntPtrTy, // strong_pointers<br class="">
IntPtrTy, // weak_pointers<br class="">
nullptr);<br class="">
- llvm::Constant *Zero = llvm::ConstantInt::get(LongTy, 0);<br class="">
+<br class="">
+ ConstantBuilder Builder(CGM);<br class="">
+ auto Elements = Builder.beginStruct(ClassTy);<br class="">
+<br class="">
// Fill in the structure<br class="">
- std::vector<llvm::Constant*> Elements;<br class="">
- Elements.push_back(llvm::<wbr class="">ConstantExpr::getBitCast(<wbr class="">MetaClass, PtrToInt8Ty));<br class="">
- Elements.push_back(SuperClass)<wbr class="">;<br class="">
- Elements.push_back(<wbr class="">MakeConstantString(Name, ".class_name"));<br class="">
- Elements.push_back(Zero);<br class="">
- Elements.push_back(llvm::<wbr class="">ConstantInt::get(LongTy, info));<br class="">
+<br class="">
+ // isa<br class="">
+ Elements.add(llvm::<wbr class="">ConstantExpr::getBitCast(<wbr class="">MetaClass, PtrToInt8Ty));<br class="">
+ // super_class<br class="">
+ Elements.add(SuperClass);<br class="">
+ // name<br class="">
+ Elements.add(<wbr class="">MakeConstantString(Name, ".class_name"));<br class="">
+ // version<br class="">
+ Elements.addInt(LongTy, 0);<br class="">
+ // info<br class="">
+ Elements.addInt(LongTy, info);<br class="">
+ // instance_size<br class="">
if (isMeta) {<br class="">
llvm::DataLayout td(&TheModule);<br class="">
- Elements.push_back(<br class="">
- llvm::ConstantInt::get(LongTy,<br class="">
- td.getTypeSizeInBits(ClassTy) /<br class="">
- CGM.getContext().getCharWidth(<wbr class="">)));<br class="">
+ Elements.addInt(LongTy,<br class="">
+ td.getTypeSizeInBits(ClassTy) /<br class="">
+ CGM.getContext().getCharWidth(<wbr class="">));<br class="">
} else<br class="">
- Elements.push_back(<wbr class="">InstanceSize);<br class="">
- Elements.push_back(IVars);<br class="">
- Elements.push_back(Methods);<br class="">
- Elements.push_back(NULLPtr);<br class="">
- Elements.push_back(NULLPtr);<br class="">
- Elements.push_back(NULLPtr);<br class="">
- Elements.push_back(llvm::<wbr class="">ConstantExpr::getBitCast(<wbr class="">Protocols, PtrTy));<br class="">
- Elements.push_back(NULLPtr);<br class="">
- Elements.push_back(llvm::<wbr class="">ConstantInt::get(LongTy, 1));<br class="">
- Elements.push_back(<wbr class="">IvarOffsets);<br class="">
- Elements.push_back(Properties)<wbr class="">;<br class="">
- Elements.push_back(<wbr class="">StrongIvarBitmap);<br class="">
- Elements.push_back(<wbr class="">WeakIvarBitmap);<br class="">
+ Elements.add(InstanceSize);<br class="">
+ // ivars<br class="">
+ Elements.add(IVars);<br class="">
+ // methods<br class="">
+ Elements.add(Methods);<br class="">
+ // These are all filled in by the runtime, so we pretend<br class="">
+ // dtable<br class="">
+ Elements.add(NULLPtr);<br class="">
+ // subclass_list<br class="">
+ Elements.add(NULLPtr);<br class="">
+ // sibling_class<br class="">
+ Elements.add(NULLPtr);<br class="">
+ // protocols<br class="">
+ Elements.add(llvm::<wbr class="">ConstantExpr::getBitCast(<wbr class="">Protocols, PtrTy));<br class="">
+ // gc_object_type<br class="">
+ Elements.add(NULLPtr);<br class="">
+ // abi_version<br class="">
+ Elements.addInt(LongTy, 1);<br class="">
+ // ivar_offsets<br class="">
+ Elements.add(IvarOffsets);<br class="">
+ // properties<br class="">
+ Elements.add(Properties);<br class="">
+ // strong_pointers<br class="">
+ Elements.add(StrongIvarBitmap)<wbr class="">;<br class="">
+ // weak_pointers<br class="">
+ Elements.add(WeakIvarBitmap);<br class="">
// Create an instance of the structure<br class="">
// This is now an externally visible symbol, so that we can speed up class<br class="">
// messages in the next ABI. We may already have some weak references to<br class="">
@@ -1714,13 +1695,13 @@ llvm::Constant *CGObjCGNU::GenerateClass<br class="">
std::string(Name));<br class="">
llvm::GlobalVariable *ClassRef = TheModule.getNamedGlobal(<wbr class="">ClassSym);<br class="">
llvm::Constant *Class =<br class="">
- MakeGlobal(ClassTy, Elements, CGM.getPointerAlign(), ClassSym,<br class="">
- llvm::GlobalValue::<wbr class="">ExternalLinkage);<br class="">
+ Elements.<wbr class="">finishAndCreateGlobal(<wbr class="">ClassSym, CGM.getPointerAlign(), false,<br class="">
+ llvm::GlobalValue::<wbr class="">ExternalLinkage);<br class="">
if (ClassRef) {<br class="">
- ClassRef->replaceAllUsesWith(<wbr class="">llvm::ConstantExpr::<wbr class="">getBitCast(Class,<br class="">
+ ClassRef->replaceAllUsesWith(<wbr class="">llvm::ConstantExpr::<wbr class="">getBitCast(Class,<br class="">
ClassRef->getType()));<br class="">
- ClassRef->removeFromParent();<br class="">
- Class->setName(ClassSym);<br class="">
+ ClassRef->removeFromParent();<br class="">
+ Class->setName(ClassSym);<br class="">
}<br class="">
return Class;<br class="">
}<br class="">
@@ -1729,38 +1710,33 @@ llvm::Constant *CGObjCGNU::<br class="">
GenerateProtocolMethodList(<wbr class="">ArrayRef<llvm::Constant *> MethodNames,<br class="">
ArrayRef<llvm::Constant *> MethodTypes) {<br class="">
// Get the method structure type.<br class="">
- llvm::StructType *ObjCMethodDescTy = llvm::StructType::get(<br class="">
- PtrToInt8Ty, // Really a selector, but the runtime does the casting for us.<br class="">
- PtrToInt8Ty,<br class="">
- nullptr);<br class="">
- std::vector<llvm::Constant*> Methods;<br class="">
+ llvm::StructType *ObjCMethodDescTy =<br class="">
+ llvm::StructType::get(CGM.<wbr class="">getLLVMContext(), { PtrToInt8Ty, PtrToInt8Ty });<br class="">
+ ConstantBuilder Builder(CGM);<br class="">
+ auto MethodList = Builder.beginStruct();<br class="">
+ MethodList.addInt(IntTy, MethodNames.size());<br class="">
+ auto Methods = MethodList.beginArray(<wbr class="">ObjCMethodDescTy);<br class="">
for (unsigned int i = 0, e = MethodTypes.size() ; i < e ; i++) {<br class="">
- Methods.push_back(llvm::<wbr class="">ConstantStruct::get(<br class="">
- ObjCMethodDescTy, {MethodNames[i], MethodTypes[i]}));<br class="">
- }<br class="">
- llvm::ArrayType *ObjCMethodArrayTy = llvm::ArrayType::get(<wbr class="">ObjCMethodDescTy,<br class="">
- MethodNames.size());<br class="">
- llvm::Constant *Array = llvm::ConstantArray::get(<wbr class="">ObjCMethodArrayTy,<br class="">
- Methods);<br class="">
- llvm::StructType *ObjCMethodDescListTy = llvm::StructType::get(<br class="">
- IntTy, ObjCMethodArrayTy, nullptr);<br class="">
- Methods.clear();<br class="">
- Methods.push_back(llvm::<wbr class="">ConstantInt::get(IntTy, MethodNames.size()));<br class="">
- Methods.push_back(Array);<br class="">
- return MakeGlobal(<wbr class="">ObjCMethodDescListTy, Methods, CGM.getPointerAlign(),<br class="">
- ".objc_method_list");<br class="">
+ auto Method = Methods.beginStruct(<wbr class="">ObjCMethodDescTy);<br class="">
+ Method.add(MethodNames[i]);<br class="">
+ Method.add(MethodTypes[i]);<br class="">
+ Methods.add(Method.finish());<br class="">
+ }<br class="">
+ MethodList.add(Methods.finish(<wbr class="">));<br class="">
+ return MethodList.<wbr class="">finishAndCreateGlobal(".objc_<wbr class="">method_list",<br class="">
+ CGM.getPointerAlign());<br class="">
}<br class="">
<br class="">
// Create the protocol list structure used in classes, categories and so on<br class="">
-llvm::Constant *CGObjCGNU::<wbr class="">GenerateProtocolList(ArrayRef<<wbr class="">std::string>Protocols){<br class="">
- llvm::ArrayType *ProtocolArrayTy = llvm::ArrayType::get(<wbr class="">PtrToInt8Ty,<br class="">
- Protocols.size());<br class="">
- llvm::StructType *ProtocolListTy = llvm::StructType::get(<br class="">
- PtrTy, //Should be a recurisve pointer, but it's always NULL here.<br class="">
- SizeTy,<br class="">
- ProtocolArrayTy,<br class="">
- nullptr);<br class="">
- std::vector<llvm::Constant*> Elements;<br class="">
+llvm::Constant *<br class="">
+CGObjCGNU::<wbr class="">GenerateProtocolList(ArrayRef<<wbr class="">std::string> Protocols) {<br class="">
+<br class="">
+ ConstantBuilder Builder(CGM);<br class="">
+ auto ProtocolList = Builder.beginStruct();<br class="">
+ ProtocolList.add(NULLPtr);<br class="">
+ ProtocolList.addInt(LongTy, Protocols.size());<br class="">
+<br class="">
+ auto Elements = ProtocolList.beginArray(<wbr class="">PtrToInt8Ty);<br class="">
for (const std::string *iter = Protocols.begin(), *endIter = Protocols.end();<br class="">
iter != endIter ; iter++) {<br class="">
llvm::Constant *protocol = nullptr;<br class="">
@@ -1773,16 +1749,11 @@ llvm::Constant *CGObjCGNU::GenerateProto<br class="">
}<br class="">
llvm::Constant *Ptr = llvm::ConstantExpr::<wbr class="">getBitCast(protocol,<br class="">
PtrToInt8Ty);<br class="">
- Elements.push_back(Ptr);<br class="">
+ Elements.add(Ptr);<br class="">
}<br class="">
- llvm::Constant * ProtocolArray = llvm::ConstantArray::get(<wbr class="">ProtocolArrayTy,<br class="">
- Elements);<br class="">
- Elements.clear();<br class="">
- Elements.push_back(NULLPtr);<br class="">
- Elements.push_back(llvm::<wbr class="">ConstantInt::get(LongTy, Protocols.size()));<br class="">
- Elements.push_back(<wbr class="">ProtocolArray);<br class="">
- return MakeGlobal(ProtocolListTy, Elements, CGM.getPointerAlign(),<br class="">
- ".objc_protocol_list");<br class="">
+ ProtocolList.add(Elements.<wbr class="">finish());<br class="">
+ return ProtocolList.<wbr class="">finishAndCreateGlobal(".objc_<wbr class="">protocol_list",<br class="">
+ CGM.getPointerAlign());<br class="">
}<br class="">
<br class="">
llvm::Value *CGObjCGNU::<wbr class="">GenerateProtocolRef(<wbr class="">CodeGenFunction &CGF,<br class="">
@@ -1793,33 +1764,28 @@ llvm::Value *CGObjCGNU::GenerateProtocol<br class="">
return CGF.Builder.CreateBitCast(<wbr class="">protocol, llvm::PointerType::getUnqual(<wbr class="">T));<br class="">
}<br class="">
<br class="">
-llvm::Constant *CGObjCGNU::<wbr class="">GenerateEmptyProtocol(<br class="">
- const std::string &ProtocolName) {<br class="">
- SmallVector<std::string, 0> EmptyStringVector;<br class="">
- SmallVector<llvm::Constant*, 0> EmptyConstantVector;<br class="">
-<br class="">
- llvm::Constant *ProtocolList = GenerateProtocolList(<wbr class="">EmptyStringVector);<br class="">
- llvm::Constant *MethodList =<br class="">
- GenerateProtocolMethodList(<wbr class="">EmptyConstantVector, EmptyConstantVector);<br class="">
+llvm::Constant *<br class="">
+CGObjCGNU::<wbr class="">GenerateEmptyProtocol(const std::string &ProtocolName) {<br class="">
+ llvm::Constant *ProtocolList = GenerateProtocolList({});<br class="">
+ llvm::Constant *MethodList = GenerateProtocolMethodList({}, {});<br class="">
// Protocols are objects containing lists of the methods implemented and<br class="">
// protocols adopted.<br class="">
- llvm::StructType *ProtocolTy = llvm::StructType::get(IdTy,<br class="">
- PtrToInt8Ty,<br class="">
- ProtocolList->getType(),<br class="">
- MethodList->getType(),<br class="">
- MethodList->getType(),<br class="">
- MethodList->getType(),<br class="">
- MethodList->getType(),<br class="">
- nullptr);<br class="">
+ ConstantBuilder Builder(CGM);<br class="">
+ auto Elements = Builder.beginStruct();<br class="">
+<br class="">
// The isa pointer must be set to a magic number so the runtime knows it's<br class="">
// the correct layout.<br class="">
- llvm::Constant *Elements[] = {<br class="">
- llvm::ConstantExpr::<wbr class="">getIntToPtr(<br class="">
- llvm::ConstantInt::get(<wbr class="">Int32Ty, ProtocolVersion), IdTy),<br class="">
- MakeConstantString(<wbr class="">ProtocolName, ".objc_protocol_name"), ProtocolList,<br class="">
- MethodList, MethodList, MethodList, MethodList};<br class="">
- return MakeGlobal(ProtocolTy, Elements, CGM.getPointerAlign(),<br class="">
- ".objc_protocol");<br class="">
+ Elements.add(llvm::<wbr class="">ConstantExpr::getIntToPtr(<br class="">
+ llvm::ConstantInt::get(<wbr class="">Int32Ty, ProtocolVersion), IdTy));<br class="">
+<br class="">
+ Elements.add(<wbr class="">MakeConstantString(<wbr class="">ProtocolName, ".objc_protocol_name"));<br class="">
+ Elements.add(ProtocolList);<br class="">
+ Elements.add(MethodList);<br class="">
+ Elements.add(MethodList);<br class="">
+ Elements.add(MethodList);<br class="">
+ Elements.add(MethodList);<br class="">
+ return Elements.<wbr class="">finishAndCreateGlobal(".objc_<wbr class="">protocol",<br class="">
+ CGM.getPointerAlign());<br class="">
}<br class="">
<br class="">
void CGObjCGNU::GenerateProtocol(<wbr class="">const ObjCProtocolDecl *PD) {<br class="">
@@ -1886,142 +1852,143 @@ void CGObjCGNU::GenerateProtocol(<wbr class="">const O<br class="">
// The isSynthesized value is always set to 0 in a protocol. It exists to<br class="">
// simplify the runtime library by allowing it to use the same data<br class="">
// structures for protocol metadata everywhere.<br class="">
- llvm::StructType *PropertyMetadataTy = llvm::StructType::get(<br class="">
- PtrToInt8Ty, Int8Ty, Int8Ty, Int8Ty, Int8Ty, PtrToInt8Ty,<br class="">
- PtrToInt8Ty, PtrToInt8Ty, PtrToInt8Ty, nullptr);<br class="">
- std::vector<llvm::Constant*> Properties;<br class="">
- std::vector<llvm::Constant*> OptionalProperties;<br class="">
<br class="">
- // Add all of the property methods need adding to the method list and to the<br class="">
- // property metadata list.<br class="">
- for (auto *property : PD->instance_properties()) {<br class="">
- std::vector<llvm::Constant*> Fields;<br class="">
-<br class="">
- Fields.push_back(<wbr class="">MakePropertyEncodingString(<wbr class="">property, nullptr));<br class="">
- PushPropertyAttributes(Fields, property);<br class="">
+ llvm::Constant *PropertyList;<br class="">
+ llvm::Constant *OptionalPropertyList;<br class="">
+ {<br class="">
+ llvm::StructType *propertyMetadataTy =<br class="">
+ llvm::StructType::get(CGM.<wbr class="">getLLVMContext(),<br class="">
+ { PtrToInt8Ty, Int8Ty, Int8Ty, Int8Ty, Int8Ty, PtrToInt8Ty,<br class="">
+ PtrToInt8Ty, PtrToInt8Ty, PtrToInt8Ty });<br class="">
+<br class="">
+ unsigned numReqProperties = 0, numOptProperties = 0;<br class="">
+ for (auto property : PD->instance_properties()) {<br class="">
+ if (property->isOptional())<br class="">
+ numOptProperties++;<br class="">
+ else<br class="">
+ numReqProperties++;<br class="">
+ }<br class="">
+<br class="">
+ ConstantBuilder reqPropertyListBuilder(CGM);<br class="">
+ auto reqPropertiesList = reqPropertyListBuilder.<wbr class="">beginStruct();<br class="">
+ reqPropertiesList.addInt(<wbr class="">IntTy, numReqProperties);<br class="">
+ reqPropertiesList.add(NULLPtr)<wbr class="">;<br class="">
+ auto reqPropertiesArray = reqPropertiesList.beginArray(<wbr class="">propertyMetadataTy);<br class="">
+<br class="">
+ ConstantBuilder optPropertyListBuilder(CGM);<br class="">
+ auto optPropertiesList = optPropertyListBuilder.<wbr class="">beginStruct();<br class="">
+ optPropertiesList.addInt(<wbr class="">IntTy, numOptProperties);<br class="">
+ optPropertiesList.add(NULLPtr)<wbr class="">;<br class="">
+ auto optPropertiesArray = optPropertiesList.beginArray(<wbr class="">propertyMetadataTy);<br class="">
+<br class="">
+ // Add all of the property methods need adding to the method list and to the<br class="">
+ // property metadata list.<br class="">
+ for (auto *property : PD->instance_properties()) {<br class="">
+ auto &propertiesArray =<br class="">
+ (property->isOptional() ? optPropertiesArray : reqPropertiesArray);<br class="">
+ auto fields = propertiesArray.beginStruct(<wbr class="">propertyMetadataTy);<br class="">
+<br class="">
+ fields.add(<wbr class="">MakePropertyEncodingString(<wbr class="">property, nullptr));<br class="">
+ PushPropertyAttributes(fields, property);<br class="">
+<br class="">
+ if (ObjCMethodDecl *getter = property->getGetterMethodDecl(<wbr class="">)) {<br class="">
+ std::string typeStr;<br class="">
+ Context.<wbr class="">getObjCEncodingForMethodDecl(<wbr class="">getter, typeStr);<br class="">
+ llvm::Constant *typeEncoding = MakeConstantString(typeStr);<br class="">
+ InstanceMethodTypes.push_back(<wbr class="">typeEncoding);<br class="">
+ fields.add(MakeConstantString(<wbr class="">getter->getSelector().<wbr class="">getAsString()));<br class="">
+ fields.add(typeEncoding);<br class="">
+ } else {<br class="">
+ fields.add(NULLPtr);<br class="">
+ fields.add(NULLPtr);<br class="">
+ }<br class="">
+ if (ObjCMethodDecl *setter = property->getSetterMethodDecl(<wbr class="">)) {<br class="">
+ std::string typeStr;<br class="">
+ Context.<wbr class="">getObjCEncodingForMethodDecl(<wbr class="">setter, typeStr);<br class="">
+ llvm::Constant *typeEncoding = MakeConstantString(typeStr);<br class="">
+ InstanceMethodTypes.push_back(<wbr class="">typeEncoding);<br class="">
+ fields.add(MakeConstantString(<wbr class="">setter->getSelector().<wbr class="">getAsString()));<br class="">
+ fields.add(typeEncoding);<br class="">
+ } else {<br class="">
+ fields.add(NULLPtr);<br class="">
+ fields.add(NULLPtr);<br class="">
+ }<br class="">
<br class="">
- if (ObjCMethodDecl *getter = property->getGetterMethodDecl(<wbr class="">)) {<br class="">
- std::string TypeStr;<br class="">
- Context.<wbr class="">getObjCEncodingForMethodDecl(<wbr class="">getter,TypeStr);<br class="">
- llvm::Constant *TypeEncoding = MakeConstantString(TypeStr);<br class="">
- InstanceMethodTypes.push_back(<wbr class="">TypeEncoding);<br class="">
- Fields.push_back(<wbr class="">MakeConstantString(getter-><wbr class="">getSelector().getAsString()));<br class="">
- Fields.push_back(TypeEncoding)<wbr class="">;<br class="">
- } else {<br class="">
- Fields.push_back(NULLPtr);<br class="">
- Fields.push_back(NULLPtr);<br class="">
- }<br class="">
- if (ObjCMethodDecl *setter = property->getSetterMethodDecl(<wbr class="">)) {<br class="">
- std::string TypeStr;<br class="">
- Context.<wbr class="">getObjCEncodingForMethodDecl(<wbr class="">setter,TypeStr);<br class="">
- llvm::Constant *TypeEncoding = MakeConstantString(TypeStr);<br class="">
- InstanceMethodTypes.push_back(<wbr class="">TypeEncoding);<br class="">
- Fields.push_back(<wbr class="">MakeConstantString(setter-><wbr class="">getSelector().getAsString()));<br class="">
- Fields.push_back(TypeEncoding)<wbr class="">;<br class="">
- } else {<br class="">
- Fields.push_back(NULLPtr);<br class="">
- Fields.push_back(NULLPtr);<br class="">
- }<br class="">
- if (property-><wbr class="">getPropertyImplementation() == ObjCPropertyDecl::Optional) {<br class="">
- OptionalProperties.push_back(<wbr class="">llvm::ConstantStruct::get(<wbr class="">PropertyMetadataTy, Fields));<br class="">
- } else {<br class="">
- Properties.push_back(llvm::<wbr class="">ConstantStruct::get(<wbr class="">PropertyMetadataTy, Fields));<br class="">
+ propertiesArray.add(fields.<wbr class="">finish());<br class="">
}<br class="">
+<br class="">
+ reqPropertiesList.add(<wbr class="">reqPropertiesArray.finish());<br class="">
+ PropertyList =<br class="">
+ reqPropertiesList.<wbr class="">finishAndCreateGlobal(".objc_<wbr class="">property_list",<br class="">
+ CGM.getPointerAlign());<br class="">
+<br class="">
+ optPropertiesList.add(<wbr class="">optPropertiesArray.finish());<br class="">
+ OptionalPropertyList =<br class="">
+ optPropertiesList.<wbr class="">finishAndCreateGlobal(".objc_<wbr class="">property_list",<br class="">
+ CGM.getPointerAlign());<br class="">
}<br class="">
- llvm::Constant *PropertyArray = llvm::ConstantArray::get(<br class="">
- llvm::ArrayType::get(<wbr class="">PropertyMetadataTy, Properties.size()), Properties);<br class="">
- llvm::Constant* PropertyListInitFields[] =<br class="">
- {llvm::ConstantInt::get(IntTy, Properties.size()), NULLPtr, PropertyArray};<br class="">
-<br class="">
- llvm::Constant *PropertyListInit =<br class="">
- llvm::ConstantStruct::getAnon(<wbr class="">PropertyListInitFields);<br class="">
- llvm::Constant *PropertyList = new llvm::GlobalVariable(<wbr class="">TheModule,<br class="">
- PropertyListInit->getType(), false, llvm::GlobalValue::<wbr class="">InternalLinkage,<br class="">
- PropertyListInit, ".objc_property_list");<br class="">
-<br class="">
- llvm::Constant *OptionalPropertyArray =<br class="">
- llvm::ConstantArray::get(llvm:<wbr class="">:ArrayType::get(<wbr class="">PropertyMetadataTy,<br class="">
- OptionalProperties.size()) , OptionalProperties);<br class="">
- llvm::Constant* OptionalPropertyListInitFields<wbr class="">[] = {<br class="">
- llvm::ConstantInt::get(IntTy, OptionalProperties.size()), NULLPtr,<br class="">
- OptionalPropertyArray };<br class="">
-<br class="">
- llvm::Constant *OptionalPropertyListInit =<br class="">
- llvm::ConstantStruct::getAnon(<wbr class="">OptionalPropertyListInitFields<wbr class="">);<br class="">
- llvm::Constant *OptionalPropertyList = new llvm::GlobalVariable(<wbr class="">TheModule,<br class="">
- OptionalPropertyListInit-><wbr class="">getType(), false,<br class="">
- llvm::GlobalValue::<wbr class="">InternalLinkage, OptionalPropertyListInit,<br class="">
- ".objc_property_list");<br class="">
<br class="">
// Protocols are objects containing lists of the methods implemented and<br class="">
// protocols adopted.<br class="">
- llvm::StructType *ProtocolTy = llvm::StructType::get(IdTy,<br class="">
- PtrToInt8Ty,<br class="">
- ProtocolList->getType(),<br class="">
- InstanceMethodList->getType(),<br class="">
- ClassMethodList->getType(),<br class="">
- OptionalInstanceMethodList-><wbr class="">getType(),<br class="">
- OptionalClassMethodList-><wbr class="">getType(),<br class="">
- PropertyList->getType(),<br class="">
- OptionalPropertyList->getType(<wbr class="">),<br class="">
- nullptr);<br class="">
// The isa pointer must be set to a magic number so the runtime knows it's<br class="">
// the correct layout.<br class="">
- llvm::Constant *Elements[] = {<br class="">
+ ConstantBuilder Builder(CGM);<br class="">
+ auto Elements = Builder.beginStruct();<br class="">
+ Elements.add(<br class="">
llvm::ConstantExpr::<wbr class="">getIntToPtr(<br class="">
- llvm::ConstantInt::get(<wbr class="">Int32Ty, ProtocolVersion), IdTy),<br class="">
- MakeConstantString(<wbr class="">ProtocolName, ".objc_protocol_name"), ProtocolList,<br class="">
- InstanceMethodList, ClassMethodList, OptionalInstanceMethodList,<br class="">
- OptionalClassMethodList, PropertyList, OptionalPropertyList};<br class="">
+ llvm::ConstantInt::get(<wbr class="">Int32Ty, ProtocolVersion), IdTy));<br class="">
+ Elements.add(<br class="">
+ MakeConstantString(<wbr class="">ProtocolName, ".objc_protocol_name"));<br class="">
+ Elements.add(ProtocolList);<br class="">
+ Elements.add(<wbr class="">InstanceMethodList);<br class="">
+ Elements.add(ClassMethodList);<br class="">
+ Elements.add(<wbr class="">OptionalInstanceMethodList);<br class="">
+ Elements.add(<wbr class="">OptionalClassMethodList);<br class="">
+ Elements.add(PropertyList);<br class="">
+ Elements.add(<wbr class="">OptionalPropertyList);<br class="">
ExistingProtocols[<wbr class="">ProtocolName] =<br class="">
- llvm::ConstantExpr::<wbr class="">getBitCast(MakeGlobal(<wbr class="">ProtocolTy, Elements,<br class="">
- CGM.getPointerAlign(), ".objc_protocol"), IdTy);<br class="">
+ llvm::ConstantExpr::<wbr class="">getBitCast(<br class="">
+ Elements.<wbr class="">finishAndCreateGlobal(".objc_<wbr class="">protocol", CGM.getPointerAlign()),<br class="">
+ IdTy);<br class="">
}<br class="">
void CGObjCGNU::<wbr class="">GenerateProtocolHolderCategory<wbr class="">() {<br class="">
// Collect information about instance methods<br class="">
SmallVector<Selector, 1> MethodSels;<br class="">
SmallVector<llvm::Constant*, 1> MethodTypes;<br class="">
<br class="">
- std::vector<llvm::Constant*> Elements;<br class="">
+ ConstantBuilder Builder(CGM);<br class="">
+ auto Elements = Builder.beginStruct();<br class="">
+<br class="">
const std::string ClassName = "__ObjC_Protocol_Holder_Ugly_<wbr class="">Hack";<br class="">
const std::string CategoryName = "AnotherHack";<br class="">
- Elements.push_back(<wbr class="">MakeConstantString(<wbr class="">CategoryName));<br class="">
- Elements.push_back(<wbr class="">MakeConstantString(ClassName))<wbr class="">;<br class="">
+ Elements.add(<wbr class="">MakeConstantString(<wbr class="">CategoryName));<br class="">
+ Elements.add(<wbr class="">MakeConstantString(ClassName))<wbr class="">;<br class="">
// Instance method list<br class="">
- Elements.push_back(llvm::<wbr class="">ConstantExpr::getBitCast(<wbr class="">GenerateMethodList(<br class="">
+ Elements.add(llvm::<wbr class="">ConstantExpr::getBitCast(<wbr class="">GenerateMethodList(<br class="">
ClassName, CategoryName, MethodSels, MethodTypes, false), PtrTy));<br class="">
// Class method list<br class="">
- Elements.push_back(llvm::<wbr class="">ConstantExpr::getBitCast(<wbr class="">GenerateMethodList(<br class="">
+ Elements.add(llvm::<wbr class="">ConstantExpr::getBitCast(<wbr class="">GenerateMethodList(<br class="">
ClassName, CategoryName, MethodSels, MethodTypes, true), PtrTy));<br class="">
+<br class="">
// Protocol list<br class="">
- llvm::ArrayType *ProtocolArrayTy = llvm::ArrayType::get(PtrTy,<br class="">
- ExistingProtocols.size());<br class="">
- llvm::StructType *ProtocolListTy = llvm::StructType::get(<br class="">
- PtrTy, //Should be a recurisve pointer, but it's always NULL here.<br class="">
- SizeTy,<br class="">
- ProtocolArrayTy,<br class="">
- nullptr);<br class="">
- std::vector<llvm::Constant*> ProtocolElements;<br class="">
- for (llvm::StringMapIterator<llvm:<wbr class="">:Constant*> iter =<br class="">
- ExistingProtocols.begin(), endIter = ExistingProtocols.end();<br class="">
+ ConstantBuilder ProtocolListBuilder(CGM);<br class="">
+ auto ProtocolList = ProtocolListBuilder.<wbr class="">beginStruct();<br class="">
+ ProtocolList.add(NULLPtr);<br class="">
+ ProtocolList.addInt(LongTy, ExistingProtocols.size());<br class="">
+ auto ProtocolElements = ProtocolList.beginArray(PtrTy)<wbr class="">;<br class="">
+ for (auto iter = ExistingProtocols.begin(), endIter = ExistingProtocols.end();<br class="">
iter != endIter ; iter++) {<br class="">
llvm::Constant *Ptr = llvm::ConstantExpr::<wbr class="">getBitCast(iter->getValue(),<br class="">
PtrTy);<br class="">
- ProtocolElements.push_back(<wbr class="">Ptr);<br class="">
+ ProtocolElements.add(Ptr);<br class="">
}<br class="">
- llvm::Constant * ProtocolArray = llvm::ConstantArray::get(<wbr class="">ProtocolArrayTy,<br class="">
- ProtocolElements);<br class="">
- ProtocolElements.clear();<br class="">
- ProtocolElements.push_back(<wbr class="">NULLPtr);<br class="">
- ProtocolElements.push_back(<wbr class="">llvm::ConstantInt::get(LongTy,<br class="">
- ExistingProtocols.size()));<br class="">
- ProtocolElements.push_back(<wbr class="">ProtocolArray);<br class="">
- Elements.push_back(llvm::<wbr class="">ConstantExpr::getBitCast(<wbr class="">MakeGlobal(ProtocolListTy,<br class="">
- ProtocolElements, CGM.getPointerAlign(),<br class="">
- ".objc_protocol_list"), PtrTy));<br class="">
+ ProtocolList.add(<wbr class="">ProtocolElements.finish());<br class="">
+ Elements.add(llvm::<wbr class="">ConstantExpr::getBitCast(<br class="">
+ ProtocolList.<wbr class="">finishAndCreateGlobal(".objc_<wbr class="">protocol_list",<br class="">
+ CGM.getPointerAlign()),<br class="">
+ PtrTy));<br class="">
Categories.push_back(llvm::<wbr class="">ConstantExpr::getBitCast(<br class="">
- MakeGlobal(llvm::StructType::<wbr class="">get(PtrToInt8Ty, PtrToInt8Ty,<br class="">
- PtrTy, PtrTy, PtrTy, nullptr), Elements, CGM.getPointerAlign()),<br class="">
+ Elements.<wbr class="">finishAndCreateGlobal("", CGM.getPointerAlign()),<br class="">
PtrTy));<br class="">
}<br class="">
<br class="">
@@ -2056,13 +2023,16 @@ llvm::Constant *CGObjCGNU::MakeBitField(<br class="">
}<br class="">
values.push_back(llvm::<wbr class="">ConstantInt::get(Int32Ty, word));<br class="">
}<br class="">
- llvm::ArrayType *arrayTy = llvm::ArrayType::get(Int32Ty, values.size());<br class="">
- llvm::Constant *array = llvm::ConstantArray::get(<wbr class="">arrayTy, values);<br class="">
- llvm::Constant *fields[2] = {<br class="">
- llvm::ConstantInt::get(<wbr class="">Int32Ty, values.size()),<br class="">
- array };<br class="">
- llvm::Constant *GS = MakeGlobal(llvm::StructType::<wbr class="">get(Int32Ty, arrayTy,<br class="">
- nullptr), fields, CharUnits::fromQuantity(4));<br class="">
+<br class="">
+ ConstantBuilder builder(CGM);<br class="">
+ auto fields = builder.beginStruct();<br class="">
+ fields.addInt(Int32Ty, values.size());<br class="">
+ auto array = fields.beginArray();<br class="">
+ for (auto v : values) array.add(v);<br class="">
+ fields.add(array.finish());<br class="">
+<br class="">
+ llvm::Constant *GS =<br class="">
+ fields.finishAndCreateGlobal("<wbr class="">", CharUnits::fromQuantity(4));<br class="">
llvm::Constant *ptr = llvm::ConstantExpr::<wbr class="">getPtrToInt(GS, IntPtrTy);<br class="">
return ptr;<br class="">
}<br class="">
@@ -2098,23 +2068,25 @@ void CGObjCGNU::GenerateCategory(<wbr class="">const O<br class="">
E = Protos.end(); I != E; ++I)<br class="">
Protocols.push_back((*I)-><wbr class="">getNameAsString());<br class="">
<br class="">
- llvm::Constant *Elements[] = {<br class="">
- MakeConstantString(<wbr class="">CategoryName), MakeConstantString(ClassName),<br class="">
- // Instance method list<br class="">
- llvm::ConstantExpr::<wbr class="">getBitCast(<br class="">
+ ConstantBuilder Builder(CGM);<br class="">
+ auto Elements = Builder.beginStruct();<br class="">
+ Elements.add(<wbr class="">MakeConstantString(<wbr class="">CategoryName));<br class="">
+ Elements.add(<wbr class="">MakeConstantString(ClassName))<wbr class="">;<br class="">
+ // Instance method list<br class="">
+ Elements.add(llvm::<wbr class="">ConstantExpr::getBitCast(<br class="">
GenerateMethodList(ClassName, CategoryName, InstanceMethodSels,<br class="">
InstanceMethodTypes, false),<br class="">
- PtrTy),<br class="">
- // Class method list<br class="">
- llvm::ConstantExpr::<wbr class="">getBitCast(GenerateMethodList(<wbr class="">ClassName, CategoryName,<br class="">
- ClassMethodSels,<br class="">
- ClassMethodTypes, true),<br class="">
- PtrTy),<br class="">
- // Protocol list<br class="">
- llvm::ConstantExpr::<wbr class="">getBitCast(<wbr class="">GenerateProtocolList(<wbr class="">Protocols), PtrTy)};<br class="">
+ PtrTy));<br class="">
+ // Class method list<br class="">
+ Elements.add(llvm::<wbr class="">ConstantExpr::getBitCast(<br class="">
+ GenerateMethodList(ClassName, CategoryName,<br class="">
+ ClassMethodSels, ClassMethodTypes, true),<br class="">
+ PtrTy));<br class="">
+ // Protocol list<br class="">
+ Elements.add(llvm::<wbr class="">ConstantExpr::getBitCast(<br class="">
+ GenerateProtocolList(<wbr class="">Protocols), PtrTy));<br class="">
Categories.push_back(llvm::<wbr class="">ConstantExpr::getBitCast(<br class="">
- MakeGlobal(llvm::StructType::<wbr class="">get(PtrToInt8Ty, PtrToInt8Ty,<br class="">
- PtrTy, PtrTy, PtrTy, nullptr), Elements, CGM.getPointerAlign()),<br class="">
+ Elements.<wbr class="">finishAndCreateGlobal("", CGM.getPointerAlign()),<br class="">
PtrTy));<br class="">
}<br class="">
<br class="">
@@ -2124,23 +2096,35 @@ llvm::Constant *CGObjCGNU::GeneratePrope<br class="">
ASTContext &Context = CGM.getContext();<br class="">
// Property metadata: name, attributes, attributes2, padding1, padding2,<br class="">
// setter name, setter types, getter name, getter types.<br class="">
- llvm::StructType *PropertyMetadataTy = llvm::StructType::get(<br class="">
- PtrToInt8Ty, Int8Ty, Int8Ty, Int8Ty, Int8Ty, PtrToInt8Ty,<br class="">
- PtrToInt8Ty, PtrToInt8Ty, PtrToInt8Ty, nullptr);<br class="">
- std::vector<llvm::Constant*> Properties;<br class="">
+ llvm::StructType *propertyMetadataTy =<br class="">
+ llvm::StructType::get(CGM.<wbr class="">getLLVMContext(),<br class="">
+ { PtrToInt8Ty, Int8Ty, Int8Ty, Int8Ty, Int8Ty, PtrToInt8Ty,<br class="">
+ PtrToInt8Ty, PtrToInt8Ty, PtrToInt8Ty });<br class="">
+<br class="">
+ unsigned numProperties = 0;<br class="">
+ for (auto *propertyImpl : OID->property_impls()) {<br class="">
+ (void) propertyImpl;<br class="">
+ numProperties++;<br class="">
+ }<br class="">
+<br class="">
+ ConstantBuilder builder(CGM);<br class="">
+ auto propertyList = builder.beginStruct();<br class="">
+ propertyList.addInt(IntTy, numProperties);<br class="">
+ propertyList.add(NULLPtr);<br class="">
+ auto properties = propertyList.beginArray(<wbr class="">propertyMetadataTy);<br class="">
<br class="">
// Add all of the property methods need adding to the method list and to the<br class="">
// property metadata list.<br class="">
for (auto *propertyImpl : OID->property_impls()) {<br class="">
- std::vector<llvm::Constant*> Fields;<br class="">
+ auto fields = properties.beginStruct(<wbr class="">propertyMetadataTy);<br class="">
ObjCPropertyDecl *property = propertyImpl->getPropertyDecl(<wbr class="">);<br class="">
bool isSynthesized = (propertyImpl-><wbr class="">getPropertyImplementation() ==<br class="">
ObjCPropertyImplDecl::<wbr class="">Synthesize);<br class="">
bool isDynamic = (propertyImpl-><wbr class="">getPropertyImplementation() ==<br class="">
ObjCPropertyImplDecl::Dynamic)<wbr class="">;<br class="">
<br class="">
- Fields.push_back(<wbr class="">MakePropertyEncodingString(<wbr class="">property, OID));<br class="">
- PushPropertyAttributes(Fields, property, isSynthesized, isDynamic);<br class="">
+ fields.add(<wbr class="">MakePropertyEncodingString(<wbr class="">property, OID));<br class="">
+ PushPropertyAttributes(fields, property, isSynthesized, isDynamic);<br class="">
if (ObjCMethodDecl *getter = property->getGetterMethodDecl(<wbr class="">)) {<br class="">
std::string TypeStr;<br class="">
Context.<wbr class="">getObjCEncodingForMethodDecl(<wbr class="">getter,TypeStr);<br class="">
@@ -2149,11 +2133,11 @@ llvm::Constant *CGObjCGNU::GeneratePrope<br class="">
InstanceMethodTypes.push_back(<wbr class="">TypeEncoding);<br class="">
InstanceMethodSels.push_back(<wbr class="">getter->getSelector());<br class="">
}<br class="">
- Fields.push_back(<wbr class="">MakeConstantString(getter-><wbr class="">getSelector().getAsString()));<br class="">
- Fields.push_back(TypeEncoding)<wbr class="">;<br class="">
+ fields.add(MakeConstantString(<wbr class="">getter->getSelector().<wbr class="">getAsString()));<br class="">
+ fields.add(TypeEncoding);<br class="">
} else {<br class="">
- Fields.push_back(NULLPtr);<br class="">
- Fields.push_back(NULLPtr);<br class="">
+ fields.add(NULLPtr);<br class="">
+ fields.add(NULLPtr);<br class="">
}<br class="">
if (ObjCMethodDecl *setter = property->getSetterMethodDecl(<wbr class="">)) {<br class="">
std::string TypeStr;<br class="">
@@ -2163,26 +2147,18 @@ llvm::Constant *CGObjCGNU::GeneratePrope<br class="">
InstanceMethodTypes.push_back(<wbr class="">TypeEncoding);<br class="">
InstanceMethodSels.push_back(<wbr class="">setter->getSelector());<br class="">
}<br class="">
- Fields.push_back(<wbr class="">MakeConstantString(setter-><wbr class="">getSelector().getAsString()));<br class="">
- Fields.push_back(TypeEncoding)<wbr class="">;<br class="">
+ fields.add(MakeConstantString(<wbr class="">setter->getSelector().<wbr class="">getAsString()));<br class="">
+ fields.add(TypeEncoding);<br class="">
} else {<br class="">
- Fields.push_back(NULLPtr);<br class="">
- Fields.push_back(NULLPtr);<br class="">
+ fields.add(NULLPtr);<br class="">
+ fields.add(NULLPtr);<br class="">
}<br class="">
- Properties.push_back(llvm::<wbr class="">ConstantStruct::get(<wbr class="">PropertyMetadataTy, Fields));<br class="">
+ properties.add(fields.finish()<wbr class="">);<br class="">
}<br class="">
- llvm::ArrayType *PropertyArrayTy =<br class="">
- llvm::ArrayType::get(<wbr class="">PropertyMetadataTy, Properties.size());<br class="">
- llvm::Constant *PropertyArray = llvm::ConstantArray::get(<wbr class="">PropertyArrayTy,<br class="">
- Properties);<br class="">
- llvm::Constant* PropertyListInitFields[] =<br class="">
- {llvm::ConstantInt::get(IntTy, Properties.size()), NULLPtr, PropertyArray};<br class="">
-<br class="">
- llvm::Constant *PropertyListInit =<br class="">
- llvm::ConstantStruct::getAnon(<wbr class="">PropertyListInitFields);<br class="">
- return new llvm::GlobalVariable(<wbr class="">TheModule, PropertyListInit->getType(), false,<br class="">
- llvm::GlobalValue::<wbr class="">InternalLinkage, PropertyListInit,<br class="">
- ".objc_property_list");<br class="">
+ propertyList.add(properties.<wbr class="">finish());<br class="">
+<br class="">
+ return propertyList.<wbr class="">finishAndCreateGlobal(".objc_<wbr class="">property_list",<br class="">
+ CGM.getPointerAlign());<br class="">
}<br class="">
<br class="">
void CGObjCGNU::RegisterAlias(const ObjCCompatibleAliasDecl *OAD) {<br class="">
@@ -2231,7 +2207,8 @@ void CGObjCGNU::GenerateClass(const ObjC<br class="">
SmallVector<llvm::Constant*, 16> IvarTypes;<br class="">
SmallVector<llvm::Constant*, 16> IvarOffsets;<br class="">
<br class="">
- std::vector<llvm::Constant*> IvarOffsetValues;<br class="">
+ ConstantBuilder IvarOffsetBuilder(CGM);<br class="">
+ auto IvarOffsetValues = IvarOffsetBuilder.beginArray(<wbr class="">PtrToIntTy);<br class="">
SmallVector<bool, 16> WeakIvars;<br class="">
SmallVector<bool, 16> StrongIvars;<br class="">
<br class="">
@@ -2275,7 +2252,7 @@ void CGObjCGNU::GenerateClass(const ObjC<br class="">
"__objc_ivar_offset_value_" + ClassName +"." +<br class="">
IVD->getNameAsString());<br class="">
IvarOffsets.push_back(<wbr class="">OffsetValue);<br class="">
- IvarOffsetValues.push_back(<wbr class="">OffsetVar);<br class="">
+ IvarOffsetValues.add(<wbr class="">OffsetVar);<br class="">
Qualifiers::ObjCLifetime lt = IVD->getType().getQualifiers()<wbr class="">.getObjCLifetime();<br class="">
switch (lt) {<br class="">
case Qualifiers::OCL_Strong:<br class="">
@@ -2294,8 +2271,8 @@ void CGObjCGNU::GenerateClass(const ObjC<br class="">
llvm::Constant *StrongIvarBitmap = MakeBitField(StrongIvars);<br class="">
llvm::Constant *WeakIvarBitmap = MakeBitField(WeakIvars);<br class="">
llvm::GlobalVariable *IvarOffsetArray =<br class="">
- MakeGlobalArray(PtrToIntTy, IvarOffsetValues, CGM.getPointerAlign(),<br class="">
- ".ivar.offsets");<br class="">
+ IvarOffsetValues.<wbr class="">finishAndCreateGlobal(".ivar.<wbr class="">offsets",<br class="">
+ CGM.getPointerAlign());<br class="">
<br class="">
// Collect information about instance methods<br class="">
SmallVector<Selector, 16> InstanceMethodSels;<br class="">
@@ -2461,21 +2438,18 @@ llvm::Function *CGObjCGNU::ModuleInitFun<br class="">
if (StringClass.empty()) StringClass = "NXConstantString";<br class="">
<br class="">
Elements.push_back(<wbr class="">MakeConstantString(<wbr class="">StringClass,<br class="">
- ".objc_static_class_name"));<br class="">
+ ".objc_static_class_name"));<br class="">
Elements.push_back(llvm::<wbr class="">ConstantArray::get(<wbr class="">StaticsArrayTy,<br class="">
- ConstantStrings));<br class="">
- llvm::StructType *StaticsListTy =<br class="">
- llvm::StructType::get(<wbr class="">PtrToInt8Ty, StaticsArrayTy, nullptr);<br class="">
- llvm::Type *StaticsListPtrTy =<br class="">
- llvm::PointerType::getUnqual(<wbr class="">StaticsListTy);<br class="">
- Statics = MakeGlobal(StaticsListTy, Elements, CGM.getPointerAlign(),<br class="">
- ".objc_statics");<br class="">
+ ConstantStrings));<br class="">
+ Statics = MakeGlobal(llvm::<wbr class="">ConstantStruct::getAnon(<wbr class="">Elements),<br class="">
+ CGM.getPointerAlign(), ".objc_statics");<br class="">
+ llvm::Type *StaticsListPtrTy = Statics->getType();<br class="">
llvm::ArrayType *StaticsListArrayTy =<br class="">
llvm::ArrayType::get(<wbr class="">StaticsListPtrTy, 2);<br class="">
Elements.clear();<br class="">
Elements.push_back(Statics);<br class="">
Elements.push_back(llvm::<wbr class="">Constant::getNullValue(<wbr class="">StaticsListPtrTy));<br class="">
- Statics = MakeGlobal(StaticsListArrayTy, Elements,<br class="">
+ Statics = MakeGlobal(llvm::<wbr class="">ConstantArray::get(<wbr class="">StaticsListArrayTy, Elements),<br class="">
CGM.getPointerAlign(), ".objc_statics_ptr");<br class="">
Statics = llvm::ConstantExpr::<wbr class="">getBitCast(Statics, PtrTy);<br class="">
}<br class="">
@@ -2489,7 +2463,8 @@ llvm::Function *CGObjCGNU::ModuleInitFun<br class="">
<br class="">
Elements.clear();<br class="">
// Pointer to an array of selectors used in this module.<br class="">
- std::vector<llvm::Constant*> Selectors;<br class="">
+ ConstantBuilder SelectorBuilder(CGM);<br class="">
+ auto Selectors = SelectorBuilder.beginArray(<wbr class="">SelStructTy);<br class="">
std::vector<llvm::GlobalAlias*<wbr class="">> SelectorAliases;<br class="">
for (SelectorMap::iterator iter = SelectorTable.begin(),<br class="">
iterEnd = SelectorTable.end(); iter != iterEnd ; ++iter) {<br class="">
@@ -2505,10 +2480,10 @@ llvm::Function *CGObjCGNU::ModuleInitFun<br class="">
if (!i->first.empty())<br class="">
SelectorTypeEncoding = MakeConstantString(i->first, ".objc_sel_types");<br class="">
<br class="">
- Elements.push_back(SelName);<br class="">
- Elements.push_back(<wbr class="">SelectorTypeEncoding);<br class="">
- Selectors.push_back(llvm::<wbr class="">ConstantStruct::get(<wbr class="">SelStructTy, Elements));<br class="">
- Elements.clear();<br class="">
+ auto SelStruct = Selectors.beginStruct(<wbr class="">SelStructTy);<br class="">
+ SelStruct.add(SelName);<br class="">
+ SelStruct.add(<wbr class="">SelectorTypeEncoding);<br class="">
+ Selectors.add(SelStruct.<wbr class="">finish());<br class="">
<br class="">
// Store the selector alias for later replacement<br class="">
SelectorAliases.push_back(i-><wbr class="">second);<br class="">
@@ -2519,16 +2494,18 @@ llvm::Function *CGObjCGNU::ModuleInitFun<br class="">
// because the selector list has a length field. Unfortunately, the GCC<br class="">
// runtime decides to ignore the length field and expects a NULL terminator,<br class="">
// and GCC cooperates with this by always setting the length to 0.<br class="">
- Elements.push_back(NULLPtr);<br class="">
- Elements.push_back(NULLPtr);<br class="">
- Selectors.push_back(llvm::<wbr class="">ConstantStruct::get(<wbr class="">SelStructTy, Elements));<br class="">
- Elements.clear();<br class="">
+ {<br class="">
+ auto SelStruct = Selectors.beginStruct(<wbr class="">SelStructTy);<br class="">
+ SelStruct.add(NULLPtr);<br class="">
+ SelStruct.add(NULLPtr);<br class="">
+ Selectors.add(SelStruct.<wbr class="">finish());<br class="">
+ }<br class="">
<br class="">
// Number of static selectors<br class="">
Elements.push_back(llvm::<wbr class="">ConstantInt::get(LongTy, SelectorCount));<br class="">
llvm::GlobalVariable *SelectorList =<br class="">
- MakeGlobalArray(SelStructTy, Selectors, CGM.getPointerAlign(),<br class="">
- ".objc_selector_list");<br class="">
+ Selectors.<wbr class="">finishAndCreateGlobal(".objc_<wbr class="">selector_list",<br class="">
+ CGM.getPointerAlign());<br class="">
Elements.push_back(llvm::<wbr class="">ConstantExpr::getBitCast(<wbr class="">SelectorList,<br class="">
SelStructPtrTy));<br class="">
<br class="">
@@ -2562,7 +2539,8 @@ llvm::Function *CGObjCGNU::ModuleInitFun<br class="">
Elements.push_back(ClassList);<br class="">
// Construct the symbol table<br class="">
llvm::Constant *SymTab =<br class="">
- MakeGlobal(SymTabTy, Elements, CGM.getPointerAlign());<br class="">
+ MakeGlobal(llvm::<wbr class="">ConstantStruct::get(SymTabTy, Elements),<br class="">
+ CGM.getPointerAlign());<br class="">
<br class="">
// The symbol table is contained in a module which has some version-checking<br class="">
// constants<br class="">
@@ -2603,7 +2581,9 @@ llvm::Function *CGObjCGNU::ModuleInitFun<br class="">
break;<br class="">
}<br class="">
<br class="">
- llvm::Value *Module = MakeGlobal(ModuleTy, Elements, CGM.getPointerAlign());<br class="">
+ llvm::Value *Module =<br class="">
+ MakeGlobal(llvm::<wbr class="">ConstantStruct::get(ModuleTy, Elements),<br class="">
+ CGM.getPointerAlign());<br class="">
<br class="">
// Create the load function calling the runtime entry point with the module<br class="">
// structure<br class="">
<br class="">
Modified: cfe/trunk/lib/CodeGen/<wbr class="">CGOpenMPRuntime.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGOpenMPRuntime.cpp?rev=287437&r1=287436&r2=287437&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/CodeGen/<wbr class="">CGOpenMPRuntime.cpp?rev=<wbr class="">287437&r1=287436&r2=287437&<wbr class="">view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/lib/CodeGen/<wbr class="">CGOpenMPRuntime.cpp (original)<br class="">
+++ cfe/trunk/lib/CodeGen/<wbr class="">CGOpenMPRuntime.cpp Sat Nov 19 02:17:24 2016<br class="">
@@ -15,6 +15,7 @@<br class="">
#include "CGCleanup.h"<br class="">
#include "CGOpenMPRuntime.h"<br class="">
#include "CodeGenFunction.h"<br class="">
+#include "ConstantBuilder.h"<br class="">
#include "clang/AST/Decl.h"<br class="">
#include "clang/AST/StmtOpenMP.h"<br class="">
#include "llvm/ADT/ArrayRef.h"<br class="">
@@ -906,18 +907,19 @@ Address CGOpenMPRuntime::<wbr class="">getOrCreateDefa<br class="">
DefaultOpenMPPSource =<br class="">
llvm::ConstantExpr::<wbr class="">getBitCast(<wbr class="">DefaultOpenMPPSource, CGM.Int8PtrTy);<br class="">
}<br class="">
- auto DefaultOpenMPLocation = new llvm::GlobalVariable(<br class="">
- CGM.getModule(), IdentTy, /*isConstant*/ true,<br class="">
- llvm::GlobalValue::<wbr class="">PrivateLinkage, /*Initializer*/ nullptr);<br class="">
+<br class="">
+ ConstantBuilder builder(CGM);<br class="">
+ auto fields = builder.beginStruct(IdentTy);<br class="">
+ fields.addInt(CGM.Int32Ty, 0);<br class="">
+ fields.addInt(CGM.Int32Ty, Flags);<br class="">
+ fields.addInt(CGM.Int32Ty, 0);<br class="">
+ fields.addInt(CGM.Int32Ty, 0);<br class="">
+ fields.add(<wbr class="">DefaultOpenMPPSource);<br class="">
+ auto DefaultOpenMPLocation =<br class="">
+ fields.finishAndCreateGlobal("<wbr class="">", Align, /*isConstant*/ true,<br class="">
+ llvm::GlobalValue::<wbr class="">PrivateLinkage);<br class="">
DefaultOpenMPLocation-><wbr class="">setUnnamedAddr(llvm::<wbr class="">GlobalValue::UnnamedAddr::<wbr class="">Global);<br class="">
- DefaultOpenMPLocation-><wbr class="">setAlignment(Align.<wbr class="">getQuantity());<br class="">
<br class="">
- llvm::Constant *Zero = llvm::ConstantInt::get(CGM.<wbr class="">Int32Ty, 0, true);<br class="">
- llvm::Constant *Values[] = {Zero,<br class="">
- llvm::ConstantInt::get(CGM.<wbr class="">Int32Ty, Flags),<br class="">
- Zero, Zero, DefaultOpenMPPSource};<br class="">
- llvm::Constant *Init = llvm::ConstantStruct::get(<wbr class="">IdentTy, Values);<br class="">
- DefaultOpenMPLocation-><wbr class="">setInitializer(Init);<br class="">
OpenMPDefaultLocMap[Flags] = Entry = DefaultOpenMPLocation;<br class="">
}<br class="">
return Address(Entry, Align);<br class="">
@@ -2810,9 +2812,10 @@ CGOpenMPRuntime::<wbr class="">createOffloadingBinaryD<br class="">
".omp_offloading.entries_end")<wbr class="">;<br class="">
<br class="">
// Create all device images<br class="">
- llvm::SmallVector<llvm::<wbr class="">Constant *, 4> DeviceImagesEntires;<br class="">
auto *DeviceImageTy = cast<llvm::StructType>(<br class="">
CGM.getTypes().<wbr class="">ConvertTypeForMem(<wbr class="">getTgtDeviceImageQTy()));<br class="">
+ ConstantBuilder DeviceImagesBuilder(CGM);<br class="">
+ auto DeviceImagesEntries = DeviceImagesBuilder.<wbr class="">beginArray(DeviceImageTy);<br class="">
<br class="">
for (unsigned i = 0; i < Devices.size(); ++i) {<br class="">
StringRef T = Devices[i].getTriple();<br class="">
@@ -2824,22 +2827,19 @@ CGOpenMPRuntime::<wbr class="">createOffloadingBinaryD<br class="">
M, CGM.Int8Ty, /*isConstant=*/true, llvm::GlobalValue::<wbr class="">ExternalLinkage,<br class="">
/*Initializer=*/nullptr, Twine(".omp_offloading.img_<wbr class="">end.") + Twine(T));<br class="">
<br class="">
- llvm::Constant *Dev =<br class="">
- llvm::ConstantStruct::get(<wbr class="">DeviceImageTy, ImgBegin, ImgEnd,<br class="">
- HostEntriesBegin, HostEntriesEnd, nullptr);<br class="">
- DeviceImagesEntires.push_back(<wbr class="">Dev);<br class="">
+ auto Dev = DeviceImagesEntries.<wbr class="">beginStruct(DeviceImageTy);<br class="">
+ Dev.add(ImgBegin);<br class="">
+ Dev.add(ImgEnd);<br class="">
+ Dev.add(HostEntriesBegin);<br class="">
+ Dev.add(HostEntriesEnd);<br class="">
+ DeviceImagesEntries.add(Dev.<wbr class="">finish());<br class="">
}<br class="">
<br class="">
// Create device images global array.<br class="">
- llvm::ArrayType *DeviceImagesInitTy =<br class="">
- llvm::ArrayType::get(<wbr class="">DeviceImageTy, DeviceImagesEntires.size());<br class="">
- llvm::Constant *DeviceImagesInit =<br class="">
- llvm::ConstantArray::get(<wbr class="">DeviceImagesInitTy, DeviceImagesEntires);<br class="">
-<br class="">
- llvm::GlobalVariable *DeviceImages = new llvm::GlobalVariable(<br class="">
- M, DeviceImagesInitTy, /*isConstant=*/true,<br class="">
- llvm::GlobalValue::<wbr class="">InternalLinkage, DeviceImagesInit,<br class="">
- ".omp_offloading.device_<wbr class="">images");<br class="">
+ llvm::GlobalVariable *DeviceImages =<br class="">
+ DeviceImagesEntries.<wbr class="">finishAndCreateGlobal(".omp_<wbr class="">offloading.device_images",<br class="">
+ CGM.getPointerAlign(),<br class="">
+ /*isConstant=*/true);<br class="">
DeviceImages->setUnnamedAddr(<wbr class="">llvm::GlobalValue::<wbr class="">UnnamedAddr::Global);<br class="">
<br class="">
// This is a Zero array to be used in the creation of the constant expressions<br class="">
@@ -2849,16 +2849,18 @@ CGOpenMPRuntime::<wbr class="">createOffloadingBinaryD<br class="">
// Create the target region descriptor.<br class="">
auto *BinaryDescriptorTy = cast<llvm::StructType>(<br class="">
CGM.getTypes().<wbr class="">ConvertTypeForMem(<wbr class="">getTgtBinaryDescriptorQTy()));<br class="">
- llvm::Constant *TargetRegionsDescriptorInit = llvm::ConstantStruct::get(<br class="">
- BinaryDescriptorTy, llvm::ConstantInt::get(CGM.<wbr class="">Int32Ty, Devices.size()),<br class="">
- llvm::ConstantExpr::<wbr class="">getGetElementPtr(<wbr class="">DeviceImagesInitTy, DeviceImages,<br class="">
- Index),<br class="">
- HostEntriesBegin, HostEntriesEnd, nullptr);<br class="">
-<br class="">
- auto *Desc = new llvm::GlobalVariable(<br class="">
- M, BinaryDescriptorTy, /*isConstant=*/true,<br class="">
- llvm::GlobalValue::<wbr class="">InternalLinkage, TargetRegionsDescriptorInit,<br class="">
- ".omp_offloading.descriptor");<br class="">
+ ConstantBuilder DescBuilder(CGM);<br class="">
+ auto DescInit = DescBuilder.beginStruct(<wbr class="">BinaryDescriptorTy);<br class="">
+ DescInit.addInt(CGM.Int32Ty, Devices.size());<br class="">
+ DescInit.add(llvm::<wbr class="">ConstantExpr::<wbr class="">getGetElementPtr(DeviceImages-<wbr class="">>getValueType(),<br class="">
+ DeviceImages,<br class="">
+ Index));<br class="">
+ DescInit.add(HostEntriesBegin)<wbr class="">;<br class="">
+ DescInit.add(HostEntriesEnd);<br class="">
+<br class="">
+ auto *Desc = DescInit.<wbr class="">finishAndCreateGlobal(".omp_<wbr class="">offloading.descriptor",<br class="">
+ CGM.getPointerAlign(),<br class="">
+ /*isConstant=*/true);<br class="">
<br class="">
// Emit code to register or unregister the descriptor at execution<br class="">
// startup or closing, respectively.<br class="">
@@ -2906,19 +2908,24 @@ void CGOpenMPRuntime::<wbr class="">createOffloadEntry<br class="">
Str->setUnnamedAddr(llvm::<wbr class="">GlobalValue::UnnamedAddr::<wbr class="">Global);<br class="">
llvm::Constant *StrPtr = llvm::ConstantExpr::<wbr class="">getBitCast(Str, CGM.Int8PtrTy);<br class="">
<br class="">
+ // We can't have any padding between symbols, so we need to have 1-byte<br class="">
+ // alignment.<br class="">
+ auto Align = CharUnits::fromQuantity(1);<br class="">
+<br class="">
// Create the entry struct.<br class="">
- llvm::Constant *EntryInit = llvm::ConstantStruct::get(<br class="">
- TgtOffloadEntryType, AddrPtr, StrPtr,<br class="">
- llvm::ConstantInt::get(CGM.<wbr class="">SizeTy, Size), nullptr);<br class="">
- llvm::GlobalVariable *Entry = new llvm::GlobalVariable(<br class="">
- M, TgtOffloadEntryType, true, llvm::GlobalValue::<wbr class="">ExternalLinkage,<br class="">
- EntryInit, ".omp_offloading.entry");<br class="">
+ ConstantBuilder EntryBuilder(CGM);<br class="">
+ auto EntryInit = EntryBuilder.beginStruct(<wbr class="">TgtOffloadEntryType);<br class="">
+ EntryInit.add(AddrPtr);<br class="">
+ EntryInit.add(StrPtr);<br class="">
+ EntryInit.addInt(CGM.SizeTy, Size);<br class="">
+ llvm::GlobalVariable *Entry =<br class="">
+ EntryInit.<wbr class="">finishAndCreateGlobal(".omp_<wbr class="">offloading.entry",<br class="">
+ Align,<br class="">
+ /*constant*/ true,<br class="">
+ llvm::GlobalValue::<wbr class="">ExternalLinkage);<br class="">
<br class="">
// The entry has to be created in the section the linker expects it to be.<br class="">
Entry->setSection(".omp_<wbr class="">offloading.entries");<br class="">
- // We can't have any padding between symbols, so we need to have 1-byte<br class="">
- // alignment.<br class="">
- Entry->setAlignment(1);<br class="">
}<br class="">
<br class="">
void CGOpenMPRuntime::<wbr class="">createOffloadEntriesAndInfoMet<wbr class="">adata() {<br class="">
<br class="">
Modified: cfe/trunk/lib/CodeGen/<wbr class="">CodeGenModule.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=287437&r1=287436&r2=287437&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/CodeGen/<wbr class="">CodeGenModule.cpp?rev=287437&<wbr class="">r1=287436&r2=287437&view=diff</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/lib/CodeGen/<wbr class="">CodeGenModule.cpp (original)<br class="">
+++ cfe/trunk/lib/CodeGen/<wbr class="">CodeGenModule.cpp Sat Nov 19 02:17:24 2016<br class="">
@@ -24,6 +24,7 @@<br class="">
#include "CodeGenFunction.h"<br class="">
#include "CodeGenPGO.h"<br class="">
#include "CodeGenTBAA.h"<br class="">
+#include "ConstantBuilder.h"<br class="">
#include "CoverageMappingGen.h"<br class="">
#include "TargetInfo.h"<br class="">
#include "clang/AST/ASTContext.h"<br class="">
@@ -731,6 +732,8 @@ void CodeGenModule::AddGlobalDtor(<wbr class="">llvm::<br class="">
}<br class="">
<br class="">
void CodeGenModule::EmitCtorList(<wbr class="">CtorList &Fns, const char *GlobalName) {<br class="">
+ if (Fns.empty()) return;<br class="">
+<br class="">
// Ctor function type is void()*.<br class="">
llvm::FunctionType* CtorFTy = llvm::FunctionType::get(<wbr class="">VoidTy, false);<br class="">
llvm::Type *CtorPFTy = llvm::PointerType::getUnqual(<wbr class="">CtorFTy);<br class="">
@@ -740,24 +743,22 @@ void CodeGenModule::EmitCtorList(<wbr class="">CtorLis<br class="">
Int32Ty, llvm::PointerType::getUnqual(<wbr class="">CtorFTy), VoidPtrTy, nullptr);<br class="">
<br class="">
// Construct the constructor and destructor arrays.<br class="">
- SmallVector<llvm::Constant *, 8> Ctors;<br class="">
+ ConstantBuilder builder(*this);<br class="">
+ auto ctors = builder.beginArray(<wbr class="">CtorStructTy);<br class="">
for (const auto &I : Fns) {<br class="">
- llvm::Constant *S[] = {<br class="">
- llvm::ConstantInt::get(<wbr class="">Int32Ty, I.Priority, false),<br class="">
- llvm::ConstantExpr::<wbr class="">getBitCast(I.Initializer, CtorPFTy),<br class="">
- (I.AssociatedData<br class="">
- ? llvm::ConstantExpr::<wbr class="">getBitCast(I.AssociatedData, VoidPtrTy)<br class="">
- : llvm::Constant::getNullValue(<wbr class="">VoidPtrTy))};<br class="">
- Ctors.push_back(llvm::<wbr class="">ConstantStruct::get(<wbr class="">CtorStructTy, S));<br class="">
+ auto ctor = ctors.beginStruct(<wbr class="">CtorStructTy);<br class="">
+ ctor.addInt(Int32Ty, I.Priority);<br class="">
+ ctor.add(llvm::ConstantExpr::<wbr class="">getBitCast(I.Initializer, CtorPFTy));<br class="">
+ if (I.AssociatedData)<br class="">
+ ctor.add(llvm::ConstantExpr::<wbr class="">getBitCast(I.AssociatedData, VoidPtrTy));<br class="">
+ else<br class="">
+ ctor.addNullPointer(VoidPtrTy)<wbr class="">;<br class="">
+ ctors.add(ctor.finish());<br class="">
}<br class="">
<br class="">
- if (!Ctors.empty()) {<br class="">
- llvm::ArrayType *AT = llvm::ArrayType::get(<wbr class="">CtorStructTy, Ctors.size());<br class="">
- new llvm::GlobalVariable(<wbr class="">TheModule, AT, false,<br class="">
- llvm::GlobalValue::<wbr class="">AppendingLinkage,<br class="">
- llvm::ConstantArray::get(AT, Ctors),<br class="">
- GlobalName);<br class="">
- }<br class="">
+ (void) ctors.finishAndCreateGlobal(<wbr class="">GlobalName, getPointerAlign(),<br class="">
+ /*constant*/ false,<br class="">
+ llvm::GlobalValue::<wbr class="">AppendingLinkage);<br class="">
Fns.clear();<br class="">
}<br class="">
<br class="">
@@ -3190,15 +3191,14 @@ CodeGenModule::<wbr class="">GetAddrOfConstantCFString<br class="">
<br class="">
auto *STy = cast<llvm::StructType>(<wbr class="">getTypes().ConvertType(CFTy));<br class="">
<br class="">
- llvm::Constant *Fields[4];<br class="">
+ ConstantBuilder Builder(*this);<br class="">
+ auto Fields = Builder.beginStruct(STy);<br class="">
<br class="">
// Class pointer.<br class="">
- Fields[0] = cast<llvm::ConstantExpr>(<wbr class="">CFConstantStringClassRef);<br class="">
+ Fields.add(cast<llvm::<wbr class="">ConstantExpr>(<wbr class="">CFConstantStringClassRef));<br class="">
<br class="">
// Flags.<br class="">
- llvm::Type *Ty = getTypes().ConvertType(<wbr class="">getContext().UnsignedIntTy);<br class="">
- Fields[1] = isUTF16 ? llvm::ConstantInt::get(Ty, 0x07d0)<br class="">
- : llvm::ConstantInt::get(Ty, 0x07C8);<br class="">
+ Fields.addInt(IntTy, isUTF16 ? 0x07d0 : 0x07C8);<br class="">
<br class="">
// String pointer.<br class="">
llvm::Constant *C = nullptr;<br class="">
@@ -3232,25 +3232,24 @@ CodeGenModule::<wbr class="">GetAddrOfConstantCFString<br class="">
: "__TEXT,__cstring,cstring_<wbr class="">literals");<br class="">
<br class="">
// String.<br class="">
- Fields[2] =<br class="">
+ llvm::Constant *Str =<br class="">
llvm::ConstantExpr::<wbr class="">getGetElementPtr(GV-><wbr class="">getValueType(), GV, Zeros);<br class="">
<br class="">
if (isUTF16)<br class="">
// Cast the UTF16 string to the correct type.<br class="">
- Fields[2] = llvm::ConstantExpr::<wbr class="">getBitCast(Fields[2], Int8PtrTy);<br class="">
+ Str = llvm::ConstantExpr::<wbr class="">getBitCast(Str, Int8PtrTy);<br class="">
+ Fields.add(Str);<br class="">
<br class="">
// String length.<br class="">
- Ty = getTypes().ConvertType(<wbr class="">getContext().LongTy);<br class="">
- Fields[3] = llvm::ConstantInt::get(Ty, StringLength);<br class="">
+ auto Ty = getTypes().ConvertType(<wbr class="">getContext().LongTy);<br class="">
+ Fields.addInt(cast<llvm::<wbr class="">IntegerType>(Ty), StringLength);<br class="">
<br class="">
CharUnits Alignment = getPointerAlign();<br class="">
<br class="">
// The struct.<br class="">
- C = llvm::ConstantStruct::get(STy, Fields);<br class="">
- GV = new llvm::GlobalVariable(<wbr class="">getModule(), C->getType(), /*isConstant=*/false,<br class="">
- llvm::GlobalVariable::<wbr class="">PrivateLinkage, C,<br class="">
- "_unnamed_cfstring_");<br class="">
- GV->setAlignment(Alignment.<wbr class="">getQuantity());<br class="">
+ GV = Fields.finishAndCreateGlobal("<wbr class="">_unnamed_cfstring_", Alignment,<br class="">
+ /*isConstant=*/false,<br class="">
+ llvm::GlobalVariable::<wbr class="">PrivateLinkage);<br class="">
switch (getTriple().getObjectFormat()<wbr class="">) {<br class="">
case llvm::Triple::<wbr class="">UnknownObjectFormat:<br class="">
llvm_unreachable("unknown file format");<br class="">
@@ -3338,19 +3337,18 @@ CodeGenModule::<wbr class="">GetAddrOfConstantString(c<br class="">
NSConstantStringType = cast<llvm::StructType>(<wbr class="">getTypes().ConvertType(NSTy));<br class="">
}<br class="">
<br class="">
- llvm::Constant *Fields[3];<br class="">
+ ConstantBuilder Builder(*this);<br class="">
+ auto Fields = Builder.beginStruct(<wbr class="">NSConstantStringType);<br class="">
<br class="">
// Class pointer.<br class="">
- Fields[0] = cast<llvm::ConstantExpr>(V);<br class="">
+ Fields.add(cast<llvm::<wbr class="">ConstantExpr>(V));<br class="">
<br class="">
// String pointer.<br class="">
llvm::Constant *C =<br class="">
llvm::ConstantDataArray::<wbr class="">getString(VMContext, Entry.first());<br class="">
<br class="">
- llvm::GlobalValue::<wbr class="">LinkageTypes Linkage;<br class="">
- bool isConstant;<br class="">
- Linkage = llvm::GlobalValue::<wbr class="">PrivateLinkage;<br class="">
- isConstant = !LangOpts.WritableStrings;<br class="">
+ llvm::GlobalValue::<wbr class="">LinkageTypes Linkage = llvm::GlobalValue::<wbr class="">PrivateLinkage;<br class="">
+ bool isConstant = !LangOpts.WritableStrings;<br class="">
<br class="">
auto *GV = new llvm::GlobalVariable(<wbr class="">getModule(), C->getType(), isConstant,<br class="">
Linkage, C, ".str");<br class="">
@@ -3359,20 +3357,17 @@ CodeGenModule::<wbr class="">GetAddrOfConstantString(c<br class="">
// of the string is via this class initializer.<br class="">
CharUnits Align = getContext().<wbr class="">getTypeAlignInChars(<wbr class="">getContext().CharTy);<br class="">
GV->setAlignment(Align.<wbr class="">getQuantity());<br class="">
- Fields[1] =<br class="">
- llvm::ConstantExpr::<wbr class="">getGetElementPtr(GV-><wbr class="">getValueType(), GV, Zeros);<br class="">
+ Fields.add(<br class="">
+ llvm::ConstantExpr::<wbr class="">getGetElementPtr(GV-><wbr class="">getValueType(), GV, Zeros));<br class="">
<br class="">
// String length.<br class="">
- llvm::Type *Ty = getTypes().ConvertType(<wbr class="">getContext().UnsignedIntTy);<br class="">
- Fields[2] = llvm::ConstantInt::get(Ty, StringLength);<br class="">
+ Fields.addInt(IntTy, StringLength);<br class="">
<br class="">
// The struct.<br class="">
CharUnits Alignment = getPointerAlign();<br class="">
- C = llvm::ConstantStruct::get(<wbr class="">NSConstantStringType, Fields);<br class="">
- GV = new llvm::GlobalVariable(<wbr class="">getModule(), C->getType(), true,<br class="">
- llvm::GlobalVariable::<wbr class="">PrivateLinkage, C,<br class="">
- "_unnamed_nsstring_");<br class="">
- GV->setAlignment(Alignment.<wbr class="">getQuantity());<br class="">
+ GV = Fields.finishAndCreateGlobal("<wbr class="">_unnamed_nsstring_", Alignment,<br class="">
+ /*constant*/ true,<br class="">
+ llvm::GlobalVariable::<wbr class="">PrivateLinkage);<br class="">
const char *NSStringSection = "__OBJC,__cstring_object,<wbr class="">regular,no_dead_strip";<br class="">
const char *NSStringNonFragileABISection =<br class="">
"__DATA,__objc_stringobj,<wbr class="">regular,no_dead_strip";<br class="">
<br class="">
Added: cfe/trunk/lib/CodeGen/<wbr class="">ConstantBuilder.h<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ConstantBuilder.h?rev=287437&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-<wbr class="">project/cfe/trunk/lib/CodeGen/<wbr class="">ConstantBuilder.h?rev=287437&<wbr class="">view=auto</a><br class="">
==============================<wbr class="">==============================<wbr class="">==================<br class="">
--- cfe/trunk/lib/CodeGen/<wbr class="">ConstantBuilder.h (added)<br class="">
+++ cfe/trunk/lib/CodeGen/<wbr class="">ConstantBuilder.h Sat Nov 19 02:17:24 2016<br class="">
@@ -0,0 +1,274 @@<br class="">
+//===----- ConstantBuilder.h - Builder for LLVM IR constants ----*- C++ -*-===//<br class="">
+//<br class="">
+// The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is distributed under the University of Illinois Open Source<br class="">
+// License. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===------------------------<wbr class="">------------------------------<wbr class="">----------------===//<br class="">
+//<br class="">
+// This class provides a convenient interface for building complex<br class="">
+// global initializers.<br class="">
+//<br class="">
+//===------------------------<wbr class="">------------------------------<wbr class="">----------------===//<br class="">
+<br class="">
+#ifndef LLVM_CLANG_LIB_CODEGEN_<wbr class="">CONSTANTBUILDER_H<br class="">
+#define LLVM_CLANG_LIB_CODEGEN_<wbr class="">CONSTANTBUILDER_H<br class="">
+<br class="">
+#include "llvm/ADT/ArrayRef.h"<br class="">
+#include "llvm/ADT/SmallVector.h"<br class="">
+#include "llvm/IR/Constants.h"<br class="">
+<br class="">
+#include "CodeGenModule.h"<br class="">
+<br class="">
+namespace clang {<br class="">
+namespace CodeGen {<br class="">
+<br class="">
+class ConstantBuilder;<br class="">
+<br class="">
+/// A convenience builder class for complex constant initializers,<br class="">
+/// especially for anonymous global structures used by various language<br class="">
+/// runtimes.<br class="">
+///<br class="">
+/// The basic usage pattern is expected to be something like:<br class="">
+/// ConstantBuilder builder(CGM);<br class="">
+/// auto toplevel = builder.beginStruct();<br class="">
+/// toplevel.addInt(CGM.SizeTy, widgets.size());<br class="">
+/// auto widgetArray = builder.beginArray();<br class="">
+/// for (auto &widget : widgets) {<br class="">
+/// auto widgetDesc = widgetArray.beginStruct();<br class="">
+/// widgetDesc.addInt(CGM.SizeTy, widget.getPower());<br class="">
+/// widgetDesc.add(CGM.<wbr class="">GetAddrOfConstantString(<wbr class="">widget.getName()));<br class="">
+/// widgetDesc.add(CGM.<wbr class="">GetAddrOfGlobal(widget.<wbr class="">getInitializerDecl()));<br class="">
+/// widgetArray.add(widgetDesc.<wbr class="">finish());<br class="">
+/// }<br class="">
+/// toplevel.add(widgetArray.<wbr class="">finish());<br class="">
+/// auto global = toplevel.<wbr class="">finishAndCreateGlobal("WIDGET_<wbr class="">LIST", Align,<br class="">
+/// /*constant*/ true);<br class="">
+class ConstantBuilder {<br class="">
+ CodeGenModule &CGM;<br class="">
+ llvm::SmallVector<llvm::<wbr class="">Constant*, 16> Buffer;<br class="">
+ bool Frozen = false;<br class="">
+<br class="">
+public:<br class="">
+ explicit ConstantBuilder(CodeGenModule &CGM) : CGM(CGM) {}<br class="">
+<br class="">
+ ~ConstantBuilder() {<br class="">
+ assert(Buffer.empty() && "didn't claim all values out of buffer");<br class="">
+ }<br class="">
+<br class="">
+ class ArrayBuilder;<br class="">
+ class StructBuilder;<br class="">
+<br class="">
+ class AggregateBuilder {<br class="">
+ protected:<br class="">
+ ConstantBuilder &Builder;<br class="">
+ AggregateBuilder *Parent;<br class="">
+ size_t Begin;<br class="">
+ bool Finished = false;<br class="">
+ bool Frozen = false;<br class="">
+<br class="">
+ AggregateBuilder(<wbr class="">ConstantBuilder &builder, AggregateBuilder *parent)<br class="">
+ : Builder(builder), Parent(parent), Begin(builder.Buffer.size()) {<br class="">
+ if (parent) {<br class="">
+ assert(!parent->Frozen && "parent already has child builder active");<br class="">
+ parent->Frozen = true;<br class="">
+ } else {<br class="">
+ assert(!builder.Frozen && "builder already has child builder active");<br class="">
+ builder.Frozen = true;<br class="">
+ }<br class="">
+ }<br class="">
+<br class="">
+ ~AggregateBuilder() {<br class="">
+ assert(Finished && "didn't claim value from aggregate builder");<br class="">
+ }<br class="">
+<br class="">
+ void markFinished() {<br class="">
+ assert(!Frozen && "child builder still active");<br class="">
+ assert(!Finished && "builder already finished");<br class="">
+ Finished = true;<br class="">
+ if (Parent) {<br class="">
+ assert(Parent->Frozen &&<br class="">
+ "parent not frozen while child builder active");<br class="">
+ Parent->Frozen = false;<br class="">
+ } else {<br class="">
+ assert(Builder.Frozen &&<br class="">
+ "builder not frozen while child builder active");<br class="">
+ Builder.Frozen = false;<br class="">
+ }<br class="">
+ }<br class="">
+<br class="">
+ public:<br class="">
+ // Not copyable.<br class="">
+ AggregateBuilder(const AggregateBuilder &) = delete;<br class="">
+ AggregateBuilder &operator=(const AggregateBuilder &) = delete;<br class="">
+<br class="">
+ // Movable, mostly to allow returning. But we have to write this out<br class="">
+ // properly to satisfy the assert in the destructor.<br class="">
+ AggregateBuilder(<wbr class="">AggregateBuilder &&other)<br class="">
+ : Builder(other.Builder), Parent(other.Parent), Begin(other.Begin),<br class="">
+ Finished(other.Finished), Frozen(other.Frozen) {<br class="">
+ other.Finished = false;<br class="">
+ }<br class="">
+ AggregateBuilder &operator=(AggregateBuilder &&other) = delete;<br class="">
+<br class="">
+ void add(llvm::Constant *value) {<br class="">
+ assert(!Finished && "cannot add more values after finishing builder");<br class="">
+ Builder.Buffer.push_back(<wbr class="">value);<br class="">
+ }<br class="">
+<br class="">
+ void addSize(CharUnits size) {<br class="">
+ add(Builder.CGM.getSize(size))<wbr class="">;<br class="">
+ }<br class="">
+<br class="">
+ void addInt(llvm::IntegerType *intTy, uint64_t value,<br class="">
+ bool isSigned = false) {<br class="">
+ add(llvm::ConstantInt::get(<wbr class="">intTy, value, isSigned));<br class="">
+ }<br class="">
+<br class="">
+ void addNullPointer(llvm::<wbr class="">PointerType *ptrTy) {<br class="">
+ add(llvm::ConstantPointerNull:<wbr class="">:get(ptrTy));<br class="">
+ }<br class="">
+<br class="">
+ ArrayRef<llvm::Constant*> getGEPIndicesToCurrentPosition<wbr class="">(<br class="">
+ llvm::SmallVectorImpl<llvm::<wbr class="">Constant*> &indices) {<br class="">
+ getGEPIndicesTo(indices, Builder.Buffer.size());<br class="">
+ return indices;<br class="">
+ }<br class="">
+<br class="">
+ ArrayBuilder beginArray(llvm::Type *eltTy = nullptr);<br class="">
+ StructBuilder beginStruct(llvm::StructType *structTy = nullptr);<br class="">
+<br class="">
+ private:<br class="">
+ void getGEPIndicesTo(llvm::<wbr class="">SmallVectorImpl<llvm::<wbr class="">Constant*> &indices,<br class="">
+ size_t position) const {<br class="">
+ // Recurse on the parent builder if present.<br class="">
+ if (Parent) {<br class="">
+ Parent->getGEPIndicesTo(<wbr class="">indices, Begin);<br class="">
+<br class="">
+ // Otherwise, add an index to drill into the first level of pointer.<br class="">
+ } else {<br class="">
+ assert(indices.empty());<br class="">
+ indices.push_back(llvm::<wbr class="">ConstantInt::get(Builder.CGM.<wbr class="">SizeTy, 0));<br class="">
+ }<br class="">
+<br class="">
+ assert(position >= Begin);<br class="">
+ indices.push_back(llvm::<wbr class="">ConstantInt::get(Builder.CGM.<wbr class="">SizeTy,<br class="">
+ position - Begin));<br class="">
+ }<br class="">
+ };<br class="">
+<br class="">
+ class ArrayBuilder : public AggregateBuilder {<br class="">
+ llvm::Type *EltTy;<br class="">
+ friend class ConstantBuilder;<br class="">
+ ArrayBuilder(ConstantBuilder &builder, AggregateBuilder *parent,<br class="">
+ llvm::Type *eltTy)<br class="">
+ : AggregateBuilder(builder, parent), EltTy(eltTy) {}<br class="">
+ public:<br class="">
+ size_t size() const {<br class="">
+ assert(!Finished);<br class="">
+ assert(!Frozen);<br class="">
+ assert(Begin <= Builder.Buffer.size());<br class="">
+ return Builder.Buffer.size() - Begin;<br class="">
+ }<br class="">
+<br class="">
+ /// Form an array constant from the values that have been added to this<br class="">
+ /// builder.<br class="">
+ llvm::Constant *finish() {<br class="">
+ markFinished();<br class="">
+<br class="">
+ auto &buffer = Builder.Buffer;<br class="">
+ assert((Begin < buffer.size() ||<br class="">
+ (Begin == buffer.size() && EltTy))<br class="">
+ && "didn't add any array elements without element type");<br class="">
+ auto elts = llvm::makeArrayRef(buffer).<wbr class="">slice(Begin);<br class="">
+ auto eltTy = EltTy ? EltTy : elts[0]->getType();<br class="">
+ auto type = llvm::ArrayType::get(eltTy, elts.size());<br class="">
+ auto constant = llvm::ConstantArray::get(type, elts);<br class="">
+ buffer.erase(buffer.begin() + Begin, buffer.end());<br class="">
+ return constant;<br class="">
+ }<br class="">
+<br class="">
+ template <class... As><br class="">
+ llvm::GlobalVariable *finishAndCreateGlobal(As &&...args) {<br class="">
+ assert(!Parent && "finishing non-root builder");<br class="">
+ return Builder.createGlobal(finish(), std::forward<As>(args)...);<br class="">
+ }<br class="">
+ };<br class="">
+<br class="">
+ ArrayBuilder beginArray(llvm::Type *eltTy = nullptr) {<br class="">
+ return ArrayBuilder(*this, nullptr, eltTy);<br class="">
+ }<br class="">
+<br class="">
+ class StructBuilder : public AggregateBuilder {<br class="">
+ llvm::StructType *Ty;<br class="">
+ friend class ConstantBuilder;<br class="">
+ StructBuilder(ConstantBuilder &builder, AggregateBuilder *parent,<br class="">
+ llvm::StructType *ty)<br class="">
+ : AggregateBuilder(builder, parent), Ty(ty) {}<br class="">
+ public:<br class="">
+ /// Finish the struct.<br class="">
+ llvm::Constant *finish(bool packed = false) {<br class="">
+ markFinished();<br class="">
+<br class="">
+ auto &buffer = Builder.Buffer;<br class="">
+ assert(Begin < buffer.size() && "didn't add any struct elements?");<br class="">
+ auto elts = llvm::makeArrayRef(buffer).<wbr class="">slice(Begin);<br class="">
+<br class="">
+ llvm::Constant *constant;<br class="">
+ if (Ty) {<br class="">
+ constant = llvm::ConstantStruct::get(Ty, elts);<br class="">
+ } else {<br class="">
+ constant = llvm::ConstantStruct::getAnon(<wbr class="">elts, packed);<br class="">
+ }<br class="">
+<br class="">
+ buffer.erase(buffer.begin() + Begin, buffer.end());<br class="">
+ return constant;<br class="">
+ }<br class="">
+<br class="">
+ template <class... As><br class="">
+ llvm::GlobalVariable *finishAndCreateGlobal(As &&...args) {<br class="">
+ assert(!Parent && "finishing non-root builder");<br class="">
+ return Builder.createGlobal(finish(), std::forward<As>(args)...);<br class="">
+ }<br class="">
+ };<br class="">
+<br class="">
+ StructBuilder beginStruct(llvm::StructType *structTy = nullptr) {<br class="">
+ return StructBuilder(*this, nullptr, structTy);<br class="">
+ }<br class="">
+<br class="">
+ llvm::GlobalVariable *createGlobal(llvm::Constant *initializer,<br class="">
+ StringRef name,<br class="">
+ CharUnits alignment,<br class="">
+ bool constant = false,<br class="">
+ llvm::GlobalValue::<wbr class="">LinkageTypes linkage<br class="">
+ = llvm::GlobalValue::<wbr class="">InternalLinkage,<br class="">
+ unsigned addressSpace = 0) {<br class="">
+ auto GV = new llvm::GlobalVariable(CGM.<wbr class="">getModule(),<br class="">
+ initializer->getType(),<br class="">
+ constant,<br class="">
+ linkage,<br class="">
+ initializer,<br class="">
+ name,<br class="">
+ /*insert before*/ nullptr,<br class="">
+ llvm::GlobalValue::<wbr class="">NotThreadLocal,<br class="">
+ addressSpace);<br class="">
+ GV->setAlignment(alignment.<wbr class="">getQuantity());<br class="">
+ return GV;<br class="">
+ }<br class="">
+};<br class="">
+<br class="">
+inline ConstantBuilder::ArrayBuilder<br class="">
+ConstantBuilder::<wbr class="">AggregateBuilder::beginArray(<wbr class="">llvm::Type *eltTy) {<br class="">
+ return ArrayBuilder(Builder, this, eltTy);<br class="">
+}<br class="">
+<br class="">
+inline ConstantBuilder::StructBuilder<br class="">
+ConstantBuilder::<wbr class="">AggregateBuilder::beginStruct(<wbr class="">llvm::StructType *structTy) {<br class="">
+ return StructBuilder(Builder, this, structTy);<br class="">
+}<br class="">
+<br class="">
+} // end namespace CodeGen<br class="">
+} // end namespace clang<br class="">
+<br class="">
+#endif<br class="">
<br class="">
<br class="">
______________________________<wbr class="">_________________<br class="">
cfe-commits mailing list<br class="">
<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/<wbr class="">mailman/listinfo/cfe-commits</a><br class="">
</blockquote></div><br class=""></div></div>
</div></blockquote></div><br class=""></body></html>