mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
The default attribute on the section is read/write. This would cause the section to have different attributes when compiled. The linker would then preserve the section rather than merge it into the right location. This was noticed when linking with `link.exe`.
84 lines
2.6 KiB
C++
84 lines
2.6 KiB
C++
//===--- SwiftRT-COFF.cpp -------------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "ImageInspectionCOFF.h"
|
|
|
|
#include <cstdint>
|
|
|
|
#define PASTE_EXPANDED(a,b) a##b
|
|
#define PASTE(a,b) PASTE_EXPANDED(a,b)
|
|
|
|
#define STRING_EXPANDED(string) #string
|
|
#define STRING(string) STRING_EXPANDED(string)
|
|
|
|
#define C_LABEL(name) PASTE(__USER_LABEL_PREFIX__,name)
|
|
|
|
#define PRAGMA(pragma) _Pragma(#pragma)
|
|
|
|
#define DECLARE_SWIFT_SECTION(name) \
|
|
PRAGMA(section("." #name "$A", long, read)) \
|
|
__declspec(allocate("." #name "$A")) \
|
|
static uintptr_t __start_##name = 0; \
|
|
\
|
|
PRAGMA(section("." #name "$C", long, read)) \
|
|
__declspec(allocate("." #name "$C")) \
|
|
static uintptr_t __stop_##name = 0;
|
|
|
|
extern "C" {
|
|
DECLARE_SWIFT_SECTION(sw5prt)
|
|
DECLARE_SWIFT_SECTION(sw5prtc)
|
|
DECLARE_SWIFT_SECTION(sw5tymd)
|
|
|
|
DECLARE_SWIFT_SECTION(sw5tyrf)
|
|
DECLARE_SWIFT_SECTION(sw5rfst)
|
|
DECLARE_SWIFT_SECTION(sw5flmd)
|
|
DECLARE_SWIFT_SECTION(sw5asty)
|
|
}
|
|
|
|
namespace {
|
|
static swift::MetadataSections sections{};
|
|
}
|
|
|
|
static void swift_image_constructor() {
|
|
#define SWIFT_SECTION_RANGE(name) \
|
|
{ reinterpret_cast<uintptr_t>(&__start_##name) + sizeof(__start_##name), \
|
|
reinterpret_cast<uintptr_t>(&__stop_##name) - reinterpret_cast<uintptr_t>(&__start_##name) - sizeof(__start_##name) }
|
|
|
|
sections = {
|
|
swift::CurrentSectionMetadataVersion,
|
|
0,
|
|
|
|
nullptr,
|
|
nullptr,
|
|
|
|
SWIFT_SECTION_RANGE(sw5prt),
|
|
SWIFT_SECTION_RANGE(sw5prtc),
|
|
SWIFT_SECTION_RANGE(sw5tymd),
|
|
|
|
SWIFT_SECTION_RANGE(sw5tyrf),
|
|
SWIFT_SECTION_RANGE(sw5rfst),
|
|
SWIFT_SECTION_RANGE(sw5flmd),
|
|
SWIFT_SECTION_RANGE(sw5asty),
|
|
};
|
|
|
|
#undef SWIFT_SECTION_RANGE
|
|
|
|
swift_addNewDSOImage(§ions);
|
|
}
|
|
|
|
#pragma section(".CRT$XCIS", long, read)
|
|
|
|
__declspec(allocate(".CRT$XCIS"))
|
|
extern "C" void (*pSwiftImageConstructor)(void) = &swift_image_constructor;
|
|
#pragma comment(linker, "/include:" STRING(C_LABEL(pSwiftImageConstructor)))
|
|
|