skip the ffi
play

Skip the FFI! Embedding Clang for C Interoperability Jordan Rose - PowerPoint PPT Presentation

Skip the FFI! Embedding Clang for C Interoperability Jordan Rose John McCall Compiler Engineer, Apple Compiler Engineer, Apple Problem Problem Languages dont exist in a vacuum Problem Languages dont exist in a vacuum But C has its


  1. Importing Clang Modules What if two modules conflict? CompilerInstance::loadModule Look up the decls we want • Use TU-wide lookup and filter OldLibrary NewLibrary … … typedef unsigned status_t ; typedef enum {…} status_t ; … …

  2. Importing Declarations static inline 
 Point2f flipOverXAxis (Point2f point) { 
 // ... 
 }

  3. Importing Declarations clang::FunctionDecl Point2f flipOverXAxis (Point2f point)

  4. Importing Declarations clang::FunctionDecl Point2f flipOverXAxis (Point2f point) clang::TypedefDecl typedef … Point2f

  5. Importing Declarations clang::FunctionDecl Point2f flipOverXAxis (Point2f point) clang::TypedefDecl typedef … Point2f clang::StructDecl struct [anonymous] { … }

  6. Importing Declarations clang::FunctionDecl Point2f flipOverXAxis (Point2f point) clang::TypedefDecl typedef … Point2f clang::StructDecl struct [anonymous] { … } clang::FieldDecl float x

  7. Importing Declarations clang::FunctionDecl Point2f flipOverXAxis (Point2f point) clang::TypedefDecl typedef … Point2f clang::StructDecl struct [anonymous] { … } clang::FieldDecl clang::FieldDecl float x float y

  8. Importing Declarations clang::FunctionDecl Point2f flipOverXAxis (Point2f point) clang::TypedefDecl typedef … Point2f clang::StructDecl struct [anonymous] { … } clang::FieldDecl clang::FieldDecl float x float y

  9. Importing Declarations …using clang::ASTVisitor flipOverXAxis (…) typedef … Point2f struct {…} float x float y

  10. Importing Declarations …using clang::ASTVisitor flipOverXAxis (…) typedef … Point2f struct {…} float x float y

  11. Importing Declarations …using clang::ASTVisitor flipOverXAxis (…) typedef … Point2f struct {…} float x float y

  12. Importing Declarations …using clang::ASTVisitor flipOverXAxis (…) typedef … Point2f struct {…} float x float y

  13. Importing Declarations …using clang::ASTVisitor flipOverXAxis (…) typedef … Point2f struct {…} float x float y

  14. Importing Declarations …using clang::ASTVisitor flipOverXAxis (…) typedef … Point2f struct {…} float x var x : Float float y

  15. Importing Declarations …using clang::ASTVisitor flipOverXAxis (…) typedef … Point2f struct {…} float x var x : Float float y var y : Float

  16. Importing Declarations …using clang::ASTVisitor flipOverXAxis (…) typedef … Point2f struct {…} float x var x : Float float y var y : Float

  17. Importing Declarations …using clang::ASTVisitor flipOverXAxis (…) typedef … Point2f struct {…} struct _ float x var x : Float float y var y : Float

  18. Importing Declarations …using clang::ASTVisitor flipOverXAxis (…) typedef … Point2f struct {…} struct _ float x var x : Float float y var y : Float

  19. Importing Declarations …using clang::ASTVisitor flipOverXAxis (…) typedef … Point2f typealias Point2f struct {…} struct _ float x var x : Float float y var y : Float

  20. Importing Declarations …using clang::ASTVisitor flipOverXAxis (…) typedef … Point2f typealias Point2f struct {…} struct _ float x var x : Float float y var y : Float

  21. Importing Declarations …using clang::ASTVisitor flipOverXAxis (…) func flipOverXAxis typedef … Point2f typealias Point2f struct {…} struct _ float x var x : Float float y var y : Float

  22. Importing Declarations …using clang::ASTVisitor flipOverXAxis (…) func flipOverXAxis typedef … Point2f struct Point2f struct {…} float x var x : Float float y var y : Float

  23. Success! swift::FuncDecl flipOverXAxis Arguments: (Point2f) Returns: Point2f clang::FunctionDecl Point2f flipOverXAxis (Point2f point)

  24. …and back to C

  25. ABIs

  26. Platforms and ABIs Every language/platform combination forms an ABI ABI defines how the language is implemented on that platform Necessary for interoperation: ...between compilers o ff ered by di ff erent vendors ...between di ff erent versions of the same compiler ...between compiled code and hand-written code (e.g. in assembly) ...between compiled code and various inspection/instrumentation tools

  27. ABIs for other languages All languages/extensions supported by Clang have ABIs defined mostly in terms of C Caveat: often require additional linker support Caveat: sometimes use slightly di ff erent calling conventions "Itanium" C++ ABI: weak linkage Visual Studio C++ ABI: weak linkage, di ff erent CC for member functions GNUStep Objective-C ABI: pure C Apple Objective-C ABI: some Apple-specific linker behavior Objective-C Blocks ABI: pure C

  28. ABIs for C Often written by the architecture vendor and then tweaked by the OS vendor Includes: Stack alignment rules Calling conventions and register use rules Size/alignment of fundamental types Layout rules for structs and unions Existence of various extended types Object file structure and linker behavior Guaranteed runtime facilities ...and a whole lot more

  29. ABIs and undefined behavior An ABI doesn't mean language-specific restrictions aren't still in e ff ect! struct A { virtual void foo(); }; void *loadVTable(A *a) { return *reinterpret_cast<void**>(a); } Still undefined behavior

  30. Memory

  31. Working with C values in memory Often need to allocate storage for C values All complete types in C have an ABI size and alignment: getASTContext().getTypeInfoInChars(someType) For normal types, sizeof(T) is always a multiple of alignof(T) ...but attributes on typedefs can arbitrarily change alignment requirements

  32. Storage Padding For many types, sizeof includes some extra storage: struct Foo { void *x; void *x; long double x; long double d; char c; }; char c; Contents are undefined: not required to preserve those bits If you share pointers with C code, it won't promise to preserve them either Special case: C99 _Bool / C++ bool are always stored as 0 or 1 (not necessarily 1 byte)

  33. struct/union Layout Often tempting to do your own C struct layout: struct Foo { %struct.Foo = { void *x; opaque*, long double d; x86_fp80, char c; i8 }; }

  34. struct/union Layout Often tempting to do your own C struct layout: struct Foo { %struct.Foo = { void *x; opaque*, long double d; x86_fp80, char c; i8 }; } It's a trap!

  35. struct/union Layout C/C++ language guarantees: All union members have same address First struct member has same address as struct Later struct member addresses > earlier struct member addresses

  36. Universal C Layout Algorithm struct.size = 0, struct.alignment = 1 for field in struct.fields: struct.size = roundUpToAlignment(struct.size, field.alignment) struct.alignment = max(struct.alignment, field.alignment) o ff sets[field] = struct.size struct.size += field.size struct.size = roundUpToAlignment(struct.size, alignment) Not guaranteed, but might as well be

  37. Universal C Layout Algorithm? Bitfield rules di ff er massively between platforms Many di ff erent attributes and pragmas a ff ect layout C++...

  38. Use Clang Type info for struct/union types reflects results of layout Can get o ff sets of individual members: ASTContext::getASTRecordLayout(const RecordDecl *D) IRGen provides interfaces for: lowering types to IR projecting the address of an ordinary field loading and storing to a bitfield

  39. Calls

  40. Calls

  41. Calls Lowering from Clang function types to LLVM function types

  42. Calls Lowering from Clang function types to LLVM function types Inputs: AST calling convention, parameter types, return type

  43. Calls Lowering from Clang function types to LLVM function types Inputs: AST calling convention, parameter types, return type Outputs: LLVM calling convention, parameter types, return type, parameter attributes

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend