blob: cd570132cdc0ae171d36d825381f9fa230b81099 [file] [log] [blame]
//===--- ObjectFile.h - Object File Related Information ------*- C++ -*-===//
//
// Object File related data structures.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_ABI_OBJECTFILE_H
#define SWIFT_ABI_OBJECTFILE_H
#include "llvm/Support/ErrorHandling.h"
#include "llvm/ADT/StringRef.h"
namespace swift {
/// Represents the six reflection sections used by Swift
enum ReflectionSectionKind : uint8_t {
fieldmd,
assocty,
builtin,
capture,
typeref,
reflstr
};
/// Abstract base class responsible for providing the correct reflection section
/// string identifier for a given object file type (Mach-O, ELF, COFF).
class SwiftObjectFileFormat {
public:
virtual ~SwiftObjectFileFormat() {}
virtual llvm::StringRef getSectionName(ReflectionSectionKind section) = 0;
};
/// Responsible for providing the Mach-O reflection section identifiers.
class SwiftObjectFileFormatMachO : SwiftObjectFileFormat {
public:
llvm::StringRef getSectionName(ReflectionSectionKind section) override {
switch (section) {
case fieldmd:
return "__swift5_fieldmd";
case assocty:
return "__swift5_assocty";
case builtin:
return "__swift5_builtin";
case capture:
return "__swift5_capture";
case typeref:
return "__swift5_typeref";
case reflstr:
return "__swift5_reflstr";
}
llvm_unreachable("Section type not found.");
}
};
/// Responsible for providing the ELF reflection section identifiers.
class SwiftObjectFileFormatELF : SwiftObjectFileFormat {
public:
llvm::StringRef getSectionName(ReflectionSectionKind section) override {
switch (section) {
case fieldmd:
return "swift5_fieldmd";
case assocty:
return "swift5_assocty";
case builtin:
return "swift5_builtin";
case capture:
return "swift5_capture";
case typeref:
return "swift5_typeref";
case reflstr:
return "swift5_reflstr";
}
llvm_unreachable("Section type not found.");
}
};
/// Responsible for providing the COFF reflection section identifiers
class SwiftObjectFileFormatCOFF : SwiftObjectFileFormat {
public:
llvm::StringRef getSectionName(ReflectionSectionKind section) override {
switch (section) {
case fieldmd:
return ".sw5flmd";
case assocty:
return ".sw5asty";
case builtin:
return ".sw5bltn";
case capture:
return ".sw5cptr";
case typeref:
return ".sw5tyrf";
case reflstr:
return ".sw5rfst";
}
llvm_unreachable("Section not found.");
}
};
} // namespace swift
#endif // SWIFT_ABI_OBJECTFILE_H