1 //===------- CGObjCGNU.cpp - Emit LLVM Code from ASTs for a Module --------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This provides Objective-C code generation targeting the GNU runtime. The
10 // class in this file generates structures used by the GNU Objective-C runtime
11 // library. These structures are defined in objc/objc.h and objc/objc-api.h in
12 // the GNU runtime distribution.
14 //===----------------------------------------------------------------------===//
17 #include "CGCleanup.h"
18 #include "CGObjCRuntime.h"
19 #include "CodeGenFunction.h"
20 #include "CodeGenModule.h"
21 #include "CodeGenTypes.h"
22 #include "SanitizerMetadata.h"
23 #include "clang/AST/ASTContext.h"
24 #include "clang/AST/Attr.h"
25 #include "clang/AST/Decl.h"
26 #include "clang/AST/DeclObjC.h"
27 #include "clang/AST/RecordLayout.h"
28 #include "clang/AST/StmtObjC.h"
29 #include "clang/Basic/FileManager.h"
30 #include "clang/Basic/SourceManager.h"
31 #include "clang/CodeGen/ConstantInitBuilder.h"
32 #include "llvm/ADT/SmallVector.h"
33 #include "llvm/ADT/StringMap.h"
34 #include "llvm/IR/DataLayout.h"
35 #include "llvm/IR/Intrinsics.h"
36 #include "llvm/IR/LLVMContext.h"
37 #include "llvm/IR/Module.h"
38 #include "llvm/Support/Compiler.h"
39 #include "llvm/Support/ConvertUTF.h"
42 using namespace clang
;
43 using namespace CodeGen
;
47 /// Class that lazily initialises the runtime function. Avoids inserting the
48 /// types and the function declaration into a module if they're not used, and
49 /// avoids constructing the type more than once if it's used more than once.
50 class LazyRuntimeFunction
{
51 CodeGenModule
*CGM
= nullptr;
52 llvm::FunctionType
*FTy
= nullptr;
53 const char *FunctionName
= nullptr;
54 llvm::FunctionCallee Function
= nullptr;
57 LazyRuntimeFunction() = default;
59 /// Initialises the lazy function with the name, return type, and the types
61 template <typename
... Tys
>
62 void init(CodeGenModule
*Mod
, const char *name
, llvm::Type
*RetTy
,
68 SmallVector
<llvm::Type
*, 8> ArgTys({Types
...});
69 FTy
= llvm::FunctionType::get(RetTy
, ArgTys
, false);
72 FTy
= llvm::FunctionType::get(RetTy
, std::nullopt
, false);
76 llvm::FunctionType
*getType() { return FTy
; }
78 /// Overloaded cast operator, allows the class to be implicitly cast to an
80 operator llvm::FunctionCallee() {
84 Function
= CGM
->CreateRuntimeFunction(FTy
, FunctionName
);
91 /// GNU Objective-C runtime code generation. This class implements the parts of
92 /// Objective-C support that are specific to the GNU family of runtimes (GCC,
93 /// GNUstep and ObjFW).
94 class CGObjCGNU
: public CGObjCRuntime
{
96 /// The LLVM module into which output is inserted
97 llvm::Module
&TheModule
;
98 /// strut objc_super. Used for sending messages to super. This structure
99 /// contains the receiver (object) and the expected class.
100 llvm::StructType
*ObjCSuperTy
;
101 /// struct objc_super*. The type of the argument to the superclass message
102 /// lookup functions.
103 llvm::PointerType
*PtrToObjCSuperTy
;
104 /// LLVM type for selectors. Opaque pointer (i8*) unless a header declaring
105 /// SEL is included in a header somewhere, in which case it will be whatever
106 /// type is declared in that header, most likely {i8*, i8*}.
107 llvm::PointerType
*SelectorTy
;
108 /// Element type of SelectorTy.
109 llvm::Type
*SelectorElemTy
;
110 /// LLVM i8 type. Cached here to avoid repeatedly getting it in all of the
111 /// places where it's used
112 llvm::IntegerType
*Int8Ty
;
113 /// Pointer to i8 - LLVM type of char*, for all of the places where the
114 /// runtime needs to deal with C strings.
115 llvm::PointerType
*PtrToInt8Ty
;
116 /// struct objc_protocol type
117 llvm::StructType
*ProtocolTy
;
119 llvm::PointerType
*ProtocolPtrTy
;
120 /// Instance Method Pointer type. This is a pointer to a function that takes,
121 /// at a minimum, an object and a selector, and is the generic type for
122 /// Objective-C methods. Due to differences between variadic / non-variadic
123 /// calling conventions, it must always be cast to the correct type before
124 /// actually being used.
125 llvm::PointerType
*IMPTy
;
126 /// Type of an untyped Objective-C object. Clang treats id as a built-in type
127 /// when compiling Objective-C code, so this may be an opaque pointer (i8*),
128 /// but if the runtime header declaring it is included then it may be a
129 /// pointer to a structure.
130 llvm::PointerType
*IdTy
;
131 /// Element type of IdTy.
132 llvm::Type
*IdElemTy
;
133 /// Pointer to a pointer to an Objective-C object. Used in the new ABI
134 /// message lookup function and some GC-related functions.
135 llvm::PointerType
*PtrToIdTy
;
136 /// The clang type of id. Used when using the clang CGCall infrastructure to
137 /// call Objective-C methods.
139 /// LLVM type for C int type.
140 llvm::IntegerType
*IntTy
;
141 /// LLVM type for an opaque pointer. This is identical to PtrToInt8Ty, but is
142 /// used in the code to document the difference between i8* meaning a pointer
143 /// to a C string and i8* meaning a pointer to some opaque type.
144 llvm::PointerType
*PtrTy
;
145 /// LLVM type for C long type. The runtime uses this in a lot of places where
146 /// it should be using intptr_t, but we can't fix this without breaking
147 /// compatibility with GCC...
148 llvm::IntegerType
*LongTy
;
149 /// LLVM type for C size_t. Used in various runtime data structures.
150 llvm::IntegerType
*SizeTy
;
151 /// LLVM type for C intptr_t.
152 llvm::IntegerType
*IntPtrTy
;
153 /// LLVM type for C ptrdiff_t. Mainly used in property accessor functions.
154 llvm::IntegerType
*PtrDiffTy
;
155 /// LLVM type for C int*. Used for GCC-ABI-compatible non-fragile instance
157 llvm::PointerType
*PtrToIntTy
;
158 /// LLVM type for Objective-C BOOL type.
160 /// 32-bit integer type, to save us needing to look it up every time it's used.
161 llvm::IntegerType
*Int32Ty
;
162 /// 64-bit integer type, to save us needing to look it up every time it's used.
163 llvm::IntegerType
*Int64Ty
;
164 /// The type of struct objc_property.
165 llvm::StructType
*PropertyMetadataTy
;
166 /// Metadata kind used to tie method lookups to message sends. The GNUstep
167 /// runtime provides some LLVM passes that can use this to do things like
168 /// automatic IMP caching and speculative inlining.
169 unsigned msgSendMDKind
;
170 /// Does the current target use SEH-based exceptions? False implies
171 /// Itanium-style DWARF unwinding.
172 bool usesSEHExceptions
;
173 /// Does the current target uses C++-based exceptions?
174 bool usesCxxExceptions
;
176 /// Helper to check if we are targeting a specific runtime version or later.
177 bool isRuntime(ObjCRuntime::Kind kind
, unsigned major
, unsigned minor
=0) {
178 const ObjCRuntime
&R
= CGM
.getLangOpts().ObjCRuntime
;
179 return (R
.getKind() == kind
) &&
180 (R
.getVersion() >= VersionTuple(major
, minor
));
183 std::string
ManglePublicSymbol(StringRef Name
) {
184 return (StringRef(CGM
.getTriple().isOSBinFormatCOFF() ? "$_" : "._") + Name
).str();
187 std::string
SymbolForProtocol(Twine Name
) {
188 return (ManglePublicSymbol("OBJC_PROTOCOL_") + Name
).str();
191 std::string
SymbolForProtocolRef(StringRef Name
) {
192 return (ManglePublicSymbol("OBJC_REF_PROTOCOL_") + Name
).str();
196 /// Helper function that generates a constant string and returns a pointer to
197 /// the start of the string. The result of this function can be used anywhere
198 /// where the C code specifies const char*.
199 llvm::Constant
*MakeConstantString(StringRef Str
, const char *Name
= "") {
200 ConstantAddress Array
=
201 CGM
.GetAddrOfConstantCString(std::string(Str
), Name
);
202 return Array
.getPointer();
205 /// Emits a linkonce_odr string, whose name is the prefix followed by the
206 /// string value. This allows the linker to combine the strings between
207 /// different modules. Used for EH typeinfo names, selector strings, and a
208 /// few other things.
209 llvm::Constant
*ExportUniqueString(const std::string
&Str
,
210 const std::string
&prefix
,
211 bool Private
=false) {
212 std::string name
= prefix
+ Str
;
213 auto *ConstStr
= TheModule
.getGlobalVariable(name
);
215 llvm::Constant
*value
= llvm::ConstantDataArray::getString(VMContext
,Str
);
216 auto *GV
= new llvm::GlobalVariable(TheModule
, value
->getType(), true,
217 llvm::GlobalValue::LinkOnceODRLinkage
, value
, name
);
218 GV
->setComdat(TheModule
.getOrInsertComdat(name
));
220 GV
->setVisibility(llvm::GlobalValue::HiddenVisibility
);
226 /// Returns a property name and encoding string.
227 llvm::Constant
*MakePropertyEncodingString(const ObjCPropertyDecl
*PD
,
228 const Decl
*Container
) {
229 assert(!isRuntime(ObjCRuntime::GNUstep
, 2));
230 if (isRuntime(ObjCRuntime::GNUstep
, 1, 6)) {
231 std::string NameAndAttributes
;
232 std::string TypeStr
=
233 CGM
.getContext().getObjCEncodingForPropertyDecl(PD
, Container
);
234 NameAndAttributes
+= '\0';
235 NameAndAttributes
+= TypeStr
.length() + 3;
236 NameAndAttributes
+= TypeStr
;
237 NameAndAttributes
+= '\0';
238 NameAndAttributes
+= PD
->getNameAsString();
239 return MakeConstantString(NameAndAttributes
);
241 return MakeConstantString(PD
->getNameAsString());
244 /// Push the property attributes into two structure fields.
245 void PushPropertyAttributes(ConstantStructBuilder
&Fields
,
246 const ObjCPropertyDecl
*property
, bool isSynthesized
=true, bool
248 int attrs
= property
->getPropertyAttributes();
249 // For read-only properties, clear the copy and retain flags
250 if (attrs
& ObjCPropertyAttribute::kind_readonly
) {
251 attrs
&= ~ObjCPropertyAttribute::kind_copy
;
252 attrs
&= ~ObjCPropertyAttribute::kind_retain
;
253 attrs
&= ~ObjCPropertyAttribute::kind_weak
;
254 attrs
&= ~ObjCPropertyAttribute::kind_strong
;
256 // The first flags field has the same attribute values as clang uses internally
257 Fields
.addInt(Int8Ty
, attrs
& 0xff);
260 // For protocol properties, synthesized and dynamic have no meaning, so we
261 // reuse these flags to indicate that this is a protocol property (both set
262 // has no meaning, as a property can't be both synthesized and dynamic)
263 attrs
|= isSynthesized
? (1<<0) : 0;
264 attrs
|= isDynamic
? (1<<1) : 0;
265 // The second field is the next four fields left shifted by two, with the
266 // low bit set to indicate whether the field is synthesized or dynamic.
267 Fields
.addInt(Int8Ty
, attrs
& 0xff);
268 // Two padding fields
269 Fields
.addInt(Int8Ty
, 0);
270 Fields
.addInt(Int8Ty
, 0);
273 virtual llvm::Constant
*GenerateCategoryProtocolList(const
274 ObjCCategoryDecl
*OCD
);
275 virtual ConstantArrayBuilder
PushPropertyListHeader(ConstantStructBuilder
&Fields
,
278 Fields
.addInt(IntTy
, count
);
279 // int size; (only in GNUstep v2 ABI.
280 if (isRuntime(ObjCRuntime::GNUstep
, 2)) {
281 llvm::DataLayout
td(&TheModule
);
282 Fields
.addInt(IntTy
, td
.getTypeSizeInBits(PropertyMetadataTy
) /
283 CGM
.getContext().getCharWidth());
285 // struct objc_property_list *next;
287 // struct objc_property properties[]
288 return Fields
.beginArray(PropertyMetadataTy
);
290 virtual void PushProperty(ConstantArrayBuilder
&PropertiesArray
,
291 const ObjCPropertyDecl
*property
,
293 bool isSynthesized
=true, bool
295 auto Fields
= PropertiesArray
.beginStruct(PropertyMetadataTy
);
296 ASTContext
&Context
= CGM
.getContext();
297 Fields
.add(MakePropertyEncodingString(property
, OCD
));
298 PushPropertyAttributes(Fields
, property
, isSynthesized
, isDynamic
);
299 auto addPropertyMethod
= [&](const ObjCMethodDecl
*accessor
) {
301 std::string TypeStr
= Context
.getObjCEncodingForMethodDecl(accessor
);
302 llvm::Constant
*TypeEncoding
= MakeConstantString(TypeStr
);
303 Fields
.add(MakeConstantString(accessor
->getSelector().getAsString()));
304 Fields
.add(TypeEncoding
);
310 addPropertyMethod(property
->getGetterMethodDecl());
311 addPropertyMethod(property
->getSetterMethodDecl());
312 Fields
.finishAndAddTo(PropertiesArray
);
315 /// Ensures that the value has the required type, by inserting a bitcast if
316 /// required. This function lets us avoid inserting bitcasts that are
318 llvm::Value
*EnforceType(CGBuilderTy
&B
, llvm::Value
*V
, llvm::Type
*Ty
) {
319 if (V
->getType() == Ty
)
321 return B
.CreateBitCast(V
, Ty
);
324 // Some zeros used for GEPs in lots of places.
325 llvm::Constant
*Zeros
[2];
326 /// Null pointer value. Mainly used as a terminator in various arrays.
327 llvm::Constant
*NULLPtr
;
329 llvm::LLVMContext
&VMContext
;
333 /// Placeholder for the class. Lots of things refer to the class before we've
334 /// actually emitted it. We use this alias as a placeholder, and then replace
335 /// it with a pointer to the class structure before finally emitting the
337 llvm::GlobalAlias
*ClassPtrAlias
;
338 /// Placeholder for the metaclass. Lots of things refer to the class before
339 /// we've / actually emitted it. We use this alias as a placeholder, and then
340 /// replace / it with a pointer to the metaclass structure before finally
341 /// emitting the / module.
342 llvm::GlobalAlias
*MetaClassPtrAlias
;
343 /// All of the classes that have been generated for this compilation units.
344 std::vector
<llvm::Constant
*> Classes
;
345 /// All of the categories that have been generated for this compilation units.
346 std::vector
<llvm::Constant
*> Categories
;
347 /// All of the Objective-C constant strings that have been generated for this
348 /// compilation units.
349 std::vector
<llvm::Constant
*> ConstantStrings
;
350 /// Map from string values to Objective-C constant strings in the output.
351 /// Used to prevent emitting Objective-C strings more than once. This should
352 /// not be required at all - CodeGenModule should manage this list.
353 llvm::StringMap
<llvm::Constant
*> ObjCStrings
;
354 /// All of the protocols that have been declared.
355 llvm::StringMap
<llvm::Constant
*> ExistingProtocols
;
356 /// For each variant of a selector, we store the type encoding and a
357 /// placeholder value. For an untyped selector, the type will be the empty
358 /// string. Selector references are all done via the module's selector table,
359 /// so we create an alias as a placeholder and then replace it with the real
361 typedef std::pair
<std::string
, llvm::GlobalAlias
*> TypedSelector
;
362 /// Type of the selector map. This is roughly equivalent to the structure
363 /// used in the GNUstep runtime, which maintains a list of all of the valid
364 /// types for a selector in a table.
365 typedef llvm::DenseMap
<Selector
, SmallVector
<TypedSelector
, 2> >
367 /// A map from selectors to selector types. This allows us to emit all
368 /// selectors of the same name and type together.
369 SelectorMap SelectorTable
;
371 /// Selectors related to memory management. When compiling in GC mode, we
373 Selector RetainSel
, ReleaseSel
, AutoreleaseSel
;
374 /// Runtime functions used for memory management in GC mode. Note that clang
375 /// supports code generation for calling these functions, but neither GNU
376 /// runtime actually supports this API properly yet.
377 LazyRuntimeFunction IvarAssignFn
, StrongCastAssignFn
, MemMoveFn
, WeakReadFn
,
378 WeakAssignFn
, GlobalAssignFn
;
380 typedef std::pair
<std::string
, std::string
> ClassAliasPair
;
381 /// All classes that have aliases set for them.
382 std::vector
<ClassAliasPair
> ClassAliases
;
385 /// Function used for throwing Objective-C exceptions.
386 LazyRuntimeFunction ExceptionThrowFn
;
387 /// Function used for rethrowing exceptions, used at the end of \@finally or
388 /// \@synchronize blocks.
389 LazyRuntimeFunction ExceptionReThrowFn
;
390 /// Function called when entering a catch function. This is required for
391 /// differentiating Objective-C exceptions and foreign exceptions.
392 LazyRuntimeFunction EnterCatchFn
;
393 /// Function called when exiting from a catch block. Used to do exception
395 LazyRuntimeFunction ExitCatchFn
;
396 /// Function called when entering an \@synchronize block. Acquires the lock.
397 LazyRuntimeFunction SyncEnterFn
;
398 /// Function called when exiting an \@synchronize block. Releases the lock.
399 LazyRuntimeFunction SyncExitFn
;
402 /// Function called if fast enumeration detects that the collection is
403 /// modified during the update.
404 LazyRuntimeFunction EnumerationMutationFn
;
405 /// Function for implementing synthesized property getters that return an
407 LazyRuntimeFunction GetPropertyFn
;
408 /// Function for implementing synthesized property setters that return an
410 LazyRuntimeFunction SetPropertyFn
;
411 /// Function used for non-object declared property getters.
412 LazyRuntimeFunction GetStructPropertyFn
;
413 /// Function used for non-object declared property setters.
414 LazyRuntimeFunction SetStructPropertyFn
;
417 /// The version of the runtime that this class targets. Must match the
418 /// version in the runtime.
420 /// The version of the protocol class. Used to differentiate between ObjC1
421 /// and ObjC2 protocols. Objective-C 1 protocols can not contain optional
422 /// components and can not contain declared properties. We always emit
423 /// Objective-C 2 property structures, but we have to pretend that they're
424 /// Objective-C 1 property structures when targeting the GCC runtime or it
426 const int ProtocolVersion
;
427 /// The version of the class ABI. This value is used in the class structure
428 /// and indicates how various fields should be interpreted.
429 const int ClassABIVersion
;
430 /// Generates an instance variable list structure. This is a structure
431 /// containing a size and an array of structures containing instance variable
432 /// metadata. This is used purely for introspection in the fragile ABI. In
433 /// the non-fragile ABI, it's used for instance variable fixup.
434 virtual llvm::Constant
*GenerateIvarList(ArrayRef
<llvm::Constant
*> IvarNames
,
435 ArrayRef
<llvm::Constant
*> IvarTypes
,
436 ArrayRef
<llvm::Constant
*> IvarOffsets
,
437 ArrayRef
<llvm::Constant
*> IvarAlign
,
438 ArrayRef
<Qualifiers::ObjCLifetime
> IvarOwnership
);
440 /// Generates a method list structure. This is a structure containing a size
441 /// and an array of structures containing method metadata.
443 /// This structure is used by both classes and categories, and contains a next
444 /// pointer allowing them to be chained together in a linked list.
445 llvm::Constant
*GenerateMethodList(StringRef ClassName
,
446 StringRef CategoryName
,
447 ArrayRef
<const ObjCMethodDecl
*> Methods
,
448 bool isClassMethodList
);
450 /// Emits an empty protocol. This is used for \@protocol() where no protocol
451 /// is found. The runtime will (hopefully) fix up the pointer to refer to the
453 virtual llvm::Constant
*GenerateEmptyProtocol(StringRef ProtocolName
);
455 /// Generates a list of property metadata structures. This follows the same
456 /// pattern as method and instance variable metadata lists.
457 llvm::Constant
*GeneratePropertyList(const Decl
*Container
,
458 const ObjCContainerDecl
*OCD
,
459 bool isClassProperty
=false,
460 bool protocolOptionalProperties
=false);
462 /// Generates a list of referenced protocols. Classes, categories, and
463 /// protocols all use this structure.
464 llvm::Constant
*GenerateProtocolList(ArrayRef
<std::string
> Protocols
);
466 /// To ensure that all protocols are seen by the runtime, we add a category on
467 /// a class defined in the runtime, declaring no methods, but adopting the
468 /// protocols. This is a horribly ugly hack, but it allows us to collect all
469 /// of the protocols without changing the ABI.
470 void GenerateProtocolHolderCategory();
472 /// Generates a class structure.
473 llvm::Constant
*GenerateClassStructure(
474 llvm::Constant
*MetaClass
,
475 llvm::Constant
*SuperClass
,
478 llvm::Constant
*Version
,
479 llvm::Constant
*InstanceSize
,
480 llvm::Constant
*IVars
,
481 llvm::Constant
*Methods
,
482 llvm::Constant
*Protocols
,
483 llvm::Constant
*IvarOffsets
,
484 llvm::Constant
*Properties
,
485 llvm::Constant
*StrongIvarBitmap
,
486 llvm::Constant
*WeakIvarBitmap
,
489 /// Generates a method list. This is used by protocols to define the required
490 /// and optional methods.
491 virtual llvm::Constant
*GenerateProtocolMethodList(
492 ArrayRef
<const ObjCMethodDecl
*> Methods
);
493 /// Emits optional and required method lists.
495 void EmitProtocolMethodList(T
&&Methods
, llvm::Constant
*&Required
,
496 llvm::Constant
*&Optional
) {
497 SmallVector
<const ObjCMethodDecl
*, 16> RequiredMethods
;
498 SmallVector
<const ObjCMethodDecl
*, 16> OptionalMethods
;
499 for (const auto *I
: Methods
)
501 OptionalMethods
.push_back(I
);
503 RequiredMethods
.push_back(I
);
504 Required
= GenerateProtocolMethodList(RequiredMethods
);
505 Optional
= GenerateProtocolMethodList(OptionalMethods
);
508 /// Returns a selector with the specified type encoding. An empty string is
509 /// used to return an untyped selector (with the types field set to NULL).
510 virtual llvm::Value
*GetTypedSelector(CodeGenFunction
&CGF
, Selector Sel
,
511 const std::string
&TypeEncoding
);
513 /// Returns the name of ivar offset variables. In the GNUstep v1 ABI, this
514 /// contains the class and ivar names, in the v2 ABI this contains the type
515 /// encoding as well.
516 virtual std::string
GetIVarOffsetVariableName(const ObjCInterfaceDecl
*ID
,
517 const ObjCIvarDecl
*Ivar
) {
518 const std::string Name
= "__objc_ivar_offset_" + ID
->getNameAsString()
519 + '.' + Ivar
->getNameAsString();
522 /// Returns the variable used to store the offset of an instance variable.
523 llvm::GlobalVariable
*ObjCIvarOffsetVariable(const ObjCInterfaceDecl
*ID
,
524 const ObjCIvarDecl
*Ivar
);
525 /// Emits a reference to a class. This allows the linker to object if there
526 /// is no class of the matching name.
527 void EmitClassRef(const std::string
&className
);
529 /// Emits a pointer to the named class
530 virtual llvm::Value
*GetClassNamed(CodeGenFunction
&CGF
,
531 const std::string
&Name
, bool isWeak
);
533 /// Looks up the method for sending a message to the specified object. This
534 /// mechanism differs between the GCC and GNU runtimes, so this method must be
535 /// overridden in subclasses.
536 virtual llvm::Value
*LookupIMP(CodeGenFunction
&CGF
,
537 llvm::Value
*&Receiver
,
540 MessageSendInfo
&MSI
) = 0;
542 /// Looks up the method for sending a message to a superclass. This
543 /// mechanism differs between the GCC and GNU runtimes, so this method must
544 /// be overridden in subclasses.
545 virtual llvm::Value
*LookupIMPSuper(CodeGenFunction
&CGF
,
548 MessageSendInfo
&MSI
) = 0;
550 /// Libobjc2 uses a bitfield representation where small(ish) bitfields are
551 /// stored in a 64-bit value with the low bit set to 1 and the remaining 63
552 /// bits set to their values, LSB first, while larger ones are stored in a
553 /// structure of this / form:
555 /// struct { int32_t length; int32_t values[length]; };
557 /// The values in the array are stored in host-endian format, with the least
558 /// significant bit being assumed to come first in the bitfield. Therefore,
559 /// a bitfield with the 64th bit set will be (int64_t)&{ 2, [0, 1<<31] },
560 /// while a bitfield / with the 63rd bit set will be 1<<64.
561 llvm::Constant
*MakeBitField(ArrayRef
<bool> bits
);
564 CGObjCGNU(CodeGenModule
&cgm
, unsigned runtimeABIVersion
,
565 unsigned protocolClassVersion
, unsigned classABI
=1);
567 ConstantAddress
GenerateConstantString(const StringLiteral
*) override
;
570 GenerateMessageSend(CodeGenFunction
&CGF
, ReturnValueSlot Return
,
571 QualType ResultType
, Selector Sel
,
572 llvm::Value
*Receiver
, const CallArgList
&CallArgs
,
573 const ObjCInterfaceDecl
*Class
,
574 const ObjCMethodDecl
*Method
) override
;
576 GenerateMessageSendSuper(CodeGenFunction
&CGF
, ReturnValueSlot Return
,
577 QualType ResultType
, Selector Sel
,
578 const ObjCInterfaceDecl
*Class
,
579 bool isCategoryImpl
, llvm::Value
*Receiver
,
580 bool IsClassMessage
, const CallArgList
&CallArgs
,
581 const ObjCMethodDecl
*Method
) override
;
582 llvm::Value
*GetClass(CodeGenFunction
&CGF
,
583 const ObjCInterfaceDecl
*OID
) override
;
584 llvm::Value
*GetSelector(CodeGenFunction
&CGF
, Selector Sel
) override
;
585 Address
GetAddrOfSelector(CodeGenFunction
&CGF
, Selector Sel
) override
;
586 llvm::Value
*GetSelector(CodeGenFunction
&CGF
,
587 const ObjCMethodDecl
*Method
) override
;
588 virtual llvm::Constant
*GetConstantSelector(Selector Sel
,
589 const std::string
&TypeEncoding
) {
590 llvm_unreachable("Runtime unable to generate constant selector");
592 llvm::Constant
*GetConstantSelector(const ObjCMethodDecl
*M
) {
593 return GetConstantSelector(M
->getSelector(),
594 CGM
.getContext().getObjCEncodingForMethodDecl(M
));
596 llvm::Constant
*GetEHType(QualType T
) override
;
598 llvm::Function
*GenerateMethod(const ObjCMethodDecl
*OMD
,
599 const ObjCContainerDecl
*CD
) override
;
601 // Map to unify direct method definitions.
602 llvm::DenseMap
<const ObjCMethodDecl
*, llvm::Function
*>
603 DirectMethodDefinitions
;
604 void GenerateDirectMethodPrologue(CodeGenFunction
&CGF
, llvm::Function
*Fn
,
605 const ObjCMethodDecl
*OMD
,
606 const ObjCContainerDecl
*CD
) override
;
607 void GenerateCategory(const ObjCCategoryImplDecl
*CMD
) override
;
608 void GenerateClass(const ObjCImplementationDecl
*ClassDecl
) override
;
609 void RegisterAlias(const ObjCCompatibleAliasDecl
*OAD
) override
;
610 llvm::Value
*GenerateProtocolRef(CodeGenFunction
&CGF
,
611 const ObjCProtocolDecl
*PD
) override
;
612 void GenerateProtocol(const ObjCProtocolDecl
*PD
) override
;
614 virtual llvm::Constant
*GenerateProtocolRef(const ObjCProtocolDecl
*PD
);
616 llvm::Constant
*GetOrEmitProtocol(const ObjCProtocolDecl
*PD
) override
{
617 return GenerateProtocolRef(PD
);
620 llvm::Function
*ModuleInitFunction() override
;
621 llvm::FunctionCallee
GetPropertyGetFunction() override
;
622 llvm::FunctionCallee
GetPropertySetFunction() override
;
623 llvm::FunctionCallee
GetOptimizedPropertySetFunction(bool atomic
,
625 llvm::FunctionCallee
GetSetStructFunction() override
;
626 llvm::FunctionCallee
GetGetStructFunction() override
;
627 llvm::FunctionCallee
GetCppAtomicObjectGetFunction() override
;
628 llvm::FunctionCallee
GetCppAtomicObjectSetFunction() override
;
629 llvm::FunctionCallee
EnumerationMutationFunction() override
;
631 void EmitTryStmt(CodeGenFunction
&CGF
,
632 const ObjCAtTryStmt
&S
) override
;
633 void EmitSynchronizedStmt(CodeGenFunction
&CGF
,
634 const ObjCAtSynchronizedStmt
&S
) override
;
635 void EmitThrowStmt(CodeGenFunction
&CGF
,
636 const ObjCAtThrowStmt
&S
,
637 bool ClearInsertionPoint
=true) override
;
638 llvm::Value
* EmitObjCWeakRead(CodeGenFunction
&CGF
,
639 Address AddrWeakObj
) override
;
640 void EmitObjCWeakAssign(CodeGenFunction
&CGF
,
641 llvm::Value
*src
, Address dst
) override
;
642 void EmitObjCGlobalAssign(CodeGenFunction
&CGF
,
643 llvm::Value
*src
, Address dest
,
644 bool threadlocal
=false) override
;
645 void EmitObjCIvarAssign(CodeGenFunction
&CGF
, llvm::Value
*src
,
646 Address dest
, llvm::Value
*ivarOffset
) override
;
647 void EmitObjCStrongCastAssign(CodeGenFunction
&CGF
,
648 llvm::Value
*src
, Address dest
) override
;
649 void EmitGCMemmoveCollectable(CodeGenFunction
&CGF
, Address DestPtr
,
651 llvm::Value
*Size
) override
;
652 LValue
EmitObjCValueForIvar(CodeGenFunction
&CGF
, QualType ObjectTy
,
653 llvm::Value
*BaseValue
, const ObjCIvarDecl
*Ivar
,
654 unsigned CVRQualifiers
) override
;
655 llvm::Value
*EmitIvarOffset(CodeGenFunction
&CGF
,
656 const ObjCInterfaceDecl
*Interface
,
657 const ObjCIvarDecl
*Ivar
) override
;
658 llvm::Value
*EmitNSAutoreleasePoolClassRef(CodeGenFunction
&CGF
) override
;
659 llvm::Constant
*BuildGCBlockLayout(CodeGenModule
&CGM
,
660 const CGBlockInfo
&blockInfo
) override
{
663 llvm::Constant
*BuildRCBlockLayout(CodeGenModule
&CGM
,
664 const CGBlockInfo
&blockInfo
) override
{
668 llvm::Constant
*BuildByrefLayout(CodeGenModule
&CGM
, QualType T
) override
{
673 /// Class representing the legacy GCC Objective-C ABI. This is the default when
674 /// -fobjc-nonfragile-abi is not specified.
676 /// The GCC ABI target actually generates code that is approximately compatible
677 /// with the new GNUstep runtime ABI, but refrains from using any features that
678 /// would not work with the GCC runtime. For example, clang always generates
679 /// the extended form of the class structure, and the extra fields are simply
680 /// ignored by GCC libobjc.
681 class CGObjCGCC
: public CGObjCGNU
{
682 /// The GCC ABI message lookup function. Returns an IMP pointing to the
683 /// method implementation for this message.
684 LazyRuntimeFunction MsgLookupFn
;
685 /// The GCC ABI superclass message lookup function. Takes a pointer to a
686 /// structure describing the receiver and the class, and a selector as
687 /// arguments. Returns the IMP for the corresponding method.
688 LazyRuntimeFunction MsgLookupSuperFn
;
691 llvm::Value
*LookupIMP(CodeGenFunction
&CGF
, llvm::Value
*&Receiver
,
692 llvm::Value
*cmd
, llvm::MDNode
*node
,
693 MessageSendInfo
&MSI
) override
{
694 CGBuilderTy
&Builder
= CGF
.Builder
;
695 llvm::Value
*args
[] = {
696 EnforceType(Builder
, Receiver
, IdTy
),
697 EnforceType(Builder
, cmd
, SelectorTy
) };
698 llvm::CallBase
*imp
= CGF
.EmitRuntimeCallOrInvoke(MsgLookupFn
, args
);
699 imp
->setMetadata(msgSendMDKind
, node
);
703 llvm::Value
*LookupIMPSuper(CodeGenFunction
&CGF
, Address ObjCSuper
,
704 llvm::Value
*cmd
, MessageSendInfo
&MSI
) override
{
705 CGBuilderTy
&Builder
= CGF
.Builder
;
706 llvm::Value
*lookupArgs
[] = {
707 EnforceType(Builder
, ObjCSuper
.emitRawPointer(CGF
), PtrToObjCSuperTy
),
709 return CGF
.EmitNounwindRuntimeCall(MsgLookupSuperFn
, lookupArgs
);
713 CGObjCGCC(CodeGenModule
&Mod
) : CGObjCGNU(Mod
, 8, 2) {
714 // IMP objc_msg_lookup(id, SEL);
715 MsgLookupFn
.init(&CGM
, "objc_msg_lookup", IMPTy
, IdTy
, SelectorTy
);
716 // IMP objc_msg_lookup_super(struct objc_super*, SEL);
717 MsgLookupSuperFn
.init(&CGM
, "objc_msg_lookup_super", IMPTy
,
718 PtrToObjCSuperTy
, SelectorTy
);
722 /// Class used when targeting the new GNUstep runtime ABI.
723 class CGObjCGNUstep
: public CGObjCGNU
{
724 /// The slot lookup function. Returns a pointer to a cacheable structure
725 /// that contains (among other things) the IMP.
726 LazyRuntimeFunction SlotLookupFn
;
727 /// The GNUstep ABI superclass message lookup function. Takes a pointer to
728 /// a structure describing the receiver and the class, and a selector as
729 /// arguments. Returns the slot for the corresponding method. Superclass
730 /// message lookup rarely changes, so this is a good caching opportunity.
731 LazyRuntimeFunction SlotLookupSuperFn
;
732 /// Specialised function for setting atomic retain properties
733 LazyRuntimeFunction SetPropertyAtomic
;
734 /// Specialised function for setting atomic copy properties
735 LazyRuntimeFunction SetPropertyAtomicCopy
;
736 /// Specialised function for setting nonatomic retain properties
737 LazyRuntimeFunction SetPropertyNonAtomic
;
738 /// Specialised function for setting nonatomic copy properties
739 LazyRuntimeFunction SetPropertyNonAtomicCopy
;
740 /// Function to perform atomic copies of C++ objects with nontrivial copy
741 /// constructors from Objective-C ivars.
742 LazyRuntimeFunction CxxAtomicObjectGetFn
;
743 /// Function to perform atomic copies of C++ objects with nontrivial copy
744 /// constructors to Objective-C ivars.
745 LazyRuntimeFunction CxxAtomicObjectSetFn
;
746 /// Type of a slot structure pointer. This is returned by the various
747 /// lookup functions.
749 /// Type of a slot structure.
750 llvm::Type
*SlotStructTy
;
753 llvm::Constant
*GetEHType(QualType T
) override
;
756 llvm::Value
*LookupIMP(CodeGenFunction
&CGF
, llvm::Value
*&Receiver
,
757 llvm::Value
*cmd
, llvm::MDNode
*node
,
758 MessageSendInfo
&MSI
) override
{
759 CGBuilderTy
&Builder
= CGF
.Builder
;
760 llvm::FunctionCallee LookupFn
= SlotLookupFn
;
762 // Store the receiver on the stack so that we can reload it later
763 RawAddress ReceiverPtr
=
764 CGF
.CreateTempAlloca(Receiver
->getType(), CGF
.getPointerAlign());
765 Builder
.CreateStore(Receiver
, ReceiverPtr
);
769 if (isa
<ObjCMethodDecl
>(CGF
.CurCodeDecl
)) {
770 self
= CGF
.LoadObjCSelf();
772 self
= llvm::ConstantPointerNull::get(IdTy
);
775 // The lookup function is guaranteed not to capture the receiver pointer.
776 if (auto *LookupFn2
= dyn_cast
<llvm::Function
>(LookupFn
.getCallee()))
777 LookupFn2
->addParamAttr(0, llvm::Attribute::NoCapture
);
779 llvm::Value
*args
[] = {
780 EnforceType(Builder
, ReceiverPtr
.getPointer(), PtrToIdTy
),
781 EnforceType(Builder
, cmd
, SelectorTy
),
782 EnforceType(Builder
, self
, IdTy
)};
783 llvm::CallBase
*slot
= CGF
.EmitRuntimeCallOrInvoke(LookupFn
, args
);
784 slot
->setOnlyReadsMemory();
785 slot
->setMetadata(msgSendMDKind
, node
);
787 // Load the imp from the slot
788 llvm::Value
*imp
= Builder
.CreateAlignedLoad(
789 IMPTy
, Builder
.CreateStructGEP(SlotStructTy
, slot
, 4),
790 CGF
.getPointerAlign());
792 // The lookup function may have changed the receiver, so make sure we use
794 Receiver
= Builder
.CreateLoad(ReceiverPtr
, true);
798 llvm::Value
*LookupIMPSuper(CodeGenFunction
&CGF
, Address ObjCSuper
,
800 MessageSendInfo
&MSI
) override
{
801 CGBuilderTy
&Builder
= CGF
.Builder
;
802 llvm::Value
*lookupArgs
[] = {ObjCSuper
.emitRawPointer(CGF
), cmd
};
804 llvm::CallInst
*slot
=
805 CGF
.EmitNounwindRuntimeCall(SlotLookupSuperFn
, lookupArgs
);
806 slot
->setOnlyReadsMemory();
808 return Builder
.CreateAlignedLoad(
809 IMPTy
, Builder
.CreateStructGEP(SlotStructTy
, slot
, 4),
810 CGF
.getPointerAlign());
814 CGObjCGNUstep(CodeGenModule
&Mod
) : CGObjCGNUstep(Mod
, 9, 3, 1) {}
815 CGObjCGNUstep(CodeGenModule
&Mod
, unsigned ABI
, unsigned ProtocolABI
,
817 CGObjCGNU(Mod
, ABI
, ProtocolABI
, ClassABI
) {
818 const ObjCRuntime
&R
= CGM
.getLangOpts().ObjCRuntime
;
820 SlotStructTy
= llvm::StructType::get(PtrTy
, PtrTy
, PtrTy
, IntTy
, IMPTy
);
821 SlotTy
= llvm::PointerType::getUnqual(SlotStructTy
);
822 // Slot_t objc_msg_lookup_sender(id *receiver, SEL selector, id sender);
823 SlotLookupFn
.init(&CGM
, "objc_msg_lookup_sender", SlotTy
, PtrToIdTy
,
825 // Slot_t objc_slot_lookup_super(struct objc_super*, SEL);
826 SlotLookupSuperFn
.init(&CGM
, "objc_slot_lookup_super", SlotTy
,
827 PtrToObjCSuperTy
, SelectorTy
);
828 // If we're in ObjC++ mode, then we want to make
829 llvm::Type
*VoidTy
= llvm::Type::getVoidTy(VMContext
);
830 if (usesCxxExceptions
) {
831 // void *__cxa_begin_catch(void *e)
832 EnterCatchFn
.init(&CGM
, "__cxa_begin_catch", PtrTy
, PtrTy
);
833 // void __cxa_end_catch(void)
834 ExitCatchFn
.init(&CGM
, "__cxa_end_catch", VoidTy
);
835 // void objc_exception_rethrow(void*)
836 ExceptionReThrowFn
.init(&CGM
, "__cxa_rethrow", PtrTy
);
837 } else if (usesSEHExceptions
) {
838 // void objc_exception_rethrow(void)
839 ExceptionReThrowFn
.init(&CGM
, "objc_exception_rethrow", VoidTy
);
840 } else if (CGM
.getLangOpts().CPlusPlus
) {
841 // void *__cxa_begin_catch(void *e)
842 EnterCatchFn
.init(&CGM
, "__cxa_begin_catch", PtrTy
, PtrTy
);
843 // void __cxa_end_catch(void)
844 ExitCatchFn
.init(&CGM
, "__cxa_end_catch", VoidTy
);
845 // void _Unwind_Resume_or_Rethrow(void*)
846 ExceptionReThrowFn
.init(&CGM
, "_Unwind_Resume_or_Rethrow", VoidTy
,
848 } else if (R
.getVersion() >= VersionTuple(1, 7)) {
849 // id objc_begin_catch(void *e)
850 EnterCatchFn
.init(&CGM
, "objc_begin_catch", IdTy
, PtrTy
);
851 // void objc_end_catch(void)
852 ExitCatchFn
.init(&CGM
, "objc_end_catch", VoidTy
);
853 // void _Unwind_Resume_or_Rethrow(void*)
854 ExceptionReThrowFn
.init(&CGM
, "objc_exception_rethrow", VoidTy
, PtrTy
);
856 SetPropertyAtomic
.init(&CGM
, "objc_setProperty_atomic", VoidTy
, IdTy
,
857 SelectorTy
, IdTy
, PtrDiffTy
);
858 SetPropertyAtomicCopy
.init(&CGM
, "objc_setProperty_atomic_copy", VoidTy
,
859 IdTy
, SelectorTy
, IdTy
, PtrDiffTy
);
860 SetPropertyNonAtomic
.init(&CGM
, "objc_setProperty_nonatomic", VoidTy
,
861 IdTy
, SelectorTy
, IdTy
, PtrDiffTy
);
862 SetPropertyNonAtomicCopy
.init(&CGM
, "objc_setProperty_nonatomic_copy",
863 VoidTy
, IdTy
, SelectorTy
, IdTy
, PtrDiffTy
);
864 // void objc_setCppObjectAtomic(void *dest, const void *src, void
866 CxxAtomicObjectSetFn
.init(&CGM
, "objc_setCppObjectAtomic", VoidTy
, PtrTy
,
868 // void objc_getCppObjectAtomic(void *dest, const void *src, void
870 CxxAtomicObjectGetFn
.init(&CGM
, "objc_getCppObjectAtomic", VoidTy
, PtrTy
,
874 llvm::FunctionCallee
GetCppAtomicObjectGetFunction() override
{
875 // The optimised functions were added in version 1.7 of the GNUstep
877 assert (CGM
.getLangOpts().ObjCRuntime
.getVersion() >=
879 return CxxAtomicObjectGetFn
;
882 llvm::FunctionCallee
GetCppAtomicObjectSetFunction() override
{
883 // The optimised functions were added in version 1.7 of the GNUstep
885 assert (CGM
.getLangOpts().ObjCRuntime
.getVersion() >=
887 return CxxAtomicObjectSetFn
;
890 llvm::FunctionCallee
GetOptimizedPropertySetFunction(bool atomic
,
891 bool copy
) override
{
892 // The optimised property functions omit the GC check, and so are not
893 // safe to use in GC mode. The standard functions are fast in GC mode,
894 // so there is less advantage in using them.
895 assert ((CGM
.getLangOpts().getGC() == LangOptions::NonGC
));
896 // The optimised functions were added in version 1.7 of the GNUstep
898 assert (CGM
.getLangOpts().ObjCRuntime
.getVersion() >=
902 if (copy
) return SetPropertyAtomicCopy
;
903 return SetPropertyAtomic
;
906 return copy
? SetPropertyNonAtomicCopy
: SetPropertyNonAtomic
;
910 /// GNUstep Objective-C ABI version 2 implementation.
911 /// This is the ABI that provides a clean break with the legacy GCC ABI and
912 /// cleans up a number of things that were added to work around 1980s linkers.
913 class CGObjCGNUstep2
: public CGObjCGNUstep
{
918 ClassReferenceSection
,
921 ProtocolReferenceSection
,
923 ConstantStringSection
925 /// The subset of `objc_class_flags` used at compile time.
927 /// This is a metaclass
928 ClassFlagMeta
= (1 << 0),
929 /// This class has been initialised by the runtime (+initialize has been
930 /// sent if necessary).
931 ClassFlagInitialized
= (1 << 8),
933 static const char *const SectionsBaseNames
[8];
934 static const char *const PECOFFSectionsBaseNames
[8];
935 template<SectionKind K
>
936 std::string
sectionName() {
937 if (CGM
.getTriple().isOSBinFormatCOFF()) {
938 std::string
name(PECOFFSectionsBaseNames
[K
]);
942 return SectionsBaseNames
[K
];
944 /// The GCC ABI superclass message lookup function. Takes a pointer to a
945 /// structure describing the receiver and the class, and a selector as
946 /// arguments. Returns the IMP for the corresponding method.
947 LazyRuntimeFunction MsgLookupSuperFn
;
948 /// Function to ensure that +initialize is sent to a class.
949 LazyRuntimeFunction SentInitializeFn
;
950 /// A flag indicating if we've emitted at least one protocol.
951 /// If we haven't, then we need to emit an empty protocol, to ensure that the
952 /// __start__objc_protocols and __stop__objc_protocols sections exist.
953 bool EmittedProtocol
= false;
954 /// A flag indicating if we've emitted at least one protocol reference.
955 /// If we haven't, then we need to emit an empty protocol, to ensure that the
956 /// __start__objc_protocol_refs and __stop__objc_protocol_refs sections
958 bool EmittedProtocolRef
= false;
959 /// A flag indicating if we've emitted at least one class.
960 /// If we haven't, then we need to emit an empty protocol, to ensure that the
961 /// __start__objc_classes and __stop__objc_classes sections / exist.
962 bool EmittedClass
= false;
963 /// Generate the name of a symbol for a reference to a class. Accesses to
964 /// classes should be indirected via this.
966 typedef std::pair
<std::string
, std::pair
<llvm::GlobalVariable
*, int>>
968 std::vector
<EarlyInitPair
> EarlyInitList
;
970 std::string
SymbolForClassRef(StringRef Name
, bool isWeak
) {
972 return (ManglePublicSymbol("OBJC_WEAK_REF_CLASS_") + Name
).str();
974 return (ManglePublicSymbol("OBJC_REF_CLASS_") + Name
).str();
976 /// Generate the name of a class symbol.
977 std::string
SymbolForClass(StringRef Name
) {
978 return (ManglePublicSymbol("OBJC_CLASS_") + Name
).str();
980 void CallRuntimeFunction(CGBuilderTy
&B
, StringRef FunctionName
,
981 ArrayRef
<llvm::Value
*> Args
) {
982 SmallVector
<llvm::Type
*,8> Types
;
983 for (auto *Arg
: Args
)
984 Types
.push_back(Arg
->getType());
985 llvm::FunctionType
*FT
= llvm::FunctionType::get(B
.getVoidTy(), Types
,
987 llvm::FunctionCallee Fn
= CGM
.CreateRuntimeFunction(FT
, FunctionName
);
988 B
.CreateCall(Fn
, Args
);
991 ConstantAddress
GenerateConstantString(const StringLiteral
*SL
) override
{
993 auto Str
= SL
->getString();
994 CharUnits Align
= CGM
.getPointerAlign();
996 // Look for an existing one
997 llvm::StringMap
<llvm::Constant
*>::iterator old
= ObjCStrings
.find(Str
);
998 if (old
!= ObjCStrings
.end())
999 return ConstantAddress(old
->getValue(), IdElemTy
, Align
);
1001 bool isNonASCII
= SL
->containsNonAscii();
1003 auto LiteralLength
= SL
->getLength();
1005 if ((CGM
.getTarget().getPointerWidth(LangAS::Default
) == 64) &&
1006 (LiteralLength
< 9) && !isNonASCII
) {
1007 // Tiny strings are only used on 64-bit platforms. They store 8 7-bit
1008 // ASCII characters in the high 56 bits, followed by a 4-bit length and a
1009 // 3-bit tag (which is always 4).
1011 // Fill in the characters
1012 for (unsigned i
=0 ; i
<LiteralLength
; i
++)
1013 str
|= ((uint64_t)SL
->getCodeUnit(i
)) << ((64 - 4 - 3) - (i
*7));
1014 // Fill in the length
1015 str
|= LiteralLength
<< 3;
1018 auto *ObjCStr
= llvm::ConstantExpr::getIntToPtr(
1019 llvm::ConstantInt::get(Int64Ty
, str
), IdTy
);
1020 ObjCStrings
[Str
] = ObjCStr
;
1021 return ConstantAddress(ObjCStr
, IdElemTy
, Align
);
1024 StringRef StringClass
= CGM
.getLangOpts().ObjCConstantStringClass
;
1026 if (StringClass
.empty()) StringClass
= "NSConstantString";
1028 std::string Sym
= SymbolForClass(StringClass
);
1030 llvm::Constant
*isa
= TheModule
.getNamedGlobal(Sym
);
1033 isa
= new llvm::GlobalVariable(TheModule
, IdTy
, /* isConstant */false,
1034 llvm::GlobalValue::ExternalLinkage
, nullptr, Sym
);
1035 if (CGM
.getTriple().isOSBinFormatCOFF()) {
1036 cast
<llvm::GlobalValue
>(isa
)->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass
);
1044 // uint32_t length; // Number of codepoints
1045 // uint32_t size; // Number of bytes
1047 // const char *data;
1050 ConstantInitBuilder
Builder(CGM
);
1051 auto Fields
= Builder
.beginStruct();
1052 if (!CGM
.getTriple().isOSBinFormatCOFF()) {
1055 Fields
.addNullPointer(PtrTy
);
1057 // For now, all non-ASCII strings are represented as UTF-16. As such, the
1058 // number of bytes is simply double the number of UTF-16 codepoints. In
1059 // ASCII strings, the number of bytes is equal to the number of non-ASCII
1062 unsigned NumU8CodeUnits
= Str
.size();
1063 // A UTF-16 representation of a unicode string contains at most the same
1064 // number of code units as a UTF-8 representation. Allocate that much
1065 // space, plus one for the final null character.
1066 SmallVector
<llvm::UTF16
, 128> ToBuf(NumU8CodeUnits
+ 1);
1067 const llvm::UTF8
*FromPtr
= (const llvm::UTF8
*)Str
.data();
1068 llvm::UTF16
*ToPtr
= &ToBuf
[0];
1069 (void)llvm::ConvertUTF8toUTF16(&FromPtr
, FromPtr
+ NumU8CodeUnits
,
1070 &ToPtr
, ToPtr
+ NumU8CodeUnits
, llvm::strictConversion
);
1071 uint32_t StringLength
= ToPtr
- &ToBuf
[0];
1072 // Add null terminator
1074 // Flags: 2 indicates UTF-16 encoding
1075 Fields
.addInt(Int32Ty
, 2);
1076 // Number of UTF-16 codepoints
1077 Fields
.addInt(Int32Ty
, StringLength
);
1079 Fields
.addInt(Int32Ty
, StringLength
* 2);
1080 // Hash. Not currently initialised by the compiler.
1081 Fields
.addInt(Int32Ty
, 0);
1082 // pointer to the data string.
1083 auto Arr
= llvm::ArrayRef(&ToBuf
[0], ToPtr
+ 1);
1084 auto *C
= llvm::ConstantDataArray::get(VMContext
, Arr
);
1085 auto *Buffer
= new llvm::GlobalVariable(TheModule
, C
->getType(),
1086 /*isConstant=*/true, llvm::GlobalValue::PrivateLinkage
, C
, ".str");
1087 Buffer
->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global
);
1090 // Flags: 0 indicates ASCII encoding
1091 Fields
.addInt(Int32Ty
, 0);
1092 // Number of UTF-16 codepoints, each ASCII byte is a UTF-16 codepoint
1093 Fields
.addInt(Int32Ty
, Str
.size());
1095 Fields
.addInt(Int32Ty
, Str
.size());
1096 // Hash. Not currently initialised by the compiler.
1097 Fields
.addInt(Int32Ty
, 0);
1099 Fields
.add(MakeConstantString(Str
));
1101 std::string StringName
;
1102 bool isNamed
= !isNonASCII
;
1104 StringName
= ".objc_str_";
1105 for (int i
=0,e
=Str
.size() ; i
<e
; ++i
) {
1106 unsigned char c
= Str
[i
];
1117 llvm::GlobalVariable
*ObjCStrGV
=
1118 Fields
.finishAndCreateGlobal(
1119 isNamed
? StringRef(StringName
) : ".objc_string",
1120 Align
, false, isNamed
? llvm::GlobalValue::LinkOnceODRLinkage
1121 : llvm::GlobalValue::PrivateLinkage
);
1122 ObjCStrGV
->setSection(sectionName
<ConstantStringSection
>());
1124 ObjCStrGV
->setComdat(TheModule
.getOrInsertComdat(StringName
));
1125 ObjCStrGV
->setVisibility(llvm::GlobalValue::HiddenVisibility
);
1127 if (CGM
.getTriple().isOSBinFormatCOFF()) {
1128 std::pair
<llvm::GlobalVariable
*, int> v
{ObjCStrGV
, 0};
1129 EarlyInitList
.emplace_back(Sym
, v
);
1131 ObjCStrings
[Str
] = ObjCStrGV
;
1132 ConstantStrings
.push_back(ObjCStrGV
);
1133 return ConstantAddress(ObjCStrGV
, IdElemTy
, Align
);
1136 void PushProperty(ConstantArrayBuilder
&PropertiesArray
,
1137 const ObjCPropertyDecl
*property
,
1139 bool isSynthesized
=true, bool
1140 isDynamic
=true) override
{
1141 // struct objc_property
1143 // const char *name;
1144 // const char *attributes;
1145 // const char *type;
1149 auto Fields
= PropertiesArray
.beginStruct(PropertyMetadataTy
);
1150 ASTContext
&Context
= CGM
.getContext();
1151 Fields
.add(MakeConstantString(property
->getNameAsString()));
1152 std::string TypeStr
=
1153 CGM
.getContext().getObjCEncodingForPropertyDecl(property
, OCD
);
1154 Fields
.add(MakeConstantString(TypeStr
));
1155 std::string typeStr
;
1156 Context
.getObjCEncodingForType(property
->getType(), typeStr
);
1157 Fields
.add(MakeConstantString(typeStr
));
1158 auto addPropertyMethod
= [&](const ObjCMethodDecl
*accessor
) {
1160 std::string TypeStr
= Context
.getObjCEncodingForMethodDecl(accessor
);
1161 Fields
.add(GetConstantSelector(accessor
->getSelector(), TypeStr
));
1163 Fields
.add(NULLPtr
);
1166 addPropertyMethod(property
->getGetterMethodDecl());
1167 addPropertyMethod(property
->getSetterMethodDecl());
1168 Fields
.finishAndAddTo(PropertiesArray
);
1172 GenerateProtocolMethodList(ArrayRef
<const ObjCMethodDecl
*> Methods
) override
{
1173 // struct objc_protocol_method_description
1176 // const char *types;
1178 llvm::StructType
*ObjCMethodDescTy
=
1179 llvm::StructType::get(CGM
.getLLVMContext(),
1180 { PtrToInt8Ty
, PtrToInt8Ty
});
1181 ASTContext
&Context
= CGM
.getContext();
1182 ConstantInitBuilder
Builder(CGM
);
1183 // struct objc_protocol_method_description_list
1187 // struct objc_protocol_method_description methods[];
1189 auto MethodList
= Builder
.beginStruct();
1191 MethodList
.addInt(IntTy
, Methods
.size());
1192 // int size; // sizeof(struct objc_method_description)
1193 llvm::DataLayout
td(&TheModule
);
1194 MethodList
.addInt(IntTy
, td
.getTypeSizeInBits(ObjCMethodDescTy
) /
1195 CGM
.getContext().getCharWidth());
1196 // struct objc_method_description[]
1197 auto MethodArray
= MethodList
.beginArray(ObjCMethodDescTy
);
1198 for (auto *M
: Methods
) {
1199 auto Method
= MethodArray
.beginStruct(ObjCMethodDescTy
);
1200 Method
.add(CGObjCGNU::GetConstantSelector(M
));
1201 Method
.add(GetTypeString(Context
.getObjCEncodingForMethodDecl(M
, true)));
1202 Method
.finishAndAddTo(MethodArray
);
1204 MethodArray
.finishAndAddTo(MethodList
);
1205 return MethodList
.finishAndCreateGlobal(".objc_protocol_method_list",
1206 CGM
.getPointerAlign());
1208 llvm::Constant
*GenerateCategoryProtocolList(const ObjCCategoryDecl
*OCD
)
1210 const auto &ReferencedProtocols
= OCD
->getReferencedProtocols();
1211 auto RuntimeProtocols
= GetRuntimeProtocolList(ReferencedProtocols
.begin(),
1212 ReferencedProtocols
.end());
1213 SmallVector
<llvm::Constant
*, 16> Protocols
;
1214 for (const auto *PI
: RuntimeProtocols
)
1215 Protocols
.push_back(GenerateProtocolRef(PI
));
1216 return GenerateProtocolList(Protocols
);
1219 llvm::Value
*LookupIMPSuper(CodeGenFunction
&CGF
, Address ObjCSuper
,
1220 llvm::Value
*cmd
, MessageSendInfo
&MSI
) override
{
1221 // Don't access the slot unless we're trying to cache the result.
1222 CGBuilderTy
&Builder
= CGF
.Builder
;
1223 llvm::Value
*lookupArgs
[] = {
1224 CGObjCGNU::EnforceType(Builder
, ObjCSuper
.emitRawPointer(CGF
),
1227 return CGF
.EmitNounwindRuntimeCall(MsgLookupSuperFn
, lookupArgs
);
1230 llvm::GlobalVariable
*GetClassVar(StringRef Name
, bool isWeak
=false) {
1231 std::string SymbolName
= SymbolForClassRef(Name
, isWeak
);
1232 auto *ClassSymbol
= TheModule
.getNamedGlobal(SymbolName
);
1235 ClassSymbol
= new llvm::GlobalVariable(TheModule
,
1236 IdTy
, false, llvm::GlobalValue::ExternalLinkage
,
1237 nullptr, SymbolName
);
1238 // If this is a weak symbol, then we are creating a valid definition for
1239 // the symbol, pointing to a weak definition of the real class pointer. If
1240 // this is not a weak reference, then we are expecting another compilation
1241 // unit to provide the real indirection symbol.
1243 ClassSymbol
->setInitializer(new llvm::GlobalVariable(TheModule
,
1244 Int8Ty
, false, llvm::GlobalValue::ExternalWeakLinkage
,
1245 nullptr, SymbolForClass(Name
)));
1247 if (CGM
.getTriple().isOSBinFormatCOFF()) {
1248 IdentifierInfo
&II
= CGM
.getContext().Idents
.get(Name
);
1249 TranslationUnitDecl
*TUDecl
= CGM
.getContext().getTranslationUnitDecl();
1250 DeclContext
*DC
= TranslationUnitDecl::castToDeclContext(TUDecl
);
1252 const ObjCInterfaceDecl
*OID
= nullptr;
1253 for (const auto *Result
: DC
->lookup(&II
))
1254 if ((OID
= dyn_cast
<ObjCInterfaceDecl
>(Result
)))
1257 // The first Interface we find may be a @class,
1258 // which should only be treated as the source of
1259 // truth in the absence of a true declaration.
1260 assert(OID
&& "Failed to find ObjCInterfaceDecl");
1261 const ObjCInterfaceDecl
*OIDDef
= OID
->getDefinition();
1262 if (OIDDef
!= nullptr)
1265 auto Storage
= llvm::GlobalValue::DefaultStorageClass
;
1266 if (OID
->hasAttr
<DLLImportAttr
>())
1267 Storage
= llvm::GlobalValue::DLLImportStorageClass
;
1268 else if (OID
->hasAttr
<DLLExportAttr
>())
1269 Storage
= llvm::GlobalValue::DLLExportStorageClass
;
1271 cast
<llvm::GlobalValue
>(ClassSymbol
)->setDLLStorageClass(Storage
);
1274 assert(ClassSymbol
->getName() == SymbolName
);
1277 llvm::Value
*GetClassNamed(CodeGenFunction
&CGF
,
1278 const std::string
&Name
,
1279 bool isWeak
) override
{
1280 return CGF
.Builder
.CreateLoad(
1281 Address(GetClassVar(Name
, isWeak
), IdTy
, CGM
.getPointerAlign()));
1283 int32_t FlagsForOwnership(Qualifiers::ObjCLifetime Ownership
) {
1285 // ownership_invalid = 0,
1286 // ownership_strong = 1,
1287 // ownership_weak = 2,
1288 // ownership_unsafe = 3
1289 // } ivar_ownership;
1291 switch (Ownership
) {
1292 case Qualifiers::OCL_Strong
:
1295 case Qualifiers::OCL_Weak
:
1298 case Qualifiers::OCL_ExplicitNone
:
1301 case Qualifiers::OCL_None
:
1302 case Qualifiers::OCL_Autoreleasing
:
1303 assert(Ownership
!= Qualifiers::OCL_Autoreleasing
);
1308 llvm::Constant
*GenerateIvarList(ArrayRef
<llvm::Constant
*> IvarNames
,
1309 ArrayRef
<llvm::Constant
*> IvarTypes
,
1310 ArrayRef
<llvm::Constant
*> IvarOffsets
,
1311 ArrayRef
<llvm::Constant
*> IvarAlign
,
1312 ArrayRef
<Qualifiers::ObjCLifetime
> IvarOwnership
) override
{
1313 llvm_unreachable("Method should not be called!");
1316 llvm::Constant
*GenerateEmptyProtocol(StringRef ProtocolName
) override
{
1317 std::string Name
= SymbolForProtocol(ProtocolName
);
1318 auto *GV
= TheModule
.getGlobalVariable(Name
);
1320 // Emit a placeholder symbol.
1321 GV
= new llvm::GlobalVariable(TheModule
, ProtocolTy
, false,
1322 llvm::GlobalValue::ExternalLinkage
, nullptr, Name
);
1323 GV
->setAlignment(CGM
.getPointerAlign().getAsAlign());
1328 /// Existing protocol references.
1329 llvm::StringMap
<llvm::Constant
*> ExistingProtocolRefs
;
1331 llvm::Value
*GenerateProtocolRef(CodeGenFunction
&CGF
,
1332 const ObjCProtocolDecl
*PD
) override
{
1333 auto Name
= PD
->getNameAsString();
1334 auto *&Ref
= ExistingProtocolRefs
[Name
];
1336 auto *&Protocol
= ExistingProtocols
[Name
];
1338 Protocol
= GenerateProtocolRef(PD
);
1339 std::string RefName
= SymbolForProtocolRef(Name
);
1340 assert(!TheModule
.getGlobalVariable(RefName
));
1341 // Emit a reference symbol.
1342 auto GV
= new llvm::GlobalVariable(TheModule
, ProtocolPtrTy
, false,
1343 llvm::GlobalValue::LinkOnceODRLinkage
,
1345 GV
->setComdat(TheModule
.getOrInsertComdat(RefName
));
1346 GV
->setSection(sectionName
<ProtocolReferenceSection
>());
1347 GV
->setAlignment(CGM
.getPointerAlign().getAsAlign());
1350 EmittedProtocolRef
= true;
1351 return CGF
.Builder
.CreateAlignedLoad(ProtocolPtrTy
, Ref
,
1352 CGM
.getPointerAlign());
1355 llvm::Constant
*GenerateProtocolList(ArrayRef
<llvm::Constant
*> Protocols
) {
1356 llvm::ArrayType
*ProtocolArrayTy
= llvm::ArrayType::get(ProtocolPtrTy
,
1358 llvm::Constant
* ProtocolArray
= llvm::ConstantArray::get(ProtocolArrayTy
,
1360 ConstantInitBuilder
builder(CGM
);
1361 auto ProtocolBuilder
= builder
.beginStruct();
1362 ProtocolBuilder
.addNullPointer(PtrTy
);
1363 ProtocolBuilder
.addInt(SizeTy
, Protocols
.size());
1364 ProtocolBuilder
.add(ProtocolArray
);
1365 return ProtocolBuilder
.finishAndCreateGlobal(".objc_protocol_list",
1366 CGM
.getPointerAlign(), false, llvm::GlobalValue::InternalLinkage
);
1369 void GenerateProtocol(const ObjCProtocolDecl
*PD
) override
{
1370 // Do nothing - we only emit referenced protocols.
1372 llvm::Constant
*GenerateProtocolRef(const ObjCProtocolDecl
*PD
) override
{
1373 std::string ProtocolName
= PD
->getNameAsString();
1374 auto *&Protocol
= ExistingProtocols
[ProtocolName
];
1378 EmittedProtocol
= true;
1380 auto SymName
= SymbolForProtocol(ProtocolName
);
1381 auto *OldGV
= TheModule
.getGlobalVariable(SymName
);
1383 // Use the protocol definition, if there is one.
1384 if (const ObjCProtocolDecl
*Def
= PD
->getDefinition())
1387 // If there is no definition, then create an external linkage symbol and
1388 // hope that someone else fills it in for us (and fail to link if they
1391 Protocol
= new llvm::GlobalVariable(TheModule
, ProtocolTy
,
1392 /*isConstant*/false,
1393 llvm::GlobalValue::ExternalLinkage
, nullptr, SymName
);
1397 SmallVector
<llvm::Constant
*, 16> Protocols
;
1398 auto RuntimeProtocols
=
1399 GetRuntimeProtocolList(PD
->protocol_begin(), PD
->protocol_end());
1400 for (const auto *PI
: RuntimeProtocols
)
1401 Protocols
.push_back(GenerateProtocolRef(PI
));
1402 llvm::Constant
*ProtocolList
= GenerateProtocolList(Protocols
);
1404 // Collect information about methods
1405 llvm::Constant
*InstanceMethodList
, *OptionalInstanceMethodList
;
1406 llvm::Constant
*ClassMethodList
, *OptionalClassMethodList
;
1407 EmitProtocolMethodList(PD
->instance_methods(), InstanceMethodList
,
1408 OptionalInstanceMethodList
);
1409 EmitProtocolMethodList(PD
->class_methods(), ClassMethodList
,
1410 OptionalClassMethodList
);
1412 // The isa pointer must be set to a magic number so the runtime knows it's
1413 // the correct layout.
1414 ConstantInitBuilder
builder(CGM
);
1415 auto ProtocolBuilder
= builder
.beginStruct();
1416 ProtocolBuilder
.add(llvm::ConstantExpr::getIntToPtr(
1417 llvm::ConstantInt::get(Int32Ty
, ProtocolVersion
), IdTy
));
1418 ProtocolBuilder
.add(MakeConstantString(ProtocolName
));
1419 ProtocolBuilder
.add(ProtocolList
);
1420 ProtocolBuilder
.add(InstanceMethodList
);
1421 ProtocolBuilder
.add(ClassMethodList
);
1422 ProtocolBuilder
.add(OptionalInstanceMethodList
);
1423 ProtocolBuilder
.add(OptionalClassMethodList
);
1424 // Required instance properties
1425 ProtocolBuilder
.add(GeneratePropertyList(nullptr, PD
, false, false));
1426 // Optional instance properties
1427 ProtocolBuilder
.add(GeneratePropertyList(nullptr, PD
, false, true));
1428 // Required class properties
1429 ProtocolBuilder
.add(GeneratePropertyList(nullptr, PD
, true, false));
1430 // Optional class properties
1431 ProtocolBuilder
.add(GeneratePropertyList(nullptr, PD
, true, true));
1433 auto *GV
= ProtocolBuilder
.finishAndCreateGlobal(SymName
,
1434 CGM
.getPointerAlign(), false, llvm::GlobalValue::ExternalLinkage
);
1435 GV
->setSection(sectionName
<ProtocolSection
>());
1436 GV
->setComdat(TheModule
.getOrInsertComdat(SymName
));
1438 OldGV
->replaceAllUsesWith(GV
);
1439 OldGV
->removeFromParent();
1440 GV
->setName(SymName
);
1445 llvm::Value
*GetTypedSelector(CodeGenFunction
&CGF
, Selector Sel
,
1446 const std::string
&TypeEncoding
) override
{
1447 return GetConstantSelector(Sel
, TypeEncoding
);
1449 std::string
GetSymbolNameForTypeEncoding(const std::string
&TypeEncoding
) {
1450 std::string MangledTypes
= std::string(TypeEncoding
);
1451 // @ is used as a special character in ELF symbol names (used for symbol
1452 // versioning), so mangle the name to not include it. Replace it with a
1453 // character that is not a valid type encoding character (and, being
1454 // non-printable, never will be!)
1455 if (CGM
.getTriple().isOSBinFormatELF())
1456 std::replace(MangledTypes
.begin(), MangledTypes
.end(), '@', '\1');
1457 // = in dll exported names causes lld to fail when linking on Windows.
1458 if (CGM
.getTriple().isOSWindows())
1459 std::replace(MangledTypes
.begin(), MangledTypes
.end(), '=', '\2');
1460 return MangledTypes
;
1462 llvm::Constant
*GetTypeString(llvm::StringRef TypeEncoding
) {
1463 if (TypeEncoding
.empty())
1465 std::string MangledTypes
=
1466 GetSymbolNameForTypeEncoding(std::string(TypeEncoding
));
1467 std::string TypesVarName
= ".objc_sel_types_" + MangledTypes
;
1468 auto *TypesGlobal
= TheModule
.getGlobalVariable(TypesVarName
);
1470 llvm::Constant
*Init
= llvm::ConstantDataArray::getString(VMContext
,
1472 auto *GV
= new llvm::GlobalVariable(TheModule
, Init
->getType(),
1473 true, llvm::GlobalValue::LinkOnceODRLinkage
, Init
, TypesVarName
);
1474 GV
->setComdat(TheModule
.getOrInsertComdat(TypesVarName
));
1475 GV
->setVisibility(llvm::GlobalValue::HiddenVisibility
);
1480 llvm::Constant
*GetConstantSelector(Selector Sel
,
1481 const std::string
&TypeEncoding
) override
{
1482 std::string MangledTypes
= GetSymbolNameForTypeEncoding(TypeEncoding
);
1483 auto SelVarName
= (StringRef(".objc_selector_") + Sel
.getAsString() + "_" +
1484 MangledTypes
).str();
1485 if (auto *GV
= TheModule
.getNamedGlobal(SelVarName
))
1487 ConstantInitBuilder
builder(CGM
);
1488 auto SelBuilder
= builder
.beginStruct();
1489 SelBuilder
.add(ExportUniqueString(Sel
.getAsString(), ".objc_sel_name_",
1491 SelBuilder
.add(GetTypeString(TypeEncoding
));
1492 auto *GV
= SelBuilder
.finishAndCreateGlobal(SelVarName
,
1493 CGM
.getPointerAlign(), false, llvm::GlobalValue::LinkOnceODRLinkage
);
1494 GV
->setComdat(TheModule
.getOrInsertComdat(SelVarName
));
1495 GV
->setVisibility(llvm::GlobalValue::HiddenVisibility
);
1496 GV
->setSection(sectionName
<SelectorSection
>());
1499 llvm::StructType
*emptyStruct
= nullptr;
1501 /// Return pointers to the start and end of a section. On ELF platforms, we
1502 /// use the __start_ and __stop_ symbols that GNU-compatible linkers will set
1503 /// to the start and end of section names, as long as those section names are
1504 /// valid identifiers and the symbols are referenced but not defined. On
1505 /// Windows, we use the fact that MSVC-compatible linkers will lexically sort
1506 /// by subsections and place everything that we want to reference in a middle
1507 /// subsection and then insert zero-sized symbols in subsections a and z.
1508 std::pair
<llvm::Constant
*,llvm::Constant
*>
1509 GetSectionBounds(StringRef Section
) {
1510 if (CGM
.getTriple().isOSBinFormatCOFF()) {
1511 if (emptyStruct
== nullptr) {
1512 emptyStruct
= llvm::StructType::create(VMContext
, ".objc_section_sentinel");
1513 emptyStruct
->setBody({}, /*isPacked*/true);
1515 auto ZeroInit
= llvm::Constant::getNullValue(emptyStruct
);
1516 auto Sym
= [&](StringRef Prefix
, StringRef SecSuffix
) {
1517 auto *Sym
= new llvm::GlobalVariable(TheModule
, emptyStruct
,
1518 /*isConstant*/false,
1519 llvm::GlobalValue::LinkOnceODRLinkage
, ZeroInit
, Prefix
+
1521 Sym
->setVisibility(llvm::GlobalValue::HiddenVisibility
);
1522 Sym
->setSection((Section
+ SecSuffix
).str());
1523 Sym
->setComdat(TheModule
.getOrInsertComdat((Prefix
+
1525 Sym
->setAlignment(CGM
.getPointerAlign().getAsAlign());
1528 return { Sym("__start_", "$a"), Sym("__stop", "$z") };
1530 auto *Start
= new llvm::GlobalVariable(TheModule
, PtrTy
,
1531 /*isConstant*/false,
1532 llvm::GlobalValue::ExternalLinkage
, nullptr, StringRef("__start_") +
1534 Start
->setVisibility(llvm::GlobalValue::HiddenVisibility
);
1535 auto *Stop
= new llvm::GlobalVariable(TheModule
, PtrTy
,
1536 /*isConstant*/false,
1537 llvm::GlobalValue::ExternalLinkage
, nullptr, StringRef("__stop_") +
1539 Stop
->setVisibility(llvm::GlobalValue::HiddenVisibility
);
1540 return { Start
, Stop
};
1542 CatchTypeInfo
getCatchAllTypeInfo() override
{
1543 return CGM
.getCXXABI().getCatchAllTypeInfo();
1545 llvm::Function
*ModuleInitFunction() override
{
1546 llvm::Function
*LoadFunction
= llvm::Function::Create(
1547 llvm::FunctionType::get(llvm::Type::getVoidTy(VMContext
), false),
1548 llvm::GlobalValue::LinkOnceODRLinkage
, ".objcv2_load_function",
1550 LoadFunction
->setVisibility(llvm::GlobalValue::HiddenVisibility
);
1551 LoadFunction
->setComdat(TheModule
.getOrInsertComdat(".objcv2_load_function"));
1553 llvm::BasicBlock
*EntryBB
=
1554 llvm::BasicBlock::Create(VMContext
, "entry", LoadFunction
);
1555 CGBuilderTy
B(CGM
, VMContext
);
1556 B
.SetInsertPoint(EntryBB
);
1557 ConstantInitBuilder
builder(CGM
);
1558 auto InitStructBuilder
= builder
.beginStruct();
1559 InitStructBuilder
.addInt(Int64Ty
, 0);
1560 auto §ionVec
= CGM
.getTriple().isOSBinFormatCOFF() ? PECOFFSectionsBaseNames
: SectionsBaseNames
;
1561 for (auto *s
: sectionVec
) {
1562 auto bounds
= GetSectionBounds(s
);
1563 InitStructBuilder
.add(bounds
.first
);
1564 InitStructBuilder
.add(bounds
.second
);
1566 auto *InitStruct
= InitStructBuilder
.finishAndCreateGlobal(".objc_init",
1567 CGM
.getPointerAlign(), false, llvm::GlobalValue::LinkOnceODRLinkage
);
1568 InitStruct
->setVisibility(llvm::GlobalValue::HiddenVisibility
);
1569 InitStruct
->setComdat(TheModule
.getOrInsertComdat(".objc_init"));
1571 CallRuntimeFunction(B
, "__objc_load", {InitStruct
});;
1573 // Make sure that the optimisers don't delete this function.
1574 CGM
.addCompilerUsedGlobal(LoadFunction
);
1575 // FIXME: Currently ELF only!
1576 // We have to do this by hand, rather than with @llvm.ctors, so that the
1577 // linker can remove the duplicate invocations.
1578 auto *InitVar
= new llvm::GlobalVariable(TheModule
, LoadFunction
->getType(),
1579 /*isConstant*/false, llvm::GlobalValue::LinkOnceAnyLinkage
,
1580 LoadFunction
, ".objc_ctor");
1581 // Check that this hasn't been renamed. This shouldn't happen, because
1582 // this function should be called precisely once.
1583 assert(InitVar
->getName() == ".objc_ctor");
1584 // In Windows, initialisers are sorted by the suffix. XCL is for library
1585 // initialisers, which run before user initialisers. We are running
1586 // Objective-C loads at the end of library load. This means +load methods
1587 // will run before any other static constructors, but that static
1588 // constructors can see a fully initialised Objective-C state.
1589 if (CGM
.getTriple().isOSBinFormatCOFF())
1590 InitVar
->setSection(".CRT$XCLz");
1593 if (CGM
.getCodeGenOpts().UseInitArray
)
1594 InitVar
->setSection(".init_array");
1596 InitVar
->setSection(".ctors");
1598 InitVar
->setVisibility(llvm::GlobalValue::HiddenVisibility
);
1599 InitVar
->setComdat(TheModule
.getOrInsertComdat(".objc_ctor"));
1600 CGM
.addUsedGlobal(InitVar
);
1601 for (auto *C
: Categories
) {
1602 auto *Cat
= cast
<llvm::GlobalVariable
>(C
->stripPointerCasts());
1603 Cat
->setSection(sectionName
<CategorySection
>());
1604 CGM
.addUsedGlobal(Cat
);
1606 auto createNullGlobal
= [&](StringRef Name
, ArrayRef
<llvm::Constant
*> Init
,
1607 StringRef Section
) {
1608 auto nullBuilder
= builder
.beginStruct();
1609 for (auto *F
: Init
)
1611 auto GV
= nullBuilder
.finishAndCreateGlobal(Name
, CGM
.getPointerAlign(),
1612 false, llvm::GlobalValue::LinkOnceODRLinkage
);
1613 GV
->setSection(Section
);
1614 GV
->setComdat(TheModule
.getOrInsertComdat(Name
));
1615 GV
->setVisibility(llvm::GlobalValue::HiddenVisibility
);
1616 CGM
.addUsedGlobal(GV
);
1619 for (auto clsAlias
: ClassAliases
)
1620 createNullGlobal(std::string(".objc_class_alias") +
1621 clsAlias
.second
, { MakeConstantString(clsAlias
.second
),
1622 GetClassVar(clsAlias
.first
) }, sectionName
<ClassAliasSection
>());
1623 // On ELF platforms, add a null value for each special section so that we
1624 // can always guarantee that the _start and _stop symbols will exist and be
1625 // meaningful. This is not required on COFF platforms, where our start and
1626 // stop symbols will create the section.
1627 if (!CGM
.getTriple().isOSBinFormatCOFF()) {
1628 createNullGlobal(".objc_null_selector", {NULLPtr
, NULLPtr
},
1629 sectionName
<SelectorSection
>());
1630 if (Categories
.empty())
1631 createNullGlobal(".objc_null_category", {NULLPtr
, NULLPtr
,
1632 NULLPtr
, NULLPtr
, NULLPtr
, NULLPtr
, NULLPtr
},
1633 sectionName
<CategorySection
>());
1634 if (!EmittedClass
) {
1635 createNullGlobal(".objc_null_cls_init_ref", NULLPtr
,
1636 sectionName
<ClassSection
>());
1637 createNullGlobal(".objc_null_class_ref", { NULLPtr
, NULLPtr
},
1638 sectionName
<ClassReferenceSection
>());
1640 if (!EmittedProtocol
)
1641 createNullGlobal(".objc_null_protocol", {NULLPtr
, NULLPtr
, NULLPtr
,
1642 NULLPtr
, NULLPtr
, NULLPtr
, NULLPtr
, NULLPtr
, NULLPtr
, NULLPtr
,
1643 NULLPtr
}, sectionName
<ProtocolSection
>());
1644 if (!EmittedProtocolRef
)
1645 createNullGlobal(".objc_null_protocol_ref", {NULLPtr
},
1646 sectionName
<ProtocolReferenceSection
>());
1647 if (ClassAliases
.empty())
1648 createNullGlobal(".objc_null_class_alias", { NULLPtr
, NULLPtr
},
1649 sectionName
<ClassAliasSection
>());
1650 if (ConstantStrings
.empty()) {
1651 auto i32Zero
= llvm::ConstantInt::get(Int32Ty
, 0);
1652 createNullGlobal(".objc_null_constant_string", { NULLPtr
, i32Zero
,
1653 i32Zero
, i32Zero
, i32Zero
, NULLPtr
},
1654 sectionName
<ConstantStringSection
>());
1657 ConstantStrings
.clear();
1661 if (EarlyInitList
.size() > 0) {
1662 auto *Init
= llvm::Function::Create(llvm::FunctionType::get(CGM
.VoidTy
,
1663 {}), llvm::GlobalValue::InternalLinkage
, ".objc_early_init",
1665 llvm::IRBuilder
<> b(llvm::BasicBlock::Create(CGM
.getLLVMContext(), "entry",
1667 for (const auto &lateInit
: EarlyInitList
) {
1668 auto *global
= TheModule
.getGlobalVariable(lateInit
.first
);
1670 llvm::GlobalVariable
*GV
= lateInit
.second
.first
;
1671 b
.CreateAlignedStore(
1673 b
.CreateStructGEP(GV
->getValueType(), GV
, lateInit
.second
.second
),
1674 CGM
.getPointerAlign().getAsAlign());
1678 // We can't use the normal LLVM global initialisation array, because we
1679 // need to specify that this runs early in library initialisation.
1680 auto *InitVar
= new llvm::GlobalVariable(CGM
.getModule(), Init
->getType(),
1681 /*isConstant*/true, llvm::GlobalValue::InternalLinkage
,
1682 Init
, ".objc_early_init_ptr");
1683 InitVar
->setSection(".CRT$XCLb");
1684 CGM
.addUsedGlobal(InitVar
);
1688 /// In the v2 ABI, ivar offset variables use the type encoding in their name
1689 /// to trigger linker failures if the types don't match.
1690 std::string
GetIVarOffsetVariableName(const ObjCInterfaceDecl
*ID
,
1691 const ObjCIvarDecl
*Ivar
) override
{
1692 std::string TypeEncoding
;
1693 CGM
.getContext().getObjCEncodingForType(Ivar
->getType(), TypeEncoding
);
1694 TypeEncoding
= GetSymbolNameForTypeEncoding(TypeEncoding
);
1695 const std::string Name
= "__objc_ivar_offset_" + ID
->getNameAsString()
1696 + '.' + Ivar
->getNameAsString() + '.' + TypeEncoding
;
1699 llvm::Value
*EmitIvarOffset(CodeGenFunction
&CGF
,
1700 const ObjCInterfaceDecl
*Interface
,
1701 const ObjCIvarDecl
*Ivar
) override
{
1702 const std::string Name
= GetIVarOffsetVariableName(Ivar
->getContainingInterface(), Ivar
);
1703 llvm::GlobalVariable
*IvarOffsetPointer
= TheModule
.getNamedGlobal(Name
);
1704 if (!IvarOffsetPointer
)
1705 IvarOffsetPointer
= new llvm::GlobalVariable(TheModule
, IntTy
, false,
1706 llvm::GlobalValue::ExternalLinkage
, nullptr, Name
);
1707 CharUnits Align
= CGM
.getIntAlign();
1708 llvm::Value
*Offset
=
1709 CGF
.Builder
.CreateAlignedLoad(IntTy
, IvarOffsetPointer
, Align
);
1710 if (Offset
->getType() != PtrDiffTy
)
1711 Offset
= CGF
.Builder
.CreateZExtOrBitCast(Offset
, PtrDiffTy
);
1714 void GenerateClass(const ObjCImplementationDecl
*OID
) override
{
1715 ASTContext
&Context
= CGM
.getContext();
1716 bool IsCOFF
= CGM
.getTriple().isOSBinFormatCOFF();
1718 // Get the class name
1719 ObjCInterfaceDecl
*classDecl
=
1720 const_cast<ObjCInterfaceDecl
*>(OID
->getClassInterface());
1721 std::string className
= classDecl
->getNameAsString();
1722 auto *classNameConstant
= MakeConstantString(className
);
1724 ConstantInitBuilder
builder(CGM
);
1725 auto metaclassFields
= builder
.beginStruct();
1726 // struct objc_class *isa;
1727 metaclassFields
.addNullPointer(PtrTy
);
1728 // struct objc_class *super_class;
1729 metaclassFields
.addNullPointer(PtrTy
);
1730 // const char *name;
1731 metaclassFields
.add(classNameConstant
);
1733 metaclassFields
.addInt(LongTy
, 0);
1734 // unsigned long info;
1735 // objc_class_flag_meta
1736 metaclassFields
.addInt(LongTy
, ClassFlags::ClassFlagMeta
);
1737 // long instance_size;
1738 // Setting this to zero is consistent with the older ABI, but it might be
1739 // more sensible to set this to sizeof(struct objc_class)
1740 metaclassFields
.addInt(LongTy
, 0);
1741 // struct objc_ivar_list *ivars;
1742 metaclassFields
.addNullPointer(PtrTy
);
1743 // struct objc_method_list *methods
1744 // FIXME: Almost identical code is copied and pasted below for the
1745 // class, but refactoring it cleanly requires C++14 generic lambdas.
1746 if (OID
->classmeth_begin() == OID
->classmeth_end())
1747 metaclassFields
.addNullPointer(PtrTy
);
1749 SmallVector
<ObjCMethodDecl
*, 16> ClassMethods
;
1750 ClassMethods
.insert(ClassMethods
.begin(), OID
->classmeth_begin(),
1751 OID
->classmeth_end());
1752 metaclassFields
.add(
1753 GenerateMethodList(className
, "", ClassMethods
, true));
1756 metaclassFields
.addNullPointer(PtrTy
);
1757 // IMP cxx_construct;
1758 metaclassFields
.addNullPointer(PtrTy
);
1759 // IMP cxx_destruct;
1760 metaclassFields
.addNullPointer(PtrTy
);
1761 // struct objc_class *subclass_list
1762 metaclassFields
.addNullPointer(PtrTy
);
1763 // struct objc_class *sibling_class
1764 metaclassFields
.addNullPointer(PtrTy
);
1765 // struct objc_protocol_list *protocols;
1766 metaclassFields
.addNullPointer(PtrTy
);
1767 // struct reference_list *extra_data;
1768 metaclassFields
.addNullPointer(PtrTy
);
1769 // long abi_version;
1770 metaclassFields
.addInt(LongTy
, 0);
1771 // struct objc_property_list *properties
1772 metaclassFields
.add(GeneratePropertyList(OID
, classDecl
, /*isClassProperty*/true));
1774 auto *metaclass
= metaclassFields
.finishAndCreateGlobal(
1775 ManglePublicSymbol("OBJC_METACLASS_") + className
,
1776 CGM
.getPointerAlign());
1778 auto classFields
= builder
.beginStruct();
1779 // struct objc_class *isa;
1780 classFields
.add(metaclass
);
1781 // struct objc_class *super_class;
1782 // Get the superclass name.
1783 const ObjCInterfaceDecl
* SuperClassDecl
=
1784 OID
->getClassInterface()->getSuperClass();
1785 llvm::Constant
*SuperClass
= nullptr;
1786 if (SuperClassDecl
) {
1787 auto SuperClassName
= SymbolForClass(SuperClassDecl
->getNameAsString());
1788 SuperClass
= TheModule
.getNamedGlobal(SuperClassName
);
1791 SuperClass
= new llvm::GlobalVariable(TheModule
, PtrTy
, false,
1792 llvm::GlobalValue::ExternalLinkage
, nullptr, SuperClassName
);
1794 auto Storage
= llvm::GlobalValue::DefaultStorageClass
;
1795 if (SuperClassDecl
->hasAttr
<DLLImportAttr
>())
1796 Storage
= llvm::GlobalValue::DLLImportStorageClass
;
1797 else if (SuperClassDecl
->hasAttr
<DLLExportAttr
>())
1798 Storage
= llvm::GlobalValue::DLLExportStorageClass
;
1800 cast
<llvm::GlobalValue
>(SuperClass
)->setDLLStorageClass(Storage
);
1804 classFields
.add(SuperClass
);
1806 classFields
.addNullPointer(PtrTy
);
1808 classFields
.addNullPointer(PtrTy
);
1809 // const char *name;
1810 classFields
.add(classNameConstant
);
1812 classFields
.addInt(LongTy
, 0);
1813 // unsigned long info;
1814 // !objc_class_flag_meta
1815 classFields
.addInt(LongTy
, 0);
1816 // long instance_size;
1817 int superInstanceSize
= !SuperClassDecl
? 0 :
1818 Context
.getASTObjCInterfaceLayout(SuperClassDecl
).getSize().getQuantity();
1819 // Instance size is negative for classes that have not yet had their ivar
1820 // layout calculated.
1821 classFields
.addInt(LongTy
,
1822 0 - (Context
.getASTObjCImplementationLayout(OID
).getSize().getQuantity() -
1823 superInstanceSize
));
1825 if (classDecl
->all_declared_ivar_begin() == nullptr)
1826 classFields
.addNullPointer(PtrTy
);
1829 for (const ObjCIvarDecl
*IVD
= classDecl
->all_declared_ivar_begin(); IVD
;
1830 IVD
= IVD
->getNextIvar()) ivar_count
++;
1831 llvm::DataLayout
td(&TheModule
);
1832 // struct objc_ivar_list *ivars;
1833 ConstantInitBuilder
b(CGM
);
1834 auto ivarListBuilder
= b
.beginStruct();
1836 ivarListBuilder
.addInt(IntTy
, ivar_count
);
1838 llvm::StructType
*ObjCIvarTy
= llvm::StructType::get(
1844 ivarListBuilder
.addInt(SizeTy
, td
.getTypeSizeInBits(ObjCIvarTy
) /
1845 CGM
.getContext().getCharWidth());
1846 // struct objc_ivar ivars[]
1847 auto ivarArrayBuilder
= ivarListBuilder
.beginArray();
1848 for (const ObjCIvarDecl
*IVD
= classDecl
->all_declared_ivar_begin(); IVD
;
1849 IVD
= IVD
->getNextIvar()) {
1850 auto ivarTy
= IVD
->getType();
1851 auto ivarBuilder
= ivarArrayBuilder
.beginStruct();
1852 // const char *name;
1853 ivarBuilder
.add(MakeConstantString(IVD
->getNameAsString()));
1854 // const char *type;
1855 std::string TypeStr
;
1856 //Context.getObjCEncodingForType(ivarTy, TypeStr, IVD, true);
1857 Context
.getObjCEncodingForMethodParameter(Decl::OBJC_TQ_None
, ivarTy
, TypeStr
, true);
1858 ivarBuilder
.add(MakeConstantString(TypeStr
));
1860 uint64_t BaseOffset
= ComputeIvarBaseOffset(CGM
, OID
, IVD
);
1861 uint64_t Offset
= BaseOffset
- superInstanceSize
;
1862 llvm::Constant
*OffsetValue
= llvm::ConstantInt::get(IntTy
, Offset
);
1863 std::string OffsetName
= GetIVarOffsetVariableName(classDecl
, IVD
);
1864 llvm::GlobalVariable
*OffsetVar
= TheModule
.getGlobalVariable(OffsetName
);
1866 OffsetVar
->setInitializer(OffsetValue
);
1868 OffsetVar
= new llvm::GlobalVariable(TheModule
, IntTy
,
1869 false, llvm::GlobalValue::ExternalLinkage
,
1870 OffsetValue
, OffsetName
);
1871 auto ivarVisibility
=
1872 (IVD
->getAccessControl() == ObjCIvarDecl::Private
||
1873 IVD
->getAccessControl() == ObjCIvarDecl::Package
||
1874 classDecl
->getVisibility() == HiddenVisibility
) ?
1875 llvm::GlobalValue::HiddenVisibility
:
1876 llvm::GlobalValue::DefaultVisibility
;
1877 OffsetVar
->setVisibility(ivarVisibility
);
1878 if (ivarVisibility
!= llvm::GlobalValue::HiddenVisibility
)
1879 CGM
.setGVProperties(OffsetVar
, OID
->getClassInterface());
1880 ivarBuilder
.add(OffsetVar
);
1882 ivarBuilder
.addInt(Int32Ty
,
1883 CGM
.getContext().getTypeSizeInChars(ivarTy
).getQuantity());
1884 // Alignment will be stored as a base-2 log of the alignment.
1886 llvm::Log2_32(Context
.getTypeAlignInChars(ivarTy
).getQuantity());
1887 // Objects that require more than 2^64-byte alignment should be impossible!
1890 // Bits 0-1 are ownership.
1891 // Bit 2 indicates an extended type encoding
1892 // Bits 3-8 contain log2(aligment)
1893 ivarBuilder
.addInt(Int32Ty
,
1894 (align
<< 3) | (1<<2) |
1895 FlagsForOwnership(ivarTy
.getQualifiers().getObjCLifetime()));
1896 ivarBuilder
.finishAndAddTo(ivarArrayBuilder
);
1898 ivarArrayBuilder
.finishAndAddTo(ivarListBuilder
);
1899 auto ivarList
= ivarListBuilder
.finishAndCreateGlobal(".objc_ivar_list",
1900 CGM
.getPointerAlign(), /*constant*/ false,
1901 llvm::GlobalValue::PrivateLinkage
);
1902 classFields
.add(ivarList
);
1904 // struct objc_method_list *methods
1905 SmallVector
<const ObjCMethodDecl
*, 16> InstanceMethods
;
1906 InstanceMethods
.insert(InstanceMethods
.begin(), OID
->instmeth_begin(),
1907 OID
->instmeth_end());
1908 for (auto *propImpl
: OID
->property_impls())
1909 if (propImpl
->getPropertyImplementation() ==
1910 ObjCPropertyImplDecl::Synthesize
) {
1911 auto addIfExists
= [&](const ObjCMethodDecl
*OMD
) {
1912 if (OMD
&& OMD
->hasBody())
1913 InstanceMethods
.push_back(OMD
);
1915 addIfExists(propImpl
->getGetterMethodDecl());
1916 addIfExists(propImpl
->getSetterMethodDecl());
1919 if (InstanceMethods
.size() == 0)
1920 classFields
.addNullPointer(PtrTy
);
1923 GenerateMethodList(className
, "", InstanceMethods
, false));
1926 classFields
.addNullPointer(PtrTy
);
1927 // IMP cxx_construct;
1928 classFields
.addNullPointer(PtrTy
);
1929 // IMP cxx_destruct;
1930 classFields
.addNullPointer(PtrTy
);
1931 // struct objc_class *subclass_list
1932 classFields
.addNullPointer(PtrTy
);
1933 // struct objc_class *sibling_class
1934 classFields
.addNullPointer(PtrTy
);
1935 // struct objc_protocol_list *protocols;
1936 auto RuntimeProtocols
= GetRuntimeProtocolList(classDecl
->protocol_begin(),
1937 classDecl
->protocol_end());
1938 SmallVector
<llvm::Constant
*, 16> Protocols
;
1939 for (const auto *I
: RuntimeProtocols
)
1940 Protocols
.push_back(GenerateProtocolRef(I
));
1942 if (Protocols
.empty())
1943 classFields
.addNullPointer(PtrTy
);
1945 classFields
.add(GenerateProtocolList(Protocols
));
1946 // struct reference_list *extra_data;
1947 classFields
.addNullPointer(PtrTy
);
1948 // long abi_version;
1949 classFields
.addInt(LongTy
, 0);
1950 // struct objc_property_list *properties
1951 classFields
.add(GeneratePropertyList(OID
, classDecl
));
1953 llvm::GlobalVariable
*classStruct
=
1954 classFields
.finishAndCreateGlobal(SymbolForClass(className
),
1955 CGM
.getPointerAlign(), false, llvm::GlobalValue::ExternalLinkage
);
1957 auto *classRefSymbol
= GetClassVar(className
);
1958 classRefSymbol
->setSection(sectionName
<ClassReferenceSection
>());
1959 classRefSymbol
->setInitializer(classStruct
);
1962 // we can't import a class struct.
1963 if (OID
->getClassInterface()->hasAttr
<DLLExportAttr
>()) {
1964 classStruct
->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass
);
1965 cast
<llvm::GlobalValue
>(classRefSymbol
)->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass
);
1969 std::pair
<llvm::GlobalVariable
*, int> v
{classStruct
, 1};
1970 EarlyInitList
.emplace_back(std::string(SuperClass
->getName()),
1977 // Resolve the class aliases, if they exist.
1978 // FIXME: Class pointer aliases shouldn't exist!
1979 if (ClassPtrAlias
) {
1980 ClassPtrAlias
->replaceAllUsesWith(classStruct
);
1981 ClassPtrAlias
->eraseFromParent();
1982 ClassPtrAlias
= nullptr;
1984 if (auto Placeholder
=
1985 TheModule
.getNamedGlobal(SymbolForClass(className
)))
1986 if (Placeholder
!= classStruct
) {
1987 Placeholder
->replaceAllUsesWith(classStruct
);
1988 Placeholder
->eraseFromParent();
1989 classStruct
->setName(SymbolForClass(className
));
1991 if (MetaClassPtrAlias
) {
1992 MetaClassPtrAlias
->replaceAllUsesWith(metaclass
);
1993 MetaClassPtrAlias
->eraseFromParent();
1994 MetaClassPtrAlias
= nullptr;
1996 assert(classStruct
->getName() == SymbolForClass(className
));
1998 auto classInitRef
= new llvm::GlobalVariable(TheModule
,
1999 classStruct
->getType(), false, llvm::GlobalValue::ExternalLinkage
,
2000 classStruct
, ManglePublicSymbol("OBJC_INIT_CLASS_") + className
);
2001 classInitRef
->setSection(sectionName
<ClassSection
>());
2002 CGM
.addUsedGlobal(classInitRef
);
2004 EmittedClass
= true;
2007 CGObjCGNUstep2(CodeGenModule
&Mod
) : CGObjCGNUstep(Mod
, 10, 4, 2) {
2008 MsgLookupSuperFn
.init(&CGM
, "objc_msg_lookup_super", IMPTy
,
2009 PtrToObjCSuperTy
, SelectorTy
);
2010 SentInitializeFn
.init(&CGM
, "objc_send_initialize",
2011 llvm::Type::getVoidTy(VMContext
), IdTy
);
2012 // struct objc_property
2014 // const char *name;
2015 // const char *attributes;
2016 // const char *type;
2020 PropertyMetadataTy
=
2021 llvm::StructType::get(CGM
.getLLVMContext(),
2022 { PtrToInt8Ty
, PtrToInt8Ty
, PtrToInt8Ty
, PtrToInt8Ty
, PtrToInt8Ty
});
2025 void GenerateDirectMethodPrologue(CodeGenFunction
&CGF
, llvm::Function
*Fn
,
2026 const ObjCMethodDecl
*OMD
,
2027 const ObjCContainerDecl
*CD
) override
{
2028 auto &Builder
= CGF
.Builder
;
2029 bool ReceiverCanBeNull
= true;
2030 auto selfAddr
= CGF
.GetAddrOfLocalVar(OMD
->getSelfDecl());
2031 auto selfValue
= Builder
.CreateLoad(selfAddr
);
2035 // /* unless the receiver is never NULL */
2036 // if (self == nil) {
2037 // return (ReturnType){ };
2040 // /* for class methods only to force class lazy initialization */
2041 // if (!__objc_{class}_initialized)
2043 // objc_send_initialize(class);
2044 // __objc_{class}_initialized = 1;
2047 // _cmd = @selector(...)
2050 if (OMD
->isClassMethod()) {
2051 const ObjCInterfaceDecl
*OID
= cast
<ObjCInterfaceDecl
>(CD
);
2053 // Nullable `Class` expressions cannot be messaged with a direct method
2054 // so the only reason why the receive can be null would be because
2056 ReceiverCanBeNull
= isWeakLinkedClass(OID
);
2059 llvm::MDBuilder
MDHelper(CGM
.getLLVMContext());
2060 if (ReceiverCanBeNull
) {
2061 llvm::BasicBlock
*SelfIsNilBlock
=
2062 CGF
.createBasicBlock("objc_direct_method.self_is_nil");
2063 llvm::BasicBlock
*ContBlock
=
2064 CGF
.createBasicBlock("objc_direct_method.cont");
2066 // if (self == nil) {
2067 auto selfTy
= cast
<llvm::PointerType
>(selfValue
->getType());
2068 auto Zero
= llvm::ConstantPointerNull::get(selfTy
);
2070 Builder
.CreateCondBr(Builder
.CreateICmpEQ(selfValue
, Zero
),
2071 SelfIsNilBlock
, ContBlock
,
2072 MDHelper
.createUnlikelyBranchWeights());
2074 CGF
.EmitBlock(SelfIsNilBlock
);
2076 // return (ReturnType){ };
2077 auto retTy
= OMD
->getReturnType();
2078 Builder
.SetInsertPoint(SelfIsNilBlock
);
2079 if (!retTy
->isVoidType()) {
2080 CGF
.EmitNullInitialization(CGF
.ReturnValue
, retTy
);
2082 CGF
.EmitBranchThroughCleanup(CGF
.ReturnBlock
);
2086 CGF
.EmitBlock(ContBlock
);
2087 Builder
.SetInsertPoint(ContBlock
);
2090 if (OMD
->isClassMethod()) {
2091 // Prefix of the class type.
2093 llvm::StructType::get(PtrTy
, PtrTy
, PtrTy
, LongTy
, LongTy
);
2094 auto &astContext
= CGM
.getContext();
2095 auto flags
= Builder
.CreateLoad(
2096 Address
{Builder
.CreateStructGEP(classStart
, selfValue
, 4), LongTy
,
2097 CharUnits::fromQuantity(
2098 astContext
.getTypeAlign(astContext
.UnsignedLongTy
))});
2099 auto isInitialized
=
2100 Builder
.CreateAnd(flags
, ClassFlags::ClassFlagInitialized
);
2101 llvm::BasicBlock
*notInitializedBlock
=
2102 CGF
.createBasicBlock("objc_direct_method.class_uninitialized");
2103 llvm::BasicBlock
*initializedBlock
=
2104 CGF
.createBasicBlock("objc_direct_method.class_initialized");
2105 Builder
.CreateCondBr(Builder
.CreateICmpEQ(isInitialized
, Zeros
[0]),
2106 notInitializedBlock
, initializedBlock
,
2107 MDHelper
.createUnlikelyBranchWeights());
2108 CGF
.EmitBlock(notInitializedBlock
);
2109 Builder
.SetInsertPoint(notInitializedBlock
);
2110 CGF
.EmitRuntimeCall(SentInitializeFn
, selfValue
);
2111 Builder
.CreateBr(initializedBlock
);
2112 CGF
.EmitBlock(initializedBlock
);
2113 Builder
.SetInsertPoint(initializedBlock
);
2116 // only synthesize _cmd if it's referenced
2117 if (OMD
->getCmdDecl()->isUsed()) {
2118 // `_cmd` is not a parameter to direct methods, so storage must be
2119 // explicitly declared for it.
2120 CGF
.EmitVarDecl(*OMD
->getCmdDecl());
2121 Builder
.CreateStore(GetSelector(CGF
, OMD
),
2122 CGF
.GetAddrOfLocalVar(OMD
->getCmdDecl()));
2127 const char *const CGObjCGNUstep2::SectionsBaseNames
[8] =
2131 "__objc_class_refs",
2134 "__objc_protocol_refs",
2135 "__objc_class_aliases",
2136 "__objc_constant_string"
2139 const char *const CGObjCGNUstep2::PECOFFSectionsBaseNames
[8] =
2151 /// Support for the ObjFW runtime.
2152 class CGObjCObjFW
: public CGObjCGNU
{
2154 /// The GCC ABI message lookup function. Returns an IMP pointing to the
2155 /// method implementation for this message.
2156 LazyRuntimeFunction MsgLookupFn
;
2157 /// stret lookup function. While this does not seem to make sense at the
2158 /// first look, this is required to call the correct forwarding function.
2159 LazyRuntimeFunction MsgLookupFnSRet
;
2160 /// The GCC ABI superclass message lookup function. Takes a pointer to a
2161 /// structure describing the receiver and the class, and a selector as
2162 /// arguments. Returns the IMP for the corresponding method.
2163 LazyRuntimeFunction MsgLookupSuperFn
, MsgLookupSuperFnSRet
;
2165 llvm::Value
*LookupIMP(CodeGenFunction
&CGF
, llvm::Value
*&Receiver
,
2166 llvm::Value
*cmd
, llvm::MDNode
*node
,
2167 MessageSendInfo
&MSI
) override
{
2168 CGBuilderTy
&Builder
= CGF
.Builder
;
2169 llvm::Value
*args
[] = {
2170 EnforceType(Builder
, Receiver
, IdTy
),
2171 EnforceType(Builder
, cmd
, SelectorTy
) };
2173 llvm::CallBase
*imp
;
2174 if (CGM
.ReturnTypeUsesSRet(MSI
.CallInfo
))
2175 imp
= CGF
.EmitRuntimeCallOrInvoke(MsgLookupFnSRet
, args
);
2177 imp
= CGF
.EmitRuntimeCallOrInvoke(MsgLookupFn
, args
);
2179 imp
->setMetadata(msgSendMDKind
, node
);
2183 llvm::Value
*LookupIMPSuper(CodeGenFunction
&CGF
, Address ObjCSuper
,
2184 llvm::Value
*cmd
, MessageSendInfo
&MSI
) override
{
2185 CGBuilderTy
&Builder
= CGF
.Builder
;
2186 llvm::Value
*lookupArgs
[] = {
2187 EnforceType(Builder
, ObjCSuper
.emitRawPointer(CGF
), PtrToObjCSuperTy
),
2191 if (CGM
.ReturnTypeUsesSRet(MSI
.CallInfo
))
2192 return CGF
.EmitNounwindRuntimeCall(MsgLookupSuperFnSRet
, lookupArgs
);
2194 return CGF
.EmitNounwindRuntimeCall(MsgLookupSuperFn
, lookupArgs
);
2197 llvm::Value
*GetClassNamed(CodeGenFunction
&CGF
, const std::string
&Name
,
2198 bool isWeak
) override
{
2200 return CGObjCGNU::GetClassNamed(CGF
, Name
, isWeak
);
2203 std::string SymbolName
= "_OBJC_CLASS_" + Name
;
2204 llvm::GlobalVariable
*ClassSymbol
= TheModule
.getGlobalVariable(SymbolName
);
2206 ClassSymbol
= new llvm::GlobalVariable(TheModule
, LongTy
, false,
2207 llvm::GlobalValue::ExternalLinkage
,
2208 nullptr, SymbolName
);
2213 CGObjCObjFW(CodeGenModule
&Mod
): CGObjCGNU(Mod
, 9, 3) {
2214 // IMP objc_msg_lookup(id, SEL);
2215 MsgLookupFn
.init(&CGM
, "objc_msg_lookup", IMPTy
, IdTy
, SelectorTy
);
2216 MsgLookupFnSRet
.init(&CGM
, "objc_msg_lookup_stret", IMPTy
, IdTy
,
2218 // IMP objc_msg_lookup_super(struct objc_super*, SEL);
2219 MsgLookupSuperFn
.init(&CGM
, "objc_msg_lookup_super", IMPTy
,
2220 PtrToObjCSuperTy
, SelectorTy
);
2221 MsgLookupSuperFnSRet
.init(&CGM
, "objc_msg_lookup_super_stret", IMPTy
,
2222 PtrToObjCSuperTy
, SelectorTy
);
2225 } // end anonymous namespace
2227 /// Emits a reference to a dummy variable which is emitted with each class.
2228 /// This ensures that a linker error will be generated when trying to link
2229 /// together modules where a referenced class is not defined.
2230 void CGObjCGNU::EmitClassRef(const std::string
&className
) {
2231 std::string symbolRef
= "__objc_class_ref_" + className
;
2232 // Don't emit two copies of the same symbol
2233 if (TheModule
.getGlobalVariable(symbolRef
))
2235 std::string symbolName
= "__objc_class_name_" + className
;
2236 llvm::GlobalVariable
*ClassSymbol
= TheModule
.getGlobalVariable(symbolName
);
2238 ClassSymbol
= new llvm::GlobalVariable(TheModule
, LongTy
, false,
2239 llvm::GlobalValue::ExternalLinkage
,
2240 nullptr, symbolName
);
2242 new llvm::GlobalVariable(TheModule
, ClassSymbol
->getType(), true,
2243 llvm::GlobalValue::WeakAnyLinkage
, ClassSymbol
, symbolRef
);
2246 CGObjCGNU::CGObjCGNU(CodeGenModule
&cgm
, unsigned runtimeABIVersion
,
2247 unsigned protocolClassVersion
, unsigned classABI
)
2248 : CGObjCRuntime(cgm
), TheModule(CGM
.getModule()),
2249 VMContext(cgm
.getLLVMContext()), ClassPtrAlias(nullptr),
2250 MetaClassPtrAlias(nullptr), RuntimeVersion(runtimeABIVersion
),
2251 ProtocolVersion(protocolClassVersion
), ClassABIVersion(classABI
) {
2253 msgSendMDKind
= VMContext
.getMDKindID("GNUObjCMessageSend");
2255 cgm
.getContext().getTargetInfo().getTriple().isWindowsMSVCEnvironment();
2257 cgm
.getContext().getTargetInfo().getTriple().isOSCygMing() &&
2258 isRuntime(ObjCRuntime::GNUstep
, 2);
2260 CodeGenTypes
&Types
= CGM
.getTypes();
2261 IntTy
= cast
<llvm::IntegerType
>(
2262 Types
.ConvertType(CGM
.getContext().IntTy
));
2263 LongTy
= cast
<llvm::IntegerType
>(
2264 Types
.ConvertType(CGM
.getContext().LongTy
));
2265 SizeTy
= cast
<llvm::IntegerType
>(
2266 Types
.ConvertType(CGM
.getContext().getSizeType()));
2267 PtrDiffTy
= cast
<llvm::IntegerType
>(
2268 Types
.ConvertType(CGM
.getContext().getPointerDiffType()));
2269 BoolTy
= CGM
.getTypes().ConvertType(CGM
.getContext().BoolTy
);
2271 Int8Ty
= llvm::Type::getInt8Ty(VMContext
);
2272 // C string type. Used in lots of places.
2273 PtrToInt8Ty
= llvm::PointerType::getUnqual(Int8Ty
);
2274 ProtocolPtrTy
= llvm::PointerType::getUnqual(
2275 Types
.ConvertType(CGM
.getContext().getObjCProtoType()));
2277 Zeros
[0] = llvm::ConstantInt::get(LongTy
, 0);
2278 Zeros
[1] = Zeros
[0];
2279 NULLPtr
= llvm::ConstantPointerNull::get(PtrToInt8Ty
);
2280 // Get the selector Type.
2281 QualType selTy
= CGM
.getContext().getObjCSelType();
2282 if (QualType() == selTy
) {
2283 SelectorTy
= PtrToInt8Ty
;
2284 SelectorElemTy
= Int8Ty
;
2286 SelectorTy
= cast
<llvm::PointerType
>(CGM
.getTypes().ConvertType(selTy
));
2287 SelectorElemTy
= CGM
.getTypes().ConvertTypeForMem(selTy
->getPointeeType());
2290 PtrToIntTy
= llvm::PointerType::getUnqual(IntTy
);
2291 PtrTy
= PtrToInt8Ty
;
2293 Int32Ty
= llvm::Type::getInt32Ty(VMContext
);
2294 Int64Ty
= llvm::Type::getInt64Ty(VMContext
);
2297 CGM
.getDataLayout().getPointerSizeInBits() == 32 ? Int32Ty
: Int64Ty
;
2300 QualType UnqualIdTy
= CGM
.getContext().getObjCIdType();
2301 ASTIdTy
= CanQualType();
2302 if (UnqualIdTy
!= QualType()) {
2303 ASTIdTy
= CGM
.getContext().getCanonicalType(UnqualIdTy
);
2304 IdTy
= cast
<llvm::PointerType
>(CGM
.getTypes().ConvertType(ASTIdTy
));
2305 IdElemTy
= CGM
.getTypes().ConvertTypeForMem(
2306 ASTIdTy
.getTypePtr()->getPointeeType());
2311 PtrToIdTy
= llvm::PointerType::getUnqual(IdTy
);
2312 ProtocolTy
= llvm::StructType::get(IdTy
,
2313 PtrToInt8Ty
, // name
2314 PtrToInt8Ty
, // protocols
2315 PtrToInt8Ty
, // instance methods
2316 PtrToInt8Ty
, // class methods
2317 PtrToInt8Ty
, // optional instance methods
2318 PtrToInt8Ty
, // optional class methods
2319 PtrToInt8Ty
, // properties
2320 PtrToInt8Ty
);// optional properties
2322 // struct objc_property_gsv1
2324 // const char *name;
2326 // char attributes2;
2329 // const char *getter_name;
2330 // const char *getter_types;
2331 // const char *setter_name;
2332 // const char *setter_types;
2334 PropertyMetadataTy
= llvm::StructType::get(CGM
.getLLVMContext(), {
2335 PtrToInt8Ty
, Int8Ty
, Int8Ty
, Int8Ty
, Int8Ty
, PtrToInt8Ty
, PtrToInt8Ty
,
2336 PtrToInt8Ty
, PtrToInt8Ty
});
2338 ObjCSuperTy
= llvm::StructType::get(IdTy
, IdTy
);
2339 PtrToObjCSuperTy
= llvm::PointerType::getUnqual(ObjCSuperTy
);
2341 llvm::Type
*VoidTy
= llvm::Type::getVoidTy(VMContext
);
2343 // void objc_exception_throw(id);
2344 ExceptionThrowFn
.init(&CGM
, "objc_exception_throw", VoidTy
, IdTy
);
2345 ExceptionReThrowFn
.init(&CGM
,
2346 usesCxxExceptions
? "objc_exception_rethrow"
2347 : "objc_exception_throw",
2349 // int objc_sync_enter(id);
2350 SyncEnterFn
.init(&CGM
, "objc_sync_enter", IntTy
, IdTy
);
2351 // int objc_sync_exit(id);
2352 SyncExitFn
.init(&CGM
, "objc_sync_exit", IntTy
, IdTy
);
2354 // void objc_enumerationMutation (id)
2355 EnumerationMutationFn
.init(&CGM
, "objc_enumerationMutation", VoidTy
, IdTy
);
2357 // id objc_getProperty(id, SEL, ptrdiff_t, BOOL)
2358 GetPropertyFn
.init(&CGM
, "objc_getProperty", IdTy
, IdTy
, SelectorTy
,
2360 // void objc_setProperty(id, SEL, ptrdiff_t, id, BOOL, BOOL)
2361 SetPropertyFn
.init(&CGM
, "objc_setProperty", VoidTy
, IdTy
, SelectorTy
,
2362 PtrDiffTy
, IdTy
, BoolTy
, BoolTy
);
2363 // void objc_setPropertyStruct(void*, void*, ptrdiff_t, BOOL, BOOL)
2364 GetStructPropertyFn
.init(&CGM
, "objc_getPropertyStruct", VoidTy
, PtrTy
, PtrTy
,
2365 PtrDiffTy
, BoolTy
, BoolTy
);
2366 // void objc_setPropertyStruct(void*, void*, ptrdiff_t, BOOL, BOOL)
2367 SetStructPropertyFn
.init(&CGM
, "objc_setPropertyStruct", VoidTy
, PtrTy
, PtrTy
,
2368 PtrDiffTy
, BoolTy
, BoolTy
);
2371 llvm::Type
*IMPArgs
[] = { IdTy
, SelectorTy
};
2372 IMPTy
= llvm::PointerType::getUnqual(llvm::FunctionType::get(IdTy
, IMPArgs
,
2375 const LangOptions
&Opts
= CGM
.getLangOpts();
2376 if ((Opts
.getGC() != LangOptions::NonGC
) || Opts
.ObjCAutoRefCount
)
2377 RuntimeVersion
= 10;
2379 // Don't bother initialising the GC stuff unless we're compiling in GC mode
2380 if (Opts
.getGC() != LangOptions::NonGC
) {
2381 // This is a bit of an hack. We should sort this out by having a proper
2382 // CGObjCGNUstep subclass for GC, but we may want to really support the old
2383 // ABI and GC added in ObjectiveC2.framework, so we fudge it a bit for now
2384 // Get selectors needed in GC mode
2385 RetainSel
= GetNullarySelector("retain", CGM
.getContext());
2386 ReleaseSel
= GetNullarySelector("release", CGM
.getContext());
2387 AutoreleaseSel
= GetNullarySelector("autorelease", CGM
.getContext());
2389 // Get functions needed in GC mode
2391 // id objc_assign_ivar(id, id, ptrdiff_t);
2392 IvarAssignFn
.init(&CGM
, "objc_assign_ivar", IdTy
, IdTy
, IdTy
, PtrDiffTy
);
2393 // id objc_assign_strongCast (id, id*)
2394 StrongCastAssignFn
.init(&CGM
, "objc_assign_strongCast", IdTy
, IdTy
,
2396 // id objc_assign_global(id, id*);
2397 GlobalAssignFn
.init(&CGM
, "objc_assign_global", IdTy
, IdTy
, PtrToIdTy
);
2398 // id objc_assign_weak(id, id*);
2399 WeakAssignFn
.init(&CGM
, "objc_assign_weak", IdTy
, IdTy
, PtrToIdTy
);
2400 // id objc_read_weak(id*);
2401 WeakReadFn
.init(&CGM
, "objc_read_weak", IdTy
, PtrToIdTy
);
2402 // void *objc_memmove_collectable(void*, void *, size_t);
2403 MemMoveFn
.init(&CGM
, "objc_memmove_collectable", PtrTy
, PtrTy
, PtrTy
,
2408 llvm::Value
*CGObjCGNU::GetClassNamed(CodeGenFunction
&CGF
,
2409 const std::string
&Name
, bool isWeak
) {
2410 llvm::Constant
*ClassName
= MakeConstantString(Name
);
2411 // With the incompatible ABI, this will need to be replaced with a direct
2412 // reference to the class symbol. For the compatible nonfragile ABI we are
2413 // still performing this lookup at run time but emitting the symbol for the
2414 // class externally so that we can make the switch later.
2416 // Libobjc2 contains an LLVM pass that replaces calls to objc_lookup_class
2417 // with memoized versions or with static references if it's safe to do so.
2421 llvm::FunctionCallee ClassLookupFn
= CGM
.CreateRuntimeFunction(
2422 llvm::FunctionType::get(IdTy
, PtrToInt8Ty
, true), "objc_lookup_class");
2423 return CGF
.EmitNounwindRuntimeCall(ClassLookupFn
, ClassName
);
2426 // This has to perform the lookup every time, since posing and related
2427 // techniques can modify the name -> class mapping.
2428 llvm::Value
*CGObjCGNU::GetClass(CodeGenFunction
&CGF
,
2429 const ObjCInterfaceDecl
*OID
) {
2431 GetClassNamed(CGF
, OID
->getNameAsString(), OID
->isWeakImported());
2432 if (auto *ClassSymbol
= dyn_cast
<llvm::GlobalVariable
>(Value
))
2433 CGM
.setGVProperties(ClassSymbol
, OID
);
2437 llvm::Value
*CGObjCGNU::EmitNSAutoreleasePoolClassRef(CodeGenFunction
&CGF
) {
2438 auto *Value
= GetClassNamed(CGF
, "NSAutoreleasePool", false);
2439 if (CGM
.getTriple().isOSBinFormatCOFF()) {
2440 if (auto *ClassSymbol
= dyn_cast
<llvm::GlobalVariable
>(Value
)) {
2441 IdentifierInfo
&II
= CGF
.CGM
.getContext().Idents
.get("NSAutoreleasePool");
2442 TranslationUnitDecl
*TUDecl
= CGM
.getContext().getTranslationUnitDecl();
2443 DeclContext
*DC
= TranslationUnitDecl::castToDeclContext(TUDecl
);
2445 const VarDecl
*VD
= nullptr;
2446 for (const auto *Result
: DC
->lookup(&II
))
2447 if ((VD
= dyn_cast
<VarDecl
>(Result
)))
2450 CGM
.setGVProperties(ClassSymbol
, VD
);
2456 llvm::Value
*CGObjCGNU::GetTypedSelector(CodeGenFunction
&CGF
, Selector Sel
,
2457 const std::string
&TypeEncoding
) {
2458 SmallVectorImpl
<TypedSelector
> &Types
= SelectorTable
[Sel
];
2459 llvm::GlobalAlias
*SelValue
= nullptr;
2461 for (SmallVectorImpl
<TypedSelector
>::iterator i
= Types
.begin(),
2462 e
= Types
.end() ; i
!=e
; i
++) {
2463 if (i
->first
== TypeEncoding
) {
2464 SelValue
= i
->second
;
2469 SelValue
= llvm::GlobalAlias::create(SelectorElemTy
, 0,
2470 llvm::GlobalValue::PrivateLinkage
,
2471 ".objc_selector_" + Sel
.getAsString(),
2473 Types
.emplace_back(TypeEncoding
, SelValue
);
2479 Address
CGObjCGNU::GetAddrOfSelector(CodeGenFunction
&CGF
, Selector Sel
) {
2480 llvm::Value
*SelValue
= GetSelector(CGF
, Sel
);
2482 // Store it to a temporary. Does this satisfy the semantics of
2483 // GetAddrOfSelector? Hopefully.
2484 Address tmp
= CGF
.CreateTempAlloca(SelValue
->getType(),
2485 CGF
.getPointerAlign());
2486 CGF
.Builder
.CreateStore(SelValue
, tmp
);
2490 llvm::Value
*CGObjCGNU::GetSelector(CodeGenFunction
&CGF
, Selector Sel
) {
2491 return GetTypedSelector(CGF
, Sel
, std::string());
2494 llvm::Value
*CGObjCGNU::GetSelector(CodeGenFunction
&CGF
,
2495 const ObjCMethodDecl
*Method
) {
2496 std::string SelTypes
= CGM
.getContext().getObjCEncodingForMethodDecl(Method
);
2497 return GetTypedSelector(CGF
, Method
->getSelector(), SelTypes
);
2500 llvm::Constant
*CGObjCGNU::GetEHType(QualType T
) {
2501 if (T
->isObjCIdType() || T
->isObjCQualifiedIdType()) {
2502 // With the old ABI, there was only one kind of catchall, which broke
2503 // foreign exceptions. With the new ABI, we use __objc_id_typeinfo as
2504 // a pointer indicating object catchalls, and NULL to indicate real
2506 if (CGM
.getLangOpts().ObjCRuntime
.isNonFragile()) {
2507 return MakeConstantString("@id");
2513 // All other types should be Objective-C interface pointer types.
2514 const ObjCObjectPointerType
*OPT
= T
->getAs
<ObjCObjectPointerType
>();
2515 assert(OPT
&& "Invalid @catch type.");
2516 const ObjCInterfaceDecl
*IDecl
= OPT
->getObjectType()->getInterface();
2517 assert(IDecl
&& "Invalid @catch type.");
2518 return MakeConstantString(IDecl
->getIdentifier()->getName());
2521 llvm::Constant
*CGObjCGNUstep::GetEHType(QualType T
) {
2522 if (usesSEHExceptions
)
2523 return CGM
.getCXXABI().getAddrOfRTTIDescriptor(T
);
2525 if (!CGM
.getLangOpts().CPlusPlus
&& !usesCxxExceptions
)
2526 return CGObjCGNU::GetEHType(T
);
2528 // For Objective-C++, we want to provide the ability to catch both C++ and
2529 // Objective-C objects in the same function.
2531 // There's a particular fixed type info for 'id'.
2532 if (T
->isObjCIdType() ||
2533 T
->isObjCQualifiedIdType()) {
2534 llvm::Constant
*IDEHType
=
2535 CGM
.getModule().getGlobalVariable("__objc_id_type_info");
2538 new llvm::GlobalVariable(CGM
.getModule(), PtrToInt8Ty
,
2540 llvm::GlobalValue::ExternalLinkage
,
2541 nullptr, "__objc_id_type_info");
2545 const ObjCObjectPointerType
*PT
=
2546 T
->getAs
<ObjCObjectPointerType
>();
2547 assert(PT
&& "Invalid @catch type.");
2548 const ObjCInterfaceType
*IT
= PT
->getInterfaceType();
2549 assert(IT
&& "Invalid @catch type.");
2550 std::string className
=
2551 std::string(IT
->getDecl()->getIdentifier()->getName());
2553 std::string typeinfoName
= "__objc_eh_typeinfo_" + className
;
2555 // Return the existing typeinfo if it exists
2556 if (llvm::Constant
*typeinfo
= TheModule
.getGlobalVariable(typeinfoName
))
2559 // Otherwise create it.
2561 // vtable for gnustep::libobjc::__objc_class_type_info
2562 // It's quite ugly hard-coding this. Ideally we'd generate it using the host
2563 // platform's name mangling.
2564 const char *vtableName
= "_ZTVN7gnustep7libobjc22__objc_class_type_infoE";
2565 auto *Vtable
= TheModule
.getGlobalVariable(vtableName
);
2567 Vtable
= new llvm::GlobalVariable(TheModule
, PtrToInt8Ty
, true,
2568 llvm::GlobalValue::ExternalLinkage
,
2569 nullptr, vtableName
);
2571 llvm::Constant
*Two
= llvm::ConstantInt::get(IntTy
, 2);
2573 llvm::ConstantExpr::getGetElementPtr(Vtable
->getValueType(), Vtable
, Two
);
2575 llvm::Constant
*typeName
=
2576 ExportUniqueString(className
, "__objc_eh_typename_");
2578 ConstantInitBuilder
builder(CGM
);
2579 auto fields
= builder
.beginStruct();
2580 fields
.add(BVtable
);
2581 fields
.add(typeName
);
2582 llvm::Constant
*TI
=
2583 fields
.finishAndCreateGlobal("__objc_eh_typeinfo_" + className
,
2584 CGM
.getPointerAlign(),
2586 llvm::GlobalValue::LinkOnceODRLinkage
);
2590 /// Generate an NSConstantString object.
2591 ConstantAddress
CGObjCGNU::GenerateConstantString(const StringLiteral
*SL
) {
2593 std::string Str
= SL
->getString().str();
2594 CharUnits Align
= CGM
.getPointerAlign();
2596 // Look for an existing one
2597 llvm::StringMap
<llvm::Constant
*>::iterator old
= ObjCStrings
.find(Str
);
2598 if (old
!= ObjCStrings
.end())
2599 return ConstantAddress(old
->getValue(), Int8Ty
, Align
);
2601 StringRef StringClass
= CGM
.getLangOpts().ObjCConstantStringClass
;
2603 if (StringClass
.empty()) StringClass
= "NSConstantString";
2605 std::string Sym
= "_OBJC_CLASS_";
2608 llvm::Constant
*isa
= TheModule
.getNamedGlobal(Sym
);
2611 isa
= new llvm::GlobalVariable(TheModule
, IdTy
, /* isConstant */ false,
2612 llvm::GlobalValue::ExternalWeakLinkage
,
2615 ConstantInitBuilder
Builder(CGM
);
2616 auto Fields
= Builder
.beginStruct();
2618 Fields
.add(MakeConstantString(Str
));
2619 Fields
.addInt(IntTy
, Str
.size());
2620 llvm::Constant
*ObjCStr
= Fields
.finishAndCreateGlobal(".objc_str", Align
);
2621 ObjCStrings
[Str
] = ObjCStr
;
2622 ConstantStrings
.push_back(ObjCStr
);
2623 return ConstantAddress(ObjCStr
, Int8Ty
, Align
);
2626 ///Generates a message send where the super is the receiver. This is a message
2627 ///send to self with special delivery semantics indicating which class's method
2628 ///should be called.
2630 CGObjCGNU::GenerateMessageSendSuper(CodeGenFunction
&CGF
,
2631 ReturnValueSlot Return
,
2632 QualType ResultType
,
2634 const ObjCInterfaceDecl
*Class
,
2635 bool isCategoryImpl
,
2636 llvm::Value
*Receiver
,
2637 bool IsClassMessage
,
2638 const CallArgList
&CallArgs
,
2639 const ObjCMethodDecl
*Method
) {
2640 CGBuilderTy
&Builder
= CGF
.Builder
;
2641 if (CGM
.getLangOpts().getGC() == LangOptions::GCOnly
) {
2642 if (Sel
== RetainSel
|| Sel
== AutoreleaseSel
) {
2643 return RValue::get(EnforceType(Builder
, Receiver
,
2644 CGM
.getTypes().ConvertType(ResultType
)));
2646 if (Sel
== ReleaseSel
) {
2647 return RValue::get(nullptr);
2651 llvm::Value
*cmd
= GetSelector(CGF
, Sel
);
2652 CallArgList ActualArgs
;
2654 ActualArgs
.add(RValue::get(EnforceType(Builder
, Receiver
, IdTy
)), ASTIdTy
);
2655 ActualArgs
.add(RValue::get(cmd
), CGF
.getContext().getObjCSelType());
2656 ActualArgs
.addFrom(CallArgs
);
2658 MessageSendInfo MSI
= getMessageSendInfo(Method
, ResultType
, ActualArgs
);
2660 llvm::Value
*ReceiverClass
= nullptr;
2661 bool isV2ABI
= isRuntime(ObjCRuntime::GNUstep
, 2);
2663 ReceiverClass
= GetClassNamed(CGF
,
2664 Class
->getSuperClass()->getNameAsString(), /*isWeak*/false);
2665 if (IsClassMessage
) {
2666 // Load the isa pointer of the superclass is this is a class method.
2667 ReceiverClass
= Builder
.CreateBitCast(ReceiverClass
,
2668 llvm::PointerType::getUnqual(IdTy
));
2670 Builder
.CreateAlignedLoad(IdTy
, ReceiverClass
, CGF
.getPointerAlign());
2672 ReceiverClass
= EnforceType(Builder
, ReceiverClass
, IdTy
);
2674 if (isCategoryImpl
) {
2675 llvm::FunctionCallee classLookupFunction
= nullptr;
2676 if (IsClassMessage
) {
2677 classLookupFunction
= CGM
.CreateRuntimeFunction(llvm::FunctionType::get(
2678 IdTy
, PtrTy
, true), "objc_get_meta_class");
2680 classLookupFunction
= CGM
.CreateRuntimeFunction(llvm::FunctionType::get(
2681 IdTy
, PtrTy
, true), "objc_get_class");
2683 ReceiverClass
= Builder
.CreateCall(classLookupFunction
,
2684 MakeConstantString(Class
->getNameAsString()));
2686 // Set up global aliases for the metaclass or class pointer if they do not
2687 // already exist. These will are forward-references which will be set to
2688 // pointers to the class and metaclass structure created for the runtime
2689 // load function. To send a message to super, we look up the value of the
2690 // super_class pointer from either the class or metaclass structure.
2691 if (IsClassMessage
) {
2692 if (!MetaClassPtrAlias
) {
2693 MetaClassPtrAlias
= llvm::GlobalAlias::create(
2694 IdElemTy
, 0, llvm::GlobalValue::InternalLinkage
,
2695 ".objc_metaclass_ref" + Class
->getNameAsString(), &TheModule
);
2697 ReceiverClass
= MetaClassPtrAlias
;
2699 if (!ClassPtrAlias
) {
2700 ClassPtrAlias
= llvm::GlobalAlias::create(
2701 IdElemTy
, 0, llvm::GlobalValue::InternalLinkage
,
2702 ".objc_class_ref" + Class
->getNameAsString(), &TheModule
);
2704 ReceiverClass
= ClassPtrAlias
;
2707 // Cast the pointer to a simplified version of the class structure
2708 llvm::Type
*CastTy
= llvm::StructType::get(IdTy
, IdTy
);
2709 ReceiverClass
= Builder
.CreateBitCast(ReceiverClass
,
2710 llvm::PointerType::getUnqual(CastTy
));
2711 // Get the superclass pointer
2712 ReceiverClass
= Builder
.CreateStructGEP(CastTy
, ReceiverClass
, 1);
2713 // Load the superclass pointer
2715 Builder
.CreateAlignedLoad(IdTy
, ReceiverClass
, CGF
.getPointerAlign());
2717 // Construct the structure used to look up the IMP
2718 llvm::StructType
*ObjCSuperTy
=
2719 llvm::StructType::get(Receiver
->getType(), IdTy
);
2721 Address ObjCSuper
= CGF
.CreateTempAlloca(ObjCSuperTy
,
2722 CGF
.getPointerAlign());
2724 Builder
.CreateStore(Receiver
, Builder
.CreateStructGEP(ObjCSuper
, 0));
2725 Builder
.CreateStore(ReceiverClass
, Builder
.CreateStructGEP(ObjCSuper
, 1));
2728 llvm::Value
*imp
= LookupIMPSuper(CGF
, ObjCSuper
, cmd
, MSI
);
2729 imp
= EnforceType(Builder
, imp
, MSI
.MessengerType
);
2731 llvm::Metadata
*impMD
[] = {
2732 llvm::MDString::get(VMContext
, Sel
.getAsString()),
2733 llvm::MDString::get(VMContext
, Class
->getSuperClass()->getNameAsString()),
2734 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
2735 llvm::Type::getInt1Ty(VMContext
), IsClassMessage
))};
2736 llvm::MDNode
*node
= llvm::MDNode::get(VMContext
, impMD
);
2738 CGCallee
callee(CGCalleeInfo(), imp
);
2740 llvm::CallBase
*call
;
2741 RValue msgRet
= CGF
.EmitCall(MSI
.CallInfo
, callee
, Return
, ActualArgs
, &call
);
2742 call
->setMetadata(msgSendMDKind
, node
);
2746 /// Generate code for a message send expression.
2748 CGObjCGNU::GenerateMessageSend(CodeGenFunction
&CGF
,
2749 ReturnValueSlot Return
,
2750 QualType ResultType
,
2752 llvm::Value
*Receiver
,
2753 const CallArgList
&CallArgs
,
2754 const ObjCInterfaceDecl
*Class
,
2755 const ObjCMethodDecl
*Method
) {
2756 CGBuilderTy
&Builder
= CGF
.Builder
;
2758 // Strip out message sends to retain / release in GC mode
2759 if (CGM
.getLangOpts().getGC() == LangOptions::GCOnly
) {
2760 if (Sel
== RetainSel
|| Sel
== AutoreleaseSel
) {
2761 return RValue::get(EnforceType(Builder
, Receiver
,
2762 CGM
.getTypes().ConvertType(ResultType
)));
2764 if (Sel
== ReleaseSel
) {
2765 return RValue::get(nullptr);
2769 bool isDirect
= Method
&& Method
->isDirectMethod();
2771 IdTy
= cast
<llvm::PointerType
>(CGM
.getTypes().ConvertType(ASTIdTy
));
2775 cmd
= GetSelector(CGF
, Method
);
2777 cmd
= GetSelector(CGF
, Sel
);
2778 cmd
= EnforceType(Builder
, cmd
, SelectorTy
);
2781 Receiver
= EnforceType(Builder
, Receiver
, IdTy
);
2783 llvm::Metadata
*impMD
[] = {
2784 llvm::MDString::get(VMContext
, Sel
.getAsString()),
2785 llvm::MDString::get(VMContext
, Class
? Class
->getNameAsString() : ""),
2786 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
2787 llvm::Type::getInt1Ty(VMContext
), Class
!= nullptr))};
2788 llvm::MDNode
*node
= llvm::MDNode::get(VMContext
, impMD
);
2790 CallArgList ActualArgs
;
2791 ActualArgs
.add(RValue::get(Receiver
), ASTIdTy
);
2793 ActualArgs
.add(RValue::get(cmd
), CGF
.getContext().getObjCSelType());
2794 ActualArgs
.addFrom(CallArgs
);
2796 MessageSendInfo MSI
= getMessageSendInfo(Method
, ResultType
, ActualArgs
);
2798 // Message sends are expected to return a zero value when the
2799 // receiver is nil. At one point, this was only guaranteed for
2800 // simple integer and pointer types, but expectations have grown
2803 // Given a nil receiver, the GNU runtime's message lookup will
2804 // return a stub function that simply sets various return-value
2805 // registers to zero and then returns. That's good enough for us
2806 // if and only if (1) the calling conventions of that stub are
2807 // compatible with the signature we're using and (2) the registers
2808 // it sets are sufficient to produce a zero value of the return type.
2809 // Rather than doing a whole target-specific analysis, we assume it
2810 // only works for void, integer, and pointer types, and in all
2811 // other cases we do an explicit nil check is emitted code. In
2812 // addition to ensuring we produce a zero value for other types, this
2813 // sidesteps the few outright CC incompatibilities we know about that
2814 // could otherwise lead to crashes, like when a method is expected to
2815 // return on the x87 floating point stack or adjust the stack pointer
2816 // because of an indirect return.
2817 bool hasParamDestroyedInCallee
= false;
2818 bool requiresExplicitZeroResult
= false;
2819 bool requiresNilReceiverCheck
= [&] {
2820 // We never need a check if we statically know the receiver isn't nil.
2821 if (!canMessageReceiverBeNull(CGF
, Method
, /*IsSuper*/ false,
2825 // If there's a consumed argument, we need a nil check.
2826 if (Method
&& Method
->hasParamDestroyedInCallee()) {
2827 hasParamDestroyedInCallee
= true;
2830 // If the return value isn't flagged as unused, and the result
2831 // type isn't in our narrow set where we assume compatibility,
2832 // we need a nil check to ensure a nil value.
2833 if (!Return
.isUnused()) {
2834 if (ResultType
->isVoidType()) {
2835 // void results are definitely okay.
2836 } else if (ResultType
->hasPointerRepresentation() &&
2837 CGM
.getTypes().isZeroInitializable(ResultType
)) {
2838 // Pointer types should be fine as long as they have
2839 // bitwise-zero null pointers. But do we need to worry
2840 // about unusual address spaces?
2841 } else if (ResultType
->isIntegralOrEnumerationType()) {
2842 // Bitwise zero should always be zero for integral types.
2843 // FIXME: we probably need a size limit here, but we've
2844 // never imposed one before
2846 // Otherwise, use an explicit check just to be sure, unless we're
2847 // calling a direct method, where the implementation does this for us.
2848 requiresExplicitZeroResult
= !isDirect
;
2852 return hasParamDestroyedInCallee
|| requiresExplicitZeroResult
;
2855 // We will need to explicitly zero-initialize an aggregate result slot
2856 // if we generally require explicit zeroing and we have an aggregate
2858 bool requiresExplicitAggZeroing
=
2859 requiresExplicitZeroResult
&& CGF
.hasAggregateEvaluationKind(ResultType
);
2861 // The block we're going to end up in after any message send or nil path.
2862 llvm::BasicBlock
*continueBB
= nullptr;
2863 // The block that eventually branched to continueBB along the nil path.
2864 llvm::BasicBlock
*nilPathBB
= nullptr;
2865 // The block to do explicit work in along the nil path, if necessary.
2866 llvm::BasicBlock
*nilCleanupBB
= nullptr;
2868 // Emit the nil-receiver check.
2869 if (requiresNilReceiverCheck
) {
2870 llvm::BasicBlock
*messageBB
= CGF
.createBasicBlock("msgSend");
2871 continueBB
= CGF
.createBasicBlock("continue");
2873 // If we need to zero-initialize an aggregate result or destroy
2874 // consumed arguments, we'll need a separate cleanup block.
2875 // Otherwise we can just branch directly to the continuation block.
2876 if (requiresExplicitAggZeroing
|| hasParamDestroyedInCallee
) {
2877 nilCleanupBB
= CGF
.createBasicBlock("nilReceiverCleanup");
2879 nilPathBB
= Builder
.GetInsertBlock();
2882 llvm::Value
*isNil
= Builder
.CreateICmpEQ(Receiver
,
2883 llvm::Constant::getNullValue(Receiver
->getType()));
2884 Builder
.CreateCondBr(isNil
, nilCleanupBB
? nilCleanupBB
: continueBB
,
2886 CGF
.EmitBlock(messageBB
);
2889 // Get the IMP to call
2892 // If this is a direct method, just emit it here.
2894 imp
= GenerateMethod(Method
, Method
->getClassInterface());
2896 // If we have non-legacy dispatch specified, we try using the
2897 // objc_msgSend() functions. These are not supported on all platforms
2898 // (or all runtimes on a given platform), so we
2899 switch (CGM
.getCodeGenOpts().getObjCDispatchMethod()) {
2900 case CodeGenOptions::Legacy
:
2901 imp
= LookupIMP(CGF
, Receiver
, cmd
, node
, MSI
);
2903 case CodeGenOptions::Mixed
:
2904 case CodeGenOptions::NonLegacy
:
2905 StringRef name
= "objc_msgSend";
2906 if (CGM
.ReturnTypeUsesFPRet(ResultType
)) {
2907 name
= "objc_msgSend_fpret";
2908 } else if (CGM
.ReturnTypeUsesSRet(MSI
.CallInfo
)) {
2909 name
= "objc_msgSend_stret";
2911 // The address of the memory block is be passed in x8 for POD type,
2912 // or in x0 for non-POD type (marked as inreg).
2913 bool shouldCheckForInReg
=
2917 .isWindowsMSVCEnvironment() &&
2918 CGM
.getContext().getTargetInfo().getTriple().isAArch64();
2919 if (shouldCheckForInReg
&& CGM
.ReturnTypeHasInReg(MSI
.CallInfo
)) {
2920 name
= "objc_msgSend_stret2";
2923 // The actual types here don't matter - we're going to bitcast the
2925 imp
= CGM
.CreateRuntimeFunction(llvm::FunctionType::get(IdTy
, IdTy
, true),
2930 // Reset the receiver in case the lookup modified it
2931 ActualArgs
[0] = CallArg(RValue::get(Receiver
), ASTIdTy
);
2933 imp
= EnforceType(Builder
, imp
, MSI
.MessengerType
);
2935 llvm::CallBase
*call
;
2936 CGCallee
callee(CGCalleeInfo(), imp
);
2937 RValue msgRet
= CGF
.EmitCall(MSI
.CallInfo
, callee
, Return
, ActualArgs
, &call
);
2939 call
->setMetadata(msgSendMDKind
, node
);
2941 if (requiresNilReceiverCheck
) {
2942 llvm::BasicBlock
*nonNilPathBB
= CGF
.Builder
.GetInsertBlock();
2943 CGF
.Builder
.CreateBr(continueBB
);
2945 // Emit the nil path if we decided it was necessary above.
2947 CGF
.EmitBlock(nilCleanupBB
);
2949 if (hasParamDestroyedInCallee
) {
2950 destroyCalleeDestroyedArguments(CGF
, Method
, CallArgs
);
2953 if (requiresExplicitAggZeroing
) {
2954 assert(msgRet
.isAggregate());
2955 Address addr
= msgRet
.getAggregateAddress();
2956 CGF
.EmitNullInitialization(addr
, ResultType
);
2959 nilPathBB
= CGF
.Builder
.GetInsertBlock();
2960 CGF
.Builder
.CreateBr(continueBB
);
2963 // Enter the continuation block and emit a phi if required.
2964 CGF
.EmitBlock(continueBB
);
2965 if (msgRet
.isScalar()) {
2966 // If the return type is void, do nothing
2967 if (llvm::Value
*v
= msgRet
.getScalarVal()) {
2968 llvm::PHINode
*phi
= Builder
.CreatePHI(v
->getType(), 2);
2969 phi
->addIncoming(v
, nonNilPathBB
);
2970 phi
->addIncoming(CGM
.EmitNullConstant(ResultType
), nilPathBB
);
2971 msgRet
= RValue::get(phi
);
2973 } else if (msgRet
.isAggregate()) {
2974 // Aggregate zeroing is handled in nilCleanupBB when it's required.
2975 } else /* isComplex() */ {
2976 std::pair
<llvm::Value
*,llvm::Value
*> v
= msgRet
.getComplexVal();
2977 llvm::PHINode
*phi
= Builder
.CreatePHI(v
.first
->getType(), 2);
2978 phi
->addIncoming(v
.first
, nonNilPathBB
);
2979 phi
->addIncoming(llvm::Constant::getNullValue(v
.first
->getType()),
2981 llvm::PHINode
*phi2
= Builder
.CreatePHI(v
.second
->getType(), 2);
2982 phi2
->addIncoming(v
.second
, nonNilPathBB
);
2983 phi2
->addIncoming(llvm::Constant::getNullValue(v
.second
->getType()),
2985 msgRet
= RValue::getComplex(phi
, phi2
);
2991 /// Generates a MethodList. Used in construction of a objc_class and
2992 /// objc_category structures.
2993 llvm::Constant
*CGObjCGNU::
2994 GenerateMethodList(StringRef ClassName
,
2995 StringRef CategoryName
,
2996 ArrayRef
<const ObjCMethodDecl
*> Methods
,
2997 bool isClassMethodList
) {
2998 if (Methods
.empty())
3001 ConstantInitBuilder
Builder(CGM
);
3003 auto MethodList
= Builder
.beginStruct();
3004 MethodList
.addNullPointer(CGM
.Int8PtrTy
);
3005 MethodList
.addInt(Int32Ty
, Methods
.size());
3007 // Get the method structure type.
3008 llvm::StructType
*ObjCMethodTy
=
3009 llvm::StructType::get(CGM
.getLLVMContext(), {
3010 PtrToInt8Ty
, // Really a selector, but the runtime creates it us.
3011 PtrToInt8Ty
, // Method types
3012 IMPTy
// Method pointer
3014 bool isV2ABI
= isRuntime(ObjCRuntime::GNUstep
, 2);
3017 llvm::DataLayout
td(&TheModule
);
3018 MethodList
.addInt(SizeTy
, td
.getTypeSizeInBits(ObjCMethodTy
) /
3019 CGM
.getContext().getCharWidth());
3021 llvm::StructType::get(CGM
.getLLVMContext(), {
3022 IMPTy
, // Method pointer
3023 PtrToInt8Ty
, // Selector
3024 PtrToInt8Ty
// Extended type encoding
3028 llvm::StructType::get(CGM
.getLLVMContext(), {
3029 PtrToInt8Ty
, // Really a selector, but the runtime creates it us.
3030 PtrToInt8Ty
, // Method types
3031 IMPTy
// Method pointer
3034 auto MethodArray
= MethodList
.beginArray();
3035 ASTContext
&Context
= CGM
.getContext();
3036 for (const auto *OMD
: Methods
) {
3037 llvm::Constant
*FnPtr
=
3038 TheModule
.getFunction(getSymbolNameForMethod(OMD
));
3039 assert(FnPtr
&& "Can't generate metadata for method that doesn't exist");
3040 auto Method
= MethodArray
.beginStruct(ObjCMethodTy
);
3043 Method
.add(GetConstantSelector(OMD
->getSelector(),
3044 Context
.getObjCEncodingForMethodDecl(OMD
)));
3045 Method
.add(MakeConstantString(Context
.getObjCEncodingForMethodDecl(OMD
, true)));
3047 Method
.add(MakeConstantString(OMD
->getSelector().getAsString()));
3048 Method
.add(MakeConstantString(Context
.getObjCEncodingForMethodDecl(OMD
)));
3051 Method
.finishAndAddTo(MethodArray
);
3053 MethodArray
.finishAndAddTo(MethodList
);
3055 // Create an instance of the structure
3056 return MethodList
.finishAndCreateGlobal(".objc_method_list",
3057 CGM
.getPointerAlign());
3060 /// Generates an IvarList. Used in construction of a objc_class.
3061 llvm::Constant
*CGObjCGNU::
3062 GenerateIvarList(ArrayRef
<llvm::Constant
*> IvarNames
,
3063 ArrayRef
<llvm::Constant
*> IvarTypes
,
3064 ArrayRef
<llvm::Constant
*> IvarOffsets
,
3065 ArrayRef
<llvm::Constant
*> IvarAlign
,
3066 ArrayRef
<Qualifiers::ObjCLifetime
> IvarOwnership
) {
3067 if (IvarNames
.empty())
3070 ConstantInitBuilder
Builder(CGM
);
3072 // Structure containing array count followed by array.
3073 auto IvarList
= Builder
.beginStruct();
3074 IvarList
.addInt(IntTy
, (int)IvarNames
.size());
3076 // Get the ivar structure type.
3077 llvm::StructType
*ObjCIvarTy
=
3078 llvm::StructType::get(PtrToInt8Ty
, PtrToInt8Ty
, IntTy
);
3080 // Array of ivar structures.
3081 auto Ivars
= IvarList
.beginArray(ObjCIvarTy
);
3082 for (unsigned int i
= 0, e
= IvarNames
.size() ; i
< e
; i
++) {
3083 auto Ivar
= Ivars
.beginStruct(ObjCIvarTy
);
3084 Ivar
.add(IvarNames
[i
]);
3085 Ivar
.add(IvarTypes
[i
]);
3086 Ivar
.add(IvarOffsets
[i
]);
3087 Ivar
.finishAndAddTo(Ivars
);
3089 Ivars
.finishAndAddTo(IvarList
);
3091 // Create an instance of the structure
3092 return IvarList
.finishAndCreateGlobal(".objc_ivar_list",
3093 CGM
.getPointerAlign());
3096 /// Generate a class structure
3097 llvm::Constant
*CGObjCGNU::GenerateClassStructure(
3098 llvm::Constant
*MetaClass
,
3099 llvm::Constant
*SuperClass
,
3102 llvm::Constant
*Version
,
3103 llvm::Constant
*InstanceSize
,
3104 llvm::Constant
*IVars
,
3105 llvm::Constant
*Methods
,
3106 llvm::Constant
*Protocols
,
3107 llvm::Constant
*IvarOffsets
,
3108 llvm::Constant
*Properties
,
3109 llvm::Constant
*StrongIvarBitmap
,
3110 llvm::Constant
*WeakIvarBitmap
,
3112 // Set up the class structure
3113 // Note: Several of these are char*s when they should be ids. This is
3114 // because the runtime performs this translation on load.
3116 // Fields marked New ABI are part of the GNUstep runtime. We emit them
3117 // anyway; the classes will still work with the GNU runtime, they will just
3119 llvm::StructType
*ClassTy
= llvm::StructType::get(
3121 PtrToInt8Ty
, // super_class
3122 PtrToInt8Ty
, // name
3125 LongTy
, // instance_size
3126 IVars
->getType(), // ivars
3127 Methods
->getType(), // methods
3128 // These are all filled in by the runtime, so we pretend
3130 PtrTy
, // subclass_list
3131 PtrTy
, // sibling_class
3133 PtrTy
, // gc_object_type
3135 LongTy
, // abi_version
3136 IvarOffsets
->getType(), // ivar_offsets
3137 Properties
->getType(), // properties
3138 IntPtrTy
, // strong_pointers
3139 IntPtrTy
// weak_pointers
3142 ConstantInitBuilder
Builder(CGM
);
3143 auto Elements
= Builder
.beginStruct(ClassTy
);
3145 // Fill in the structure
3148 Elements
.add(MetaClass
);
3150 Elements
.add(SuperClass
);
3152 Elements
.add(MakeConstantString(Name
, ".class_name"));
3154 Elements
.addInt(LongTy
, 0);
3156 Elements
.addInt(LongTy
, info
);
3159 llvm::DataLayout
td(&TheModule
);
3160 Elements
.addInt(LongTy
,
3161 td
.getTypeSizeInBits(ClassTy
) /
3162 CGM
.getContext().getCharWidth());
3164 Elements
.add(InstanceSize
);
3166 Elements
.add(IVars
);
3168 Elements
.add(Methods
);
3169 // These are all filled in by the runtime, so we pretend
3171 Elements
.add(NULLPtr
);
3173 Elements
.add(NULLPtr
);
3175 Elements
.add(NULLPtr
);
3177 Elements
.add(Protocols
);
3179 Elements
.add(NULLPtr
);
3181 Elements
.addInt(LongTy
, ClassABIVersion
);
3183 Elements
.add(IvarOffsets
);
3185 Elements
.add(Properties
);
3187 Elements
.add(StrongIvarBitmap
);
3189 Elements
.add(WeakIvarBitmap
);
3190 // Create an instance of the structure
3191 // This is now an externally visible symbol, so that we can speed up class
3192 // messages in the next ABI. We may already have some weak references to
3193 // this, so check and fix them properly.
3194 std::string
ClassSym((isMeta
? "_OBJC_METACLASS_": "_OBJC_CLASS_") +
3196 llvm::GlobalVariable
*ClassRef
= TheModule
.getNamedGlobal(ClassSym
);
3197 llvm::Constant
*Class
=
3198 Elements
.finishAndCreateGlobal(ClassSym
, CGM
.getPointerAlign(), false,
3199 llvm::GlobalValue::ExternalLinkage
);
3201 ClassRef
->replaceAllUsesWith(Class
);
3202 ClassRef
->removeFromParent();
3203 Class
->setName(ClassSym
);
3208 llvm::Constant
*CGObjCGNU::
3209 GenerateProtocolMethodList(ArrayRef
<const ObjCMethodDecl
*> Methods
) {
3210 // Get the method structure type.
3211 llvm::StructType
*ObjCMethodDescTy
=
3212 llvm::StructType::get(CGM
.getLLVMContext(), { PtrToInt8Ty
, PtrToInt8Ty
});
3213 ASTContext
&Context
= CGM
.getContext();
3214 ConstantInitBuilder
Builder(CGM
);
3215 auto MethodList
= Builder
.beginStruct();
3216 MethodList
.addInt(IntTy
, Methods
.size());
3217 auto MethodArray
= MethodList
.beginArray(ObjCMethodDescTy
);
3218 for (auto *M
: Methods
) {
3219 auto Method
= MethodArray
.beginStruct(ObjCMethodDescTy
);
3220 Method
.add(MakeConstantString(M
->getSelector().getAsString()));
3221 Method
.add(MakeConstantString(Context
.getObjCEncodingForMethodDecl(M
)));
3222 Method
.finishAndAddTo(MethodArray
);
3224 MethodArray
.finishAndAddTo(MethodList
);
3225 return MethodList
.finishAndCreateGlobal(".objc_method_list",
3226 CGM
.getPointerAlign());
3229 // Create the protocol list structure used in classes, categories and so on
3231 CGObjCGNU::GenerateProtocolList(ArrayRef
<std::string
> Protocols
) {
3233 ConstantInitBuilder
Builder(CGM
);
3234 auto ProtocolList
= Builder
.beginStruct();
3235 ProtocolList
.add(NULLPtr
);
3236 ProtocolList
.addInt(LongTy
, Protocols
.size());
3238 auto Elements
= ProtocolList
.beginArray(PtrToInt8Ty
);
3239 for (const std::string
*iter
= Protocols
.begin(), *endIter
= Protocols
.end();
3240 iter
!= endIter
; iter
++) {
3241 llvm::Constant
*protocol
= nullptr;
3242 llvm::StringMap
<llvm::Constant
*>::iterator value
=
3243 ExistingProtocols
.find(*iter
);
3244 if (value
== ExistingProtocols
.end()) {
3245 protocol
= GenerateEmptyProtocol(*iter
);
3247 protocol
= value
->getValue();
3249 Elements
.add(protocol
);
3251 Elements
.finishAndAddTo(ProtocolList
);
3252 return ProtocolList
.finishAndCreateGlobal(".objc_protocol_list",
3253 CGM
.getPointerAlign());
3256 llvm::Value
*CGObjCGNU::GenerateProtocolRef(CodeGenFunction
&CGF
,
3257 const ObjCProtocolDecl
*PD
) {
3258 auto protocol
= GenerateProtocolRef(PD
);
3260 CGM
.getTypes().ConvertType(CGM
.getContext().getObjCProtoType());
3261 return CGF
.Builder
.CreateBitCast(protocol
, llvm::PointerType::getUnqual(T
));
3264 llvm::Constant
*CGObjCGNU::GenerateProtocolRef(const ObjCProtocolDecl
*PD
) {
3265 llvm::Constant
*&protocol
= ExistingProtocols
[PD
->getNameAsString()];
3267 GenerateProtocol(PD
);
3268 assert(protocol
&& "Unknown protocol");
3273 CGObjCGNU::GenerateEmptyProtocol(StringRef ProtocolName
) {
3274 llvm::Constant
*ProtocolList
= GenerateProtocolList({});
3275 llvm::Constant
*MethodList
= GenerateProtocolMethodList({});
3276 // Protocols are objects containing lists of the methods implemented and
3277 // protocols adopted.
3278 ConstantInitBuilder
Builder(CGM
);
3279 auto Elements
= Builder
.beginStruct();
3281 // The isa pointer must be set to a magic number so the runtime knows it's
3282 // the correct layout.
3283 Elements
.add(llvm::ConstantExpr::getIntToPtr(
3284 llvm::ConstantInt::get(Int32Ty
, ProtocolVersion
), IdTy
));
3286 Elements
.add(MakeConstantString(ProtocolName
, ".objc_protocol_name"));
3287 Elements
.add(ProtocolList
); /* .protocol_list */
3288 Elements
.add(MethodList
); /* .instance_methods */
3289 Elements
.add(MethodList
); /* .class_methods */
3290 Elements
.add(MethodList
); /* .optional_instance_methods */
3291 Elements
.add(MethodList
); /* .optional_class_methods */
3292 Elements
.add(NULLPtr
); /* .properties */
3293 Elements
.add(NULLPtr
); /* .optional_properties */
3294 return Elements
.finishAndCreateGlobal(SymbolForProtocol(ProtocolName
),
3295 CGM
.getPointerAlign());
3298 void CGObjCGNU::GenerateProtocol(const ObjCProtocolDecl
*PD
) {
3299 if (PD
->isNonRuntimeProtocol())
3302 std::string ProtocolName
= PD
->getNameAsString();
3304 // Use the protocol definition, if there is one.
3305 if (const ObjCProtocolDecl
*Def
= PD
->getDefinition())
3308 SmallVector
<std::string
, 16> Protocols
;
3309 for (const auto *PI
: PD
->protocols())
3310 Protocols
.push_back(PI
->getNameAsString());
3311 SmallVector
<const ObjCMethodDecl
*, 16> InstanceMethods
;
3312 SmallVector
<const ObjCMethodDecl
*, 16> OptionalInstanceMethods
;
3313 for (const auto *I
: PD
->instance_methods())
3314 if (I
->isOptional())
3315 OptionalInstanceMethods
.push_back(I
);
3317 InstanceMethods
.push_back(I
);
3318 // Collect information about class methods:
3319 SmallVector
<const ObjCMethodDecl
*, 16> ClassMethods
;
3320 SmallVector
<const ObjCMethodDecl
*, 16> OptionalClassMethods
;
3321 for (const auto *I
: PD
->class_methods())
3322 if (I
->isOptional())
3323 OptionalClassMethods
.push_back(I
);
3325 ClassMethods
.push_back(I
);
3327 llvm::Constant
*ProtocolList
= GenerateProtocolList(Protocols
);
3328 llvm::Constant
*InstanceMethodList
=
3329 GenerateProtocolMethodList(InstanceMethods
);
3330 llvm::Constant
*ClassMethodList
=
3331 GenerateProtocolMethodList(ClassMethods
);
3332 llvm::Constant
*OptionalInstanceMethodList
=
3333 GenerateProtocolMethodList(OptionalInstanceMethods
);
3334 llvm::Constant
*OptionalClassMethodList
=
3335 GenerateProtocolMethodList(OptionalClassMethods
);
3337 // Property metadata: name, attributes, isSynthesized, setter name, setter
3338 // types, getter name, getter types.
3339 // The isSynthesized value is always set to 0 in a protocol. It exists to
3340 // simplify the runtime library by allowing it to use the same data
3341 // structures for protocol metadata everywhere.
3343 llvm::Constant
*PropertyList
=
3344 GeneratePropertyList(nullptr, PD
, false, false);
3345 llvm::Constant
*OptionalPropertyList
=
3346 GeneratePropertyList(nullptr, PD
, false, true);
3348 // Protocols are objects containing lists of the methods implemented and
3349 // protocols adopted.
3350 // The isa pointer must be set to a magic number so the runtime knows it's
3351 // the correct layout.
3352 ConstantInitBuilder
Builder(CGM
);
3353 auto Elements
= Builder
.beginStruct();
3355 llvm::ConstantExpr::getIntToPtr(
3356 llvm::ConstantInt::get(Int32Ty
, ProtocolVersion
), IdTy
));
3357 Elements
.add(MakeConstantString(ProtocolName
));
3358 Elements
.add(ProtocolList
);
3359 Elements
.add(InstanceMethodList
);
3360 Elements
.add(ClassMethodList
);
3361 Elements
.add(OptionalInstanceMethodList
);
3362 Elements
.add(OptionalClassMethodList
);
3363 Elements
.add(PropertyList
);
3364 Elements
.add(OptionalPropertyList
);
3365 ExistingProtocols
[ProtocolName
] =
3366 Elements
.finishAndCreateGlobal(".objc_protocol", CGM
.getPointerAlign());
3368 void CGObjCGNU::GenerateProtocolHolderCategory() {
3369 // Collect information about instance methods
3371 ConstantInitBuilder
Builder(CGM
);
3372 auto Elements
= Builder
.beginStruct();
3374 const std::string ClassName
= "__ObjC_Protocol_Holder_Ugly_Hack";
3375 const std::string CategoryName
= "AnotherHack";
3376 Elements
.add(MakeConstantString(CategoryName
));
3377 Elements
.add(MakeConstantString(ClassName
));
3378 // Instance method list
3379 Elements
.add(GenerateMethodList(ClassName
, CategoryName
, {}, false));
3380 // Class method list
3381 Elements
.add(GenerateMethodList(ClassName
, CategoryName
, {}, true));
3384 ConstantInitBuilder
ProtocolListBuilder(CGM
);
3385 auto ProtocolList
= ProtocolListBuilder
.beginStruct();
3386 ProtocolList
.add(NULLPtr
);
3387 ProtocolList
.addInt(LongTy
, ExistingProtocols
.size());
3388 auto ProtocolElements
= ProtocolList
.beginArray(PtrTy
);
3389 for (auto iter
= ExistingProtocols
.begin(), endIter
= ExistingProtocols
.end();
3390 iter
!= endIter
; iter
++) {
3391 ProtocolElements
.add(iter
->getValue());
3393 ProtocolElements
.finishAndAddTo(ProtocolList
);
3394 Elements
.add(ProtocolList
.finishAndCreateGlobal(".objc_protocol_list",
3395 CGM
.getPointerAlign()));
3396 Categories
.push_back(
3397 Elements
.finishAndCreateGlobal("", CGM
.getPointerAlign()));
3400 /// Libobjc2 uses a bitfield representation where small(ish) bitfields are
3401 /// stored in a 64-bit value with the low bit set to 1 and the remaining 63
3402 /// bits set to their values, LSB first, while larger ones are stored in a
3403 /// structure of this / form:
3405 /// struct { int32_t length; int32_t values[length]; };
3407 /// The values in the array are stored in host-endian format, with the least
3408 /// significant bit being assumed to come first in the bitfield. Therefore, a
3409 /// bitfield with the 64th bit set will be (int64_t)&{ 2, [0, 1<<31] }, while a
3410 /// bitfield / with the 63rd bit set will be 1<<64.
3411 llvm::Constant
*CGObjCGNU::MakeBitField(ArrayRef
<bool> bits
) {
3412 int bitCount
= bits
.size();
3413 int ptrBits
= CGM
.getDataLayout().getPointerSizeInBits();
3414 if (bitCount
< ptrBits
) {
3416 for (int i
=0 ; i
<bitCount
; ++i
) {
3417 if (bits
[i
]) val
|= 1ULL<<(i
+1);
3419 return llvm::ConstantInt::get(IntPtrTy
, val
);
3421 SmallVector
<llvm::Constant
*, 8> values
;
3423 while (v
< bitCount
) {
3425 for (int i
=0 ; (i
<32) && (v
<bitCount
) ; ++i
) {
3426 if (bits
[v
]) word
|= 1<<i
;
3429 values
.push_back(llvm::ConstantInt::get(Int32Ty
, word
));
3432 ConstantInitBuilder
builder(CGM
);
3433 auto fields
= builder
.beginStruct();
3434 fields
.addInt(Int32Ty
, values
.size());
3435 auto array
= fields
.beginArray();
3436 for (auto *v
: values
) array
.add(v
);
3437 array
.finishAndAddTo(fields
);
3439 llvm::Constant
*GS
=
3440 fields
.finishAndCreateGlobal("", CharUnits::fromQuantity(4));
3441 llvm::Constant
*ptr
= llvm::ConstantExpr::getPtrToInt(GS
, IntPtrTy
);
3445 llvm::Constant
*CGObjCGNU::GenerateCategoryProtocolList(const
3446 ObjCCategoryDecl
*OCD
) {
3447 const auto &RefPro
= OCD
->getReferencedProtocols();
3448 const auto RuntimeProtos
=
3449 GetRuntimeProtocolList(RefPro
.begin(), RefPro
.end());
3450 SmallVector
<std::string
, 16> Protocols
;
3451 for (const auto *PD
: RuntimeProtos
)
3452 Protocols
.push_back(PD
->getNameAsString());
3453 return GenerateProtocolList(Protocols
);
3456 void CGObjCGNU::GenerateCategory(const ObjCCategoryImplDecl
*OCD
) {
3457 const ObjCInterfaceDecl
*Class
= OCD
->getClassInterface();
3458 std::string ClassName
= Class
->getNameAsString();
3459 std::string CategoryName
= OCD
->getNameAsString();
3461 // Collect the names of referenced protocols
3462 const ObjCCategoryDecl
*CatDecl
= OCD
->getCategoryDecl();
3464 ConstantInitBuilder
Builder(CGM
);
3465 auto Elements
= Builder
.beginStruct();
3466 Elements
.add(MakeConstantString(CategoryName
));
3467 Elements
.add(MakeConstantString(ClassName
));
3468 // Instance method list
3469 SmallVector
<ObjCMethodDecl
*, 16> InstanceMethods
;
3470 InstanceMethods
.insert(InstanceMethods
.begin(), OCD
->instmeth_begin(),
3471 OCD
->instmeth_end());
3473 GenerateMethodList(ClassName
, CategoryName
, InstanceMethods
, false));
3475 // Class method list
3477 SmallVector
<ObjCMethodDecl
*, 16> ClassMethods
;
3478 ClassMethods
.insert(ClassMethods
.begin(), OCD
->classmeth_begin(),
3479 OCD
->classmeth_end());
3480 Elements
.add(GenerateMethodList(ClassName
, CategoryName
, ClassMethods
, true));
3483 Elements
.add(GenerateCategoryProtocolList(CatDecl
));
3484 if (isRuntime(ObjCRuntime::GNUstep
, 2)) {
3485 const ObjCCategoryDecl
*Category
=
3486 Class
->FindCategoryDeclaration(OCD
->getIdentifier());
3488 // Instance properties
3489 Elements
.add(GeneratePropertyList(OCD
, Category
, false));
3491 Elements
.add(GeneratePropertyList(OCD
, Category
, true));
3493 Elements
.addNullPointer(PtrTy
);
3494 Elements
.addNullPointer(PtrTy
);
3498 Categories
.push_back(Elements
.finishAndCreateGlobal(
3499 std::string(".objc_category_") + ClassName
+ CategoryName
,
3500 CGM
.getPointerAlign()));
3503 llvm::Constant
*CGObjCGNU::GeneratePropertyList(const Decl
*Container
,
3504 const ObjCContainerDecl
*OCD
,
3505 bool isClassProperty
,
3506 bool protocolOptionalProperties
) {
3508 SmallVector
<const ObjCPropertyDecl
*, 16> Properties
;
3509 llvm::SmallPtrSet
<const IdentifierInfo
*, 16> PropertySet
;
3510 bool isProtocol
= isa
<ObjCProtocolDecl
>(OCD
);
3511 ASTContext
&Context
= CGM
.getContext();
3513 std::function
<void(const ObjCProtocolDecl
*Proto
)> collectProtocolProperties
3514 = [&](const ObjCProtocolDecl
*Proto
) {
3515 for (const auto *P
: Proto
->protocols())
3516 collectProtocolProperties(P
);
3517 for (const auto *PD
: Proto
->properties()) {
3518 if (isClassProperty
!= PD
->isClassProperty())
3520 // Skip any properties that are declared in protocols that this class
3521 // conforms to but are not actually implemented by this class.
3522 if (!isProtocol
&& !Context
.getObjCPropertyImplDeclForPropertyDecl(PD
, Container
))
3524 if (!PropertySet
.insert(PD
->getIdentifier()).second
)
3526 Properties
.push_back(PD
);
3530 if (const ObjCInterfaceDecl
*OID
= dyn_cast
<ObjCInterfaceDecl
>(OCD
))
3531 for (const ObjCCategoryDecl
*ClassExt
: OID
->known_extensions())
3532 for (auto *PD
: ClassExt
->properties()) {
3533 if (isClassProperty
!= PD
->isClassProperty())
3535 PropertySet
.insert(PD
->getIdentifier());
3536 Properties
.push_back(PD
);
3539 for (const auto *PD
: OCD
->properties()) {
3540 if (isClassProperty
!= PD
->isClassProperty())
3542 // If we're generating a list for a protocol, skip optional / required ones
3543 // when generating the other list.
3544 if (isProtocol
&& (protocolOptionalProperties
!= PD
->isOptional()))
3546 // Don't emit duplicate metadata for properties that were already in a
3548 if (!PropertySet
.insert(PD
->getIdentifier()).second
)
3551 Properties
.push_back(PD
);
3554 if (const ObjCInterfaceDecl
*OID
= dyn_cast
<ObjCInterfaceDecl
>(OCD
))
3555 for (const auto *P
: OID
->all_referenced_protocols())
3556 collectProtocolProperties(P
);
3557 else if (const ObjCCategoryDecl
*CD
= dyn_cast
<ObjCCategoryDecl
>(OCD
))
3558 for (const auto *P
: CD
->protocols())
3559 collectProtocolProperties(P
);
3561 auto numProperties
= Properties
.size();
3563 if (numProperties
== 0)
3566 ConstantInitBuilder
builder(CGM
);
3567 auto propertyList
= builder
.beginStruct();
3568 auto properties
= PushPropertyListHeader(propertyList
, numProperties
);
3570 // Add all of the property methods need adding to the method list and to the
3571 // property metadata list.
3572 for (auto *property
: Properties
) {
3573 bool isSynthesized
= false;
3574 bool isDynamic
= false;
3576 auto *propertyImpl
= Context
.getObjCPropertyImplDeclForPropertyDecl(property
, Container
);
3578 isSynthesized
= (propertyImpl
->getPropertyImplementation() ==
3579 ObjCPropertyImplDecl::Synthesize
);
3580 isDynamic
= (propertyImpl
->getPropertyImplementation() ==
3581 ObjCPropertyImplDecl::Dynamic
);
3584 PushProperty(properties
, property
, Container
, isSynthesized
, isDynamic
);
3586 properties
.finishAndAddTo(propertyList
);
3588 return propertyList
.finishAndCreateGlobal(".objc_property_list",
3589 CGM
.getPointerAlign());
3592 void CGObjCGNU::RegisterAlias(const ObjCCompatibleAliasDecl
*OAD
) {
3593 // Get the class declaration for which the alias is specified.
3594 ObjCInterfaceDecl
*ClassDecl
=
3595 const_cast<ObjCInterfaceDecl
*>(OAD
->getClassInterface());
3596 ClassAliases
.emplace_back(ClassDecl
->getNameAsString(),
3597 OAD
->getNameAsString());
3600 void CGObjCGNU::GenerateClass(const ObjCImplementationDecl
*OID
) {
3601 ASTContext
&Context
= CGM
.getContext();
3603 // Get the superclass name.
3604 const ObjCInterfaceDecl
* SuperClassDecl
=
3605 OID
->getClassInterface()->getSuperClass();
3606 std::string SuperClassName
;
3607 if (SuperClassDecl
) {
3608 SuperClassName
= SuperClassDecl
->getNameAsString();
3609 EmitClassRef(SuperClassName
);
3612 // Get the class name
3613 ObjCInterfaceDecl
*ClassDecl
=
3614 const_cast<ObjCInterfaceDecl
*>(OID
->getClassInterface());
3615 std::string ClassName
= ClassDecl
->getNameAsString();
3617 // Emit the symbol that is used to generate linker errors if this class is
3618 // referenced in other modules but not declared.
3619 std::string classSymbolName
= "__objc_class_name_" + ClassName
;
3620 if (auto *symbol
= TheModule
.getGlobalVariable(classSymbolName
)) {
3621 symbol
->setInitializer(llvm::ConstantInt::get(LongTy
, 0));
3623 new llvm::GlobalVariable(TheModule
, LongTy
, false,
3624 llvm::GlobalValue::ExternalLinkage
,
3625 llvm::ConstantInt::get(LongTy
, 0),
3629 // Get the size of instances.
3631 Context
.getASTObjCImplementationLayout(OID
).getSize().getQuantity();
3633 // Collect information about instance variables.
3634 SmallVector
<llvm::Constant
*, 16> IvarNames
;
3635 SmallVector
<llvm::Constant
*, 16> IvarTypes
;
3636 SmallVector
<llvm::Constant
*, 16> IvarOffsets
;
3637 SmallVector
<llvm::Constant
*, 16> IvarAligns
;
3638 SmallVector
<Qualifiers::ObjCLifetime
, 16> IvarOwnership
;
3640 ConstantInitBuilder
IvarOffsetBuilder(CGM
);
3641 auto IvarOffsetValues
= IvarOffsetBuilder
.beginArray(PtrToIntTy
);
3642 SmallVector
<bool, 16> WeakIvars
;
3643 SmallVector
<bool, 16> StrongIvars
;
3645 int superInstanceSize
= !SuperClassDecl
? 0 :
3646 Context
.getASTObjCInterfaceLayout(SuperClassDecl
).getSize().getQuantity();
3647 // For non-fragile ivars, set the instance size to 0 - {the size of just this
3648 // class}. The runtime will then set this to the correct value on load.
3649 if (CGM
.getLangOpts().ObjCRuntime
.isNonFragile()) {
3650 instanceSize
= 0 - (instanceSize
- superInstanceSize
);
3653 for (const ObjCIvarDecl
*IVD
= ClassDecl
->all_declared_ivar_begin(); IVD
;
3654 IVD
= IVD
->getNextIvar()) {
3656 IvarNames
.push_back(MakeConstantString(IVD
->getNameAsString()));
3657 // Get the type encoding for this ivar
3658 std::string TypeStr
;
3659 Context
.getObjCEncodingForType(IVD
->getType(), TypeStr
, IVD
);
3660 IvarTypes
.push_back(MakeConstantString(TypeStr
));
3661 IvarAligns
.push_back(llvm::ConstantInt::get(IntTy
,
3662 Context
.getTypeSize(IVD
->getType())));
3664 uint64_t BaseOffset
= ComputeIvarBaseOffset(CGM
, OID
, IVD
);
3665 uint64_t Offset
= BaseOffset
;
3666 if (CGM
.getLangOpts().ObjCRuntime
.isNonFragile()) {
3667 Offset
= BaseOffset
- superInstanceSize
;
3669 llvm::Constant
*OffsetValue
= llvm::ConstantInt::get(IntTy
, Offset
);
3670 // Create the direct offset value
3671 std::string OffsetName
= "__objc_ivar_offset_value_" + ClassName
+"." +
3672 IVD
->getNameAsString();
3674 llvm::GlobalVariable
*OffsetVar
= TheModule
.getGlobalVariable(OffsetName
);
3676 OffsetVar
->setInitializer(OffsetValue
);
3677 // If this is the real definition, change its linkage type so that
3678 // different modules will use this one, rather than their private
3680 OffsetVar
->setLinkage(llvm::GlobalValue::ExternalLinkage
);
3682 OffsetVar
= new llvm::GlobalVariable(TheModule
, Int32Ty
,
3683 false, llvm::GlobalValue::ExternalLinkage
,
3684 OffsetValue
, OffsetName
);
3685 IvarOffsets
.push_back(OffsetValue
);
3686 IvarOffsetValues
.add(OffsetVar
);
3687 Qualifiers::ObjCLifetime lt
= IVD
->getType().getQualifiers().getObjCLifetime();
3688 IvarOwnership
.push_back(lt
);
3690 case Qualifiers::OCL_Strong
:
3691 StrongIvars
.push_back(true);
3692 WeakIvars
.push_back(false);
3694 case Qualifiers::OCL_Weak
:
3695 StrongIvars
.push_back(false);
3696 WeakIvars
.push_back(true);
3699 StrongIvars
.push_back(false);
3700 WeakIvars
.push_back(false);
3703 llvm::Constant
*StrongIvarBitmap
= MakeBitField(StrongIvars
);
3704 llvm::Constant
*WeakIvarBitmap
= MakeBitField(WeakIvars
);
3705 llvm::GlobalVariable
*IvarOffsetArray
=
3706 IvarOffsetValues
.finishAndCreateGlobal(".ivar.offsets",
3707 CGM
.getPointerAlign());
3709 // Collect information about instance methods
3710 SmallVector
<const ObjCMethodDecl
*, 16> InstanceMethods
;
3711 InstanceMethods
.insert(InstanceMethods
.begin(), OID
->instmeth_begin(),
3712 OID
->instmeth_end());
3714 SmallVector
<const ObjCMethodDecl
*, 16> ClassMethods
;
3715 ClassMethods
.insert(ClassMethods
.begin(), OID
->classmeth_begin(),
3716 OID
->classmeth_end());
3718 llvm::Constant
*Properties
= GeneratePropertyList(OID
, ClassDecl
);
3720 // Collect the names of referenced protocols
3721 auto RefProtocols
= ClassDecl
->protocols();
3722 auto RuntimeProtocols
=
3723 GetRuntimeProtocolList(RefProtocols
.begin(), RefProtocols
.end());
3724 SmallVector
<std::string
, 16> Protocols
;
3725 for (const auto *I
: RuntimeProtocols
)
3726 Protocols
.push_back(I
->getNameAsString());
3728 // Get the superclass pointer.
3729 llvm::Constant
*SuperClass
;
3730 if (!SuperClassName
.empty()) {
3731 SuperClass
= MakeConstantString(SuperClassName
, ".super_class_name");
3733 SuperClass
= llvm::ConstantPointerNull::get(PtrToInt8Ty
);
3735 // Empty vector used to construct empty method lists
3736 SmallVector
<llvm::Constant
*, 1> empty
;
3737 // Generate the method and instance variable lists
3738 llvm::Constant
*MethodList
= GenerateMethodList(ClassName
, "",
3739 InstanceMethods
, false);
3740 llvm::Constant
*ClassMethodList
= GenerateMethodList(ClassName
, "",
3741 ClassMethods
, true);
3742 llvm::Constant
*IvarList
= GenerateIvarList(IvarNames
, IvarTypes
,
3743 IvarOffsets
, IvarAligns
, IvarOwnership
);
3744 // Irrespective of whether we are compiling for a fragile or non-fragile ABI,
3745 // we emit a symbol containing the offset for each ivar in the class. This
3746 // allows code compiled for the non-Fragile ABI to inherit from code compiled
3747 // for the legacy ABI, without causing problems. The converse is also
3748 // possible, but causes all ivar accesses to be fragile.
3750 // Offset pointer for getting at the correct field in the ivar list when
3751 // setting up the alias. These are: The base address for the global, the
3752 // ivar array (second field), the ivar in this list (set for each ivar), and
3753 // the offset (third field in ivar structure)
3754 llvm::Type
*IndexTy
= Int32Ty
;
3755 llvm::Constant
*offsetPointerIndexes
[] = {Zeros
[0],
3756 llvm::ConstantInt::get(IndexTy
, ClassABIVersion
> 1 ? 2 : 1), nullptr,
3757 llvm::ConstantInt::get(IndexTy
, ClassABIVersion
> 1 ? 3 : 2) };
3759 unsigned ivarIndex
= 0;
3760 for (const ObjCIvarDecl
*IVD
= ClassDecl
->all_declared_ivar_begin(); IVD
;
3761 IVD
= IVD
->getNextIvar()) {
3762 const std::string Name
= GetIVarOffsetVariableName(ClassDecl
, IVD
);
3763 offsetPointerIndexes
[2] = llvm::ConstantInt::get(IndexTy
, ivarIndex
);
3764 // Get the correct ivar field
3765 llvm::Constant
*offsetValue
= llvm::ConstantExpr::getGetElementPtr(
3766 cast
<llvm::GlobalVariable
>(IvarList
)->getValueType(), IvarList
,
3767 offsetPointerIndexes
);
3768 // Get the existing variable, if one exists.
3769 llvm::GlobalVariable
*offset
= TheModule
.getNamedGlobal(Name
);
3771 offset
->setInitializer(offsetValue
);
3772 // If this is the real definition, change its linkage type so that
3773 // different modules will use this one, rather than their private
3775 offset
->setLinkage(llvm::GlobalValue::ExternalLinkage
);
3777 // Add a new alias if there isn't one already.
3778 new llvm::GlobalVariable(TheModule
, offsetValue
->getType(),
3779 false, llvm::GlobalValue::ExternalLinkage
, offsetValue
, Name
);
3782 llvm::Constant
*ZeroPtr
= llvm::ConstantInt::get(IntPtrTy
, 0);
3784 //Generate metaclass for class methods
3785 llvm::Constant
*MetaClassStruct
= GenerateClassStructure(
3786 NULLPtr
, NULLPtr
, 0x12L
, ClassName
.c_str(), nullptr, Zeros
[0],
3787 NULLPtr
, ClassMethodList
, NULLPtr
, NULLPtr
,
3788 GeneratePropertyList(OID
, ClassDecl
, true), ZeroPtr
, ZeroPtr
, true);
3789 CGM
.setGVProperties(cast
<llvm::GlobalValue
>(MetaClassStruct
),
3790 OID
->getClassInterface());
3792 // Generate the class structure
3793 llvm::Constant
*ClassStruct
= GenerateClassStructure(
3794 MetaClassStruct
, SuperClass
, 0x11L
, ClassName
.c_str(), nullptr,
3795 llvm::ConstantInt::get(LongTy
, instanceSize
), IvarList
, MethodList
,
3796 GenerateProtocolList(Protocols
), IvarOffsetArray
, Properties
,
3797 StrongIvarBitmap
, WeakIvarBitmap
);
3798 CGM
.setGVProperties(cast
<llvm::GlobalValue
>(ClassStruct
),
3799 OID
->getClassInterface());
3801 // Resolve the class aliases, if they exist.
3802 if (ClassPtrAlias
) {
3803 ClassPtrAlias
->replaceAllUsesWith(ClassStruct
);
3804 ClassPtrAlias
->eraseFromParent();
3805 ClassPtrAlias
= nullptr;
3807 if (MetaClassPtrAlias
) {
3808 MetaClassPtrAlias
->replaceAllUsesWith(MetaClassStruct
);
3809 MetaClassPtrAlias
->eraseFromParent();
3810 MetaClassPtrAlias
= nullptr;
3813 // Add class structure to list to be added to the symtab later
3814 Classes
.push_back(ClassStruct
);
3817 llvm::Function
*CGObjCGNU::ModuleInitFunction() {
3818 // Only emit an ObjC load function if no Objective-C stuff has been called
3819 if (Classes
.empty() && Categories
.empty() && ConstantStrings
.empty() &&
3820 ExistingProtocols
.empty() && SelectorTable
.empty())
3823 // Add all referenced protocols to a category.
3824 GenerateProtocolHolderCategory();
3826 llvm::StructType
*selStructTy
= dyn_cast
<llvm::StructType
>(SelectorElemTy
);
3828 selStructTy
= llvm::StructType::get(CGM
.getLLVMContext(),
3829 { PtrToInt8Ty
, PtrToInt8Ty
});
3832 // Generate statics list:
3833 llvm::Constant
*statics
= NULLPtr
;
3834 if (!ConstantStrings
.empty()) {
3835 llvm::GlobalVariable
*fileStatics
= [&] {
3836 ConstantInitBuilder
builder(CGM
);
3837 auto staticsStruct
= builder
.beginStruct();
3839 StringRef stringClass
= CGM
.getLangOpts().ObjCConstantStringClass
;
3840 if (stringClass
.empty()) stringClass
= "NXConstantString";
3841 staticsStruct
.add(MakeConstantString(stringClass
,
3842 ".objc_static_class_name"));
3844 auto array
= staticsStruct
.beginArray();
3845 array
.addAll(ConstantStrings
);
3847 array
.finishAndAddTo(staticsStruct
);
3849 return staticsStruct
.finishAndCreateGlobal(".objc_statics",
3850 CGM
.getPointerAlign());
3853 ConstantInitBuilder
builder(CGM
);
3854 auto allStaticsArray
= builder
.beginArray(fileStatics
->getType());
3855 allStaticsArray
.add(fileStatics
);
3856 allStaticsArray
.addNullPointer(fileStatics
->getType());
3858 statics
= allStaticsArray
.finishAndCreateGlobal(".objc_statics_ptr",
3859 CGM
.getPointerAlign());
3862 // Array of classes, categories, and constant objects.
3864 SmallVector
<llvm::GlobalAlias
*, 16> selectorAliases
;
3865 unsigned selectorCount
;
3867 // Pointer to an array of selectors used in this module.
3868 llvm::GlobalVariable
*selectorList
= [&] {
3869 ConstantInitBuilder
builder(CGM
);
3870 auto selectors
= builder
.beginArray(selStructTy
);
3871 auto &table
= SelectorTable
; // MSVC workaround
3872 std::vector
<Selector
> allSelectors
;
3873 for (auto &entry
: table
)
3874 allSelectors
.push_back(entry
.first
);
3875 llvm::sort(allSelectors
);
3877 for (auto &untypedSel
: allSelectors
) {
3878 std::string selNameStr
= untypedSel
.getAsString();
3879 llvm::Constant
*selName
= ExportUniqueString(selNameStr
, ".objc_sel_name");
3881 for (TypedSelector
&sel
: table
[untypedSel
]) {
3882 llvm::Constant
*selectorTypeEncoding
= NULLPtr
;
3883 if (!sel
.first
.empty())
3884 selectorTypeEncoding
=
3885 MakeConstantString(sel
.first
, ".objc_sel_types");
3887 auto selStruct
= selectors
.beginStruct(selStructTy
);
3888 selStruct
.add(selName
);
3889 selStruct
.add(selectorTypeEncoding
);
3890 selStruct
.finishAndAddTo(selectors
);
3892 // Store the selector alias for later replacement
3893 selectorAliases
.push_back(sel
.second
);
3897 // Remember the number of entries in the selector table.
3898 selectorCount
= selectors
.size();
3900 // NULL-terminate the selector list. This should not actually be required,
3901 // because the selector list has a length field. Unfortunately, the GCC
3902 // runtime decides to ignore the length field and expects a NULL terminator,
3903 // and GCC cooperates with this by always setting the length to 0.
3904 auto selStruct
= selectors
.beginStruct(selStructTy
);
3905 selStruct
.add(NULLPtr
);
3906 selStruct
.add(NULLPtr
);
3907 selStruct
.finishAndAddTo(selectors
);
3909 return selectors
.finishAndCreateGlobal(".objc_selector_list",
3910 CGM
.getPointerAlign());
3913 // Now that all of the static selectors exist, create pointers to them.
3914 for (unsigned i
= 0; i
< selectorCount
; ++i
) {
3915 llvm::Constant
*idxs
[] = {
3917 llvm::ConstantInt::get(Int32Ty
, i
)
3919 // FIXME: We're generating redundant loads and stores here!
3920 llvm::Constant
*selPtr
= llvm::ConstantExpr::getGetElementPtr(
3921 selectorList
->getValueType(), selectorList
, idxs
);
3922 selectorAliases
[i
]->replaceAllUsesWith(selPtr
);
3923 selectorAliases
[i
]->eraseFromParent();
3926 llvm::GlobalVariable
*symtab
= [&] {
3927 ConstantInitBuilder
builder(CGM
);
3928 auto symtab
= builder
.beginStruct();
3930 // Number of static selectors
3931 symtab
.addInt(LongTy
, selectorCount
);
3933 symtab
.add(selectorList
);
3935 // Number of classes defined.
3936 symtab
.addInt(CGM
.Int16Ty
, Classes
.size());
3937 // Number of categories defined
3938 symtab
.addInt(CGM
.Int16Ty
, Categories
.size());
3940 // Create an array of classes, then categories, then static object instances
3941 auto classList
= symtab
.beginArray(PtrToInt8Ty
);
3942 classList
.addAll(Classes
);
3943 classList
.addAll(Categories
);
3944 // NULL-terminated list of static object instances (mainly constant strings)
3945 classList
.add(statics
);
3946 classList
.add(NULLPtr
);
3947 classList
.finishAndAddTo(symtab
);
3949 // Construct the symbol table.
3950 return symtab
.finishAndCreateGlobal("", CGM
.getPointerAlign());
3953 // The symbol table is contained in a module which has some version-checking
3955 llvm::Constant
*module
= [&] {
3956 llvm::Type
*moduleEltTys
[] = {
3957 LongTy
, LongTy
, PtrToInt8Ty
, symtab
->getType(), IntTy
3959 llvm::StructType
*moduleTy
= llvm::StructType::get(
3960 CGM
.getLLVMContext(),
3961 ArrayRef(moduleEltTys
).drop_back(unsigned(RuntimeVersion
< 10)));
3963 ConstantInitBuilder
builder(CGM
);
3964 auto module
= builder
.beginStruct(moduleTy
);
3965 // Runtime version, used for ABI compatibility checking.
3966 module
.addInt(LongTy
, RuntimeVersion
);
3968 module
.addInt(LongTy
, CGM
.getDataLayout().getTypeStoreSize(moduleTy
));
3970 // The path to the source file where this module was declared
3971 SourceManager
&SM
= CGM
.getContext().getSourceManager();
3972 OptionalFileEntryRef mainFile
= SM
.getFileEntryRefForID(SM
.getMainFileID());
3974 (mainFile
->getDir().getName() + "/" + mainFile
->getName()).str();
3975 module
.add(MakeConstantString(path
, ".objc_source_file_name"));
3978 if (RuntimeVersion
>= 10) {
3979 switch (CGM
.getLangOpts().getGC()) {
3980 case LangOptions::GCOnly
:
3981 module
.addInt(IntTy
, 2);
3983 case LangOptions::NonGC
:
3984 if (CGM
.getLangOpts().ObjCAutoRefCount
)
3985 module
.addInt(IntTy
, 1);
3987 module
.addInt(IntTy
, 0);
3989 case LangOptions::HybridGC
:
3990 module
.addInt(IntTy
, 1);
3995 return module
.finishAndCreateGlobal("", CGM
.getPointerAlign());
3998 // Create the load function calling the runtime entry point with the module
4000 llvm::Function
* LoadFunction
= llvm::Function::Create(
4001 llvm::FunctionType::get(llvm::Type::getVoidTy(VMContext
), false),
4002 llvm::GlobalValue::InternalLinkage
, ".objc_load_function",
4004 llvm::BasicBlock
*EntryBB
=
4005 llvm::BasicBlock::Create(VMContext
, "entry", LoadFunction
);
4006 CGBuilderTy
Builder(CGM
, VMContext
);
4007 Builder
.SetInsertPoint(EntryBB
);
4009 llvm::FunctionType
*FT
=
4010 llvm::FunctionType::get(Builder
.getVoidTy(), module
->getType(), true);
4011 llvm::FunctionCallee Register
=
4012 CGM
.CreateRuntimeFunction(FT
, "__objc_exec_class");
4013 Builder
.CreateCall(Register
, module
);
4015 if (!ClassAliases
.empty()) {
4016 llvm::Type
*ArgTypes
[2] = {PtrTy
, PtrToInt8Ty
};
4017 llvm::FunctionType
*RegisterAliasTy
=
4018 llvm::FunctionType::get(Builder
.getVoidTy(),
4020 llvm::Function
*RegisterAlias
= llvm::Function::Create(
4022 llvm::GlobalValue::ExternalWeakLinkage
, "class_registerAlias_np",
4024 llvm::BasicBlock
*AliasBB
=
4025 llvm::BasicBlock::Create(VMContext
, "alias", LoadFunction
);
4026 llvm::BasicBlock
*NoAliasBB
=
4027 llvm::BasicBlock::Create(VMContext
, "no_alias", LoadFunction
);
4029 // Branch based on whether the runtime provided class_registerAlias_np()
4030 llvm::Value
*HasRegisterAlias
= Builder
.CreateICmpNE(RegisterAlias
,
4031 llvm::Constant::getNullValue(RegisterAlias
->getType()));
4032 Builder
.CreateCondBr(HasRegisterAlias
, AliasBB
, NoAliasBB
);
4034 // The true branch (has alias registration function):
4035 Builder
.SetInsertPoint(AliasBB
);
4036 // Emit alias registration calls:
4037 for (std::vector
<ClassAliasPair
>::iterator iter
= ClassAliases
.begin();
4038 iter
!= ClassAliases
.end(); ++iter
) {
4039 llvm::Constant
*TheClass
=
4040 TheModule
.getGlobalVariable("_OBJC_CLASS_" + iter
->first
, true);
4042 Builder
.CreateCall(RegisterAlias
,
4043 {TheClass
, MakeConstantString(iter
->second
)});
4047 Builder
.CreateBr(NoAliasBB
);
4049 // Missing alias registration function, just return from the function:
4050 Builder
.SetInsertPoint(NoAliasBB
);
4052 Builder
.CreateRetVoid();
4054 return LoadFunction
;
4057 llvm::Function
*CGObjCGNU::GenerateMethod(const ObjCMethodDecl
*OMD
,
4058 const ObjCContainerDecl
*CD
) {
4059 CodeGenTypes
&Types
= CGM
.getTypes();
4060 llvm::FunctionType
*MethodTy
=
4061 Types
.GetFunctionType(Types
.arrangeObjCMethodDeclaration(OMD
));
4063 bool isDirect
= OMD
->isDirectMethod();
4064 std::string FunctionName
=
4065 getSymbolNameForMethod(OMD
, /*include category*/ !isDirect
);
4068 return llvm::Function::Create(MethodTy
,
4069 llvm::GlobalVariable::InternalLinkage
,
4070 FunctionName
, &TheModule
);
4072 auto *COMD
= OMD
->getCanonicalDecl();
4073 auto I
= DirectMethodDefinitions
.find(COMD
);
4074 llvm::Function
*OldFn
= nullptr, *Fn
= nullptr;
4076 if (I
== DirectMethodDefinitions
.end()) {
4078 llvm::Function::Create(MethodTy
, llvm::GlobalVariable::ExternalLinkage
,
4079 FunctionName
, &TheModule
);
4080 DirectMethodDefinitions
.insert(std::make_pair(COMD
, F
));
4084 // Objective-C allows for the declaration and implementation types
4085 // to differ slightly.
4087 // If we're being asked for the Function associated for a method
4088 // implementation, a previous value might have been cached
4089 // based on the type of the canonical declaration.
4091 // If these do not match, then we'll replace this function with
4092 // a new one that has the proper type below.
4093 if (!OMD
->getBody() || COMD
->getReturnType() == OMD
->getReturnType())
4097 Fn
= llvm::Function::Create(MethodTy
, llvm::GlobalValue::ExternalLinkage
, "",
4099 Fn
->takeName(OldFn
);
4100 OldFn
->replaceAllUsesWith(Fn
);
4101 OldFn
->eraseFromParent();
4103 // Replace the cached function in the map.
4108 void CGObjCGNU::GenerateDirectMethodPrologue(CodeGenFunction
&CGF
,
4110 const ObjCMethodDecl
*OMD
,
4111 const ObjCContainerDecl
*CD
) {
4112 // GNU runtime doesn't support direct calls at this time
4115 llvm::FunctionCallee
CGObjCGNU::GetPropertyGetFunction() {
4116 return GetPropertyFn
;
4119 llvm::FunctionCallee
CGObjCGNU::GetPropertySetFunction() {
4120 return SetPropertyFn
;
4123 llvm::FunctionCallee
CGObjCGNU::GetOptimizedPropertySetFunction(bool atomic
,
4128 llvm::FunctionCallee
CGObjCGNU::GetGetStructFunction() {
4129 return GetStructPropertyFn
;
4132 llvm::FunctionCallee
CGObjCGNU::GetSetStructFunction() {
4133 return SetStructPropertyFn
;
4136 llvm::FunctionCallee
CGObjCGNU::GetCppAtomicObjectGetFunction() {
4140 llvm::FunctionCallee
CGObjCGNU::GetCppAtomicObjectSetFunction() {
4144 llvm::FunctionCallee
CGObjCGNU::EnumerationMutationFunction() {
4145 return EnumerationMutationFn
;
4148 void CGObjCGNU::EmitSynchronizedStmt(CodeGenFunction
&CGF
,
4149 const ObjCAtSynchronizedStmt
&S
) {
4150 EmitAtSynchronizedStmt(CGF
, S
, SyncEnterFn
, SyncExitFn
);
4154 void CGObjCGNU::EmitTryStmt(CodeGenFunction
&CGF
,
4155 const ObjCAtTryStmt
&S
) {
4156 // Unlike the Apple non-fragile runtimes, which also uses
4157 // unwind-based zero cost exceptions, the GNU Objective C runtime's
4158 // EH support isn't a veneer over C++ EH. Instead, exception
4159 // objects are created by objc_exception_throw and destroyed by
4160 // the personality function; this avoids the need for bracketing
4161 // catch handlers with calls to __blah_begin_catch/__blah_end_catch
4162 // (or even _Unwind_DeleteException), but probably doesn't
4163 // interoperate very well with foreign exceptions.
4165 // In Objective-C++ mode, we actually emit something equivalent to the C++
4166 // exception handler.
4167 EmitTryCatchStmt(CGF
, S
, EnterCatchFn
, ExitCatchFn
, ExceptionReThrowFn
);
4170 void CGObjCGNU::EmitThrowStmt(CodeGenFunction
&CGF
,
4171 const ObjCAtThrowStmt
&S
,
4172 bool ClearInsertionPoint
) {
4173 llvm::Value
*ExceptionAsObject
;
4174 bool isRethrow
= false;
4176 if (const Expr
*ThrowExpr
= S
.getThrowExpr()) {
4177 llvm::Value
*Exception
= CGF
.EmitObjCThrowOperand(ThrowExpr
);
4178 ExceptionAsObject
= Exception
;
4180 assert((!CGF
.ObjCEHValueStack
.empty() && CGF
.ObjCEHValueStack
.back()) &&
4181 "Unexpected rethrow outside @catch block.");
4182 ExceptionAsObject
= CGF
.ObjCEHValueStack
.back();
4185 if (isRethrow
&& (usesSEHExceptions
|| usesCxxExceptions
)) {
4186 // For SEH, ExceptionAsObject may be undef, because the catch handler is
4187 // not passed it for catchalls and so it is not visible to the catch
4188 // funclet. The real thrown object will still be live on the stack at this
4189 // point and will be rethrown. If we are explicitly rethrowing the object
4190 // that was passed into the `@catch` block, then this code path is not
4191 // reached and we will instead call `objc_exception_throw` with an explicit
4193 llvm::CallBase
*Throw
= CGF
.EmitRuntimeCallOrInvoke(ExceptionReThrowFn
);
4194 Throw
->setDoesNotReturn();
4196 ExceptionAsObject
= CGF
.Builder
.CreateBitCast(ExceptionAsObject
, IdTy
);
4197 llvm::CallBase
*Throw
=
4198 CGF
.EmitRuntimeCallOrInvoke(ExceptionThrowFn
, ExceptionAsObject
);
4199 Throw
->setDoesNotReturn();
4201 CGF
.Builder
.CreateUnreachable();
4202 if (ClearInsertionPoint
)
4203 CGF
.Builder
.ClearInsertionPoint();
4206 llvm::Value
* CGObjCGNU::EmitObjCWeakRead(CodeGenFunction
&CGF
,
4207 Address AddrWeakObj
) {
4208 CGBuilderTy
&B
= CGF
.Builder
;
4209 return B
.CreateCall(
4210 WeakReadFn
, EnforceType(B
, AddrWeakObj
.emitRawPointer(CGF
), PtrToIdTy
));
4213 void CGObjCGNU::EmitObjCWeakAssign(CodeGenFunction
&CGF
,
4214 llvm::Value
*src
, Address dst
) {
4215 CGBuilderTy
&B
= CGF
.Builder
;
4216 src
= EnforceType(B
, src
, IdTy
);
4217 llvm::Value
*dstVal
= EnforceType(B
, dst
.emitRawPointer(CGF
), PtrToIdTy
);
4218 B
.CreateCall(WeakAssignFn
, {src
, dstVal
});
4221 void CGObjCGNU::EmitObjCGlobalAssign(CodeGenFunction
&CGF
,
4222 llvm::Value
*src
, Address dst
,
4224 CGBuilderTy
&B
= CGF
.Builder
;
4225 src
= EnforceType(B
, src
, IdTy
);
4226 llvm::Value
*dstVal
= EnforceType(B
, dst
.emitRawPointer(CGF
), PtrToIdTy
);
4227 // FIXME. Add threadloca assign API
4228 assert(!threadlocal
&& "EmitObjCGlobalAssign - Threal Local API NYI");
4229 B
.CreateCall(GlobalAssignFn
, {src
, dstVal
});
4232 void CGObjCGNU::EmitObjCIvarAssign(CodeGenFunction
&CGF
,
4233 llvm::Value
*src
, Address dst
,
4234 llvm::Value
*ivarOffset
) {
4235 CGBuilderTy
&B
= CGF
.Builder
;
4236 src
= EnforceType(B
, src
, IdTy
);
4237 llvm::Value
*dstVal
= EnforceType(B
, dst
.emitRawPointer(CGF
), IdTy
);
4238 B
.CreateCall(IvarAssignFn
, {src
, dstVal
, ivarOffset
});
4241 void CGObjCGNU::EmitObjCStrongCastAssign(CodeGenFunction
&CGF
,
4242 llvm::Value
*src
, Address dst
) {
4243 CGBuilderTy
&B
= CGF
.Builder
;
4244 src
= EnforceType(B
, src
, IdTy
);
4245 llvm::Value
*dstVal
= EnforceType(B
, dst
.emitRawPointer(CGF
), PtrToIdTy
);
4246 B
.CreateCall(StrongCastAssignFn
, {src
, dstVal
});
4249 void CGObjCGNU::EmitGCMemmoveCollectable(CodeGenFunction
&CGF
,
4252 llvm::Value
*Size
) {
4253 CGBuilderTy
&B
= CGF
.Builder
;
4254 llvm::Value
*DestPtrVal
= EnforceType(B
, DestPtr
.emitRawPointer(CGF
), PtrTy
);
4255 llvm::Value
*SrcPtrVal
= EnforceType(B
, SrcPtr
.emitRawPointer(CGF
), PtrTy
);
4257 B
.CreateCall(MemMoveFn
, {DestPtrVal
, SrcPtrVal
, Size
});
4260 llvm::GlobalVariable
*CGObjCGNU::ObjCIvarOffsetVariable(
4261 const ObjCInterfaceDecl
*ID
,
4262 const ObjCIvarDecl
*Ivar
) {
4263 const std::string Name
= GetIVarOffsetVariableName(ID
, Ivar
);
4264 // Emit the variable and initialize it with what we think the correct value
4265 // is. This allows code compiled with non-fragile ivars to work correctly
4266 // when linked against code which isn't (most of the time).
4267 llvm::GlobalVariable
*IvarOffsetPointer
= TheModule
.getNamedGlobal(Name
);
4268 if (!IvarOffsetPointer
)
4269 IvarOffsetPointer
= new llvm::GlobalVariable(
4270 TheModule
, llvm::PointerType::getUnqual(VMContext
), false,
4271 llvm::GlobalValue::ExternalLinkage
, nullptr, Name
);
4272 return IvarOffsetPointer
;
4275 LValue
CGObjCGNU::EmitObjCValueForIvar(CodeGenFunction
&CGF
,
4277 llvm::Value
*BaseValue
,
4278 const ObjCIvarDecl
*Ivar
,
4279 unsigned CVRQualifiers
) {
4280 const ObjCInterfaceDecl
*ID
=
4281 ObjectTy
->castAs
<ObjCObjectType
>()->getInterface();
4282 return EmitValueForIvarAtOffset(CGF
, ID
, BaseValue
, Ivar
, CVRQualifiers
,
4283 EmitIvarOffset(CGF
, ID
, Ivar
));
4286 static const ObjCInterfaceDecl
*FindIvarInterface(ASTContext
&Context
,
4287 const ObjCInterfaceDecl
*OID
,
4288 const ObjCIvarDecl
*OIVD
) {
4289 for (const ObjCIvarDecl
*next
= OID
->all_declared_ivar_begin(); next
;
4290 next
= next
->getNextIvar()) {
4295 // Otherwise check in the super class.
4296 if (const ObjCInterfaceDecl
*Super
= OID
->getSuperClass())
4297 return FindIvarInterface(Context
, Super
, OIVD
);
4302 llvm::Value
*CGObjCGNU::EmitIvarOffset(CodeGenFunction
&CGF
,
4303 const ObjCInterfaceDecl
*Interface
,
4304 const ObjCIvarDecl
*Ivar
) {
4305 if (CGM
.getLangOpts().ObjCRuntime
.isNonFragile()) {
4306 Interface
= FindIvarInterface(CGM
.getContext(), Interface
, Ivar
);
4308 // The MSVC linker cannot have a single global defined as LinkOnceAnyLinkage
4309 // and ExternalLinkage, so create a reference to the ivar global and rely on
4310 // the definition being created as part of GenerateClass.
4311 if (RuntimeVersion
< 10 ||
4312 CGF
.CGM
.getTarget().getTriple().isKnownWindowsMSVCEnvironment())
4313 return CGF
.Builder
.CreateZExtOrBitCast(
4314 CGF
.Builder
.CreateAlignedLoad(
4316 CGF
.Builder
.CreateAlignedLoad(
4317 llvm::PointerType::getUnqual(VMContext
),
4318 ObjCIvarOffsetVariable(Interface
, Ivar
),
4319 CGF
.getPointerAlign(), "ivar"),
4320 CharUnits::fromQuantity(4)),
4322 std::string name
= "__objc_ivar_offset_value_" +
4323 Interface
->getNameAsString() +"." + Ivar
->getNameAsString();
4324 CharUnits Align
= CGM
.getIntAlign();
4325 llvm::Value
*Offset
= TheModule
.getGlobalVariable(name
);
4327 auto GV
= new llvm::GlobalVariable(TheModule
, IntTy
,
4328 false, llvm::GlobalValue::LinkOnceAnyLinkage
,
4329 llvm::Constant::getNullValue(IntTy
), name
);
4330 GV
->setAlignment(Align
.getAsAlign());
4333 Offset
= CGF
.Builder
.CreateAlignedLoad(IntTy
, Offset
, Align
);
4334 if (Offset
->getType() != PtrDiffTy
)
4335 Offset
= CGF
.Builder
.CreateZExtOrBitCast(Offset
, PtrDiffTy
);
4338 uint64_t Offset
= ComputeIvarBaseOffset(CGF
.CGM
, Interface
, Ivar
);
4339 return llvm::ConstantInt::get(PtrDiffTy
, Offset
, /*isSigned*/true);
4343 clang::CodeGen::CreateGNUObjCRuntime(CodeGenModule
&CGM
) {
4344 auto Runtime
= CGM
.getLangOpts().ObjCRuntime
;
4345 switch (Runtime
.getKind()) {
4346 case ObjCRuntime::GNUstep
:
4347 if (Runtime
.getVersion() >= VersionTuple(2, 0))
4348 return new CGObjCGNUstep2(CGM
);
4349 return new CGObjCGNUstep(CGM
);
4351 case ObjCRuntime::GCC
:
4352 return new CGObjCGCC(CGM
);
4354 case ObjCRuntime::ObjFW
:
4355 return new CGObjCObjFW(CGM
);
4357 case ObjCRuntime::FragileMacOSX
:
4358 case ObjCRuntime::MacOSX
:
4359 case ObjCRuntime::iOS
:
4360 case ObjCRuntime::WatchOS
:
4361 llvm_unreachable("these runtimes are not GNU runtimes");
4363 llvm_unreachable("bad runtime");