Files
swift-mirror/stdlib/public/runtime/SwiftRT-COFF.cpp
Saleem Abdulrasool 76d7bfd8ed runtime: ensure that the module constructor element is RO
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`.
2018-02-02 15:01:44 -08:00

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(&sections);
}
#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)))