Improve Objective-C support (#4777)

* WIP: Objective-C support

* Further work on implementation

* ObjC dynamic cast

* Add swift stub class attribute

* Classes, protocols and ivars

* Fix compilation issues

* Fix objc ir codegen

* Add objc linker option

* Add swift stub classref get ir gen

* Minor cleanup

* Fix objc link flag being added on non-darwin platforms

* Refactor objc gen

* remove use of std::nullopt

* Emit protocol tables

* Remove unused variable

* Formatting

* Fix build in release mode. Thanks for nothing, c++.

* Fix consistency

* Fix dynamic casts

* Fix tocall parentfd ref and arm msgsend call

* Make instance variables work

* Implicitly add isa pointer to objc classes.

* Fix protocol referencing & allow pragma mangle

* Fix protocol linkage

* Fix direct call support

* always generate var type for methods

* Fix test 16096a

* Fix extern ivar symbol gen, retain method decls

* Remove arm32 and x86 support

* Check method and ivar info before pushing to member list

* Make ObjcMethod info untyped.

* Make ivar and method gen more robust

* Generate optional protocol symbols

* Use bitcasting instead of creating multiple type defs

* Fix invalid protocol list struct gen

* More codegen robustness

* emit protocol table as const

* Make protocol table anon struct

* Fix callable type, generate protocol_list_t properly.

* Cast vthis to argtype

* Handle protorefs and classrefs properly

* seperate label ref and deref

* Fix method lookup

* Enable objective-c tests

* Enable objc_call_static test

* Scan both classes and protocols for method ref

* Enable objective-c tests on arm as well.

* supress objc linker warning in tests

* Fix class and protocol gen structure

* Fix objc_protocol_sections test

* ObjcMethod only get callee for functions with bodies

* Fix protocol class method gen

* Make ObjcMethod anon again

* Fix missing emit calls

* Fix classref gen

* Implement some of the requested changes

* Enable compilable tests

* Fix property selector gen, ugly hack for final funcs.

* Fix segfault in referencing fd->type

* Refactor implementation

* Fix null references in class and method lookup

* include unordered_map

* Get functionality on-par with prev impl.

* Fix super context calls

* Move -L-w flag to d_do_test and use IN_LLVM in objc.d/h

* add LDC version tag to -L-w flag

* Update CHANGELOG.md
This commit is contained in:
Luna 2024-12-03 04:26:27 +01:00 committed by GitHub
parent a1e694c16b
commit 82878ef32c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
42 changed files with 1568 additions and 195 deletions

View file

@ -140,16 +140,31 @@ llvm::FunctionType *DtoFunctionType(Type *type, IrFuncTy &irFty, Type *thistype,
}
bool hasObjCSelector = false;
if (fd && fd->_linkage == LINK::objc && thistype) {
if (fd && fd->_linkage == LINK::objc) {
auto ftype = (TypeFunction*)fd->type;
if (fd->objc.selector) {
hasObjCSelector = true;
} else if (fd->parent->isClassDeclaration()) {
error(fd->loc, "%s `%s` is missing Objective-C `@selector`", fd->kind(),
fd->toPrettyChars());
if(fd->isFinal() || ftype->isproperty()) {
// HACK: Ugly hack, but final functions for some reason don't actually declare a selector.
// However, this does make it more flexible.
// Also this will automatically generate selectors for @property declared
// functions, which the DIP specifies.
// Final function selector gen should be fixed, however.
fd->objc.selector = ObjcSelector::create(fd);
hasObjCSelector = true;
} else {
error(fd->loc, "%s `%s` is missing Objective-C `@selector`", fd->kind(),
fd->toPrettyChars());
}
}
}
if (hasObjCSelector) {
// TODO: make arg_objcselector to match dmd type
// SEL is in libobjc an opaque pointer.
// As such a void* is fine.
newIrFty.arg_objcSelector = new IrFuncTyArg(Type::tvoidptr, false);
++nextLLArgIdx;
}