blob: 4065e4a7eb2a2a944efdfe2434caf510bf09176f [file] [log] [blame]
// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/snapshot/embedded/platform-embedded-file-writer-aix.h"
#include "src/objects/code.h"
namespace v8 {
namespace internal {
#define SYMBOL_PREFIX ""
namespace {
const char* DirectiveAsString(DataDirective directive) {
switch (directive) {
case kByte:
return ".byte";
case kLong:
return ".long";
case kQuad:
return ".llong";
default:
UNREACHABLE();
}
}
} // namespace
void PlatformEmbeddedFileWriterAIX::SectionText() {
fprintf(fp_, ".csect .text[PR]\n");
}
void PlatformEmbeddedFileWriterAIX::SectionData() {
fprintf(fp_, ".csect .data[RW]\n");
}
void PlatformEmbeddedFileWriterAIX::SectionRoData() {
fprintf(fp_, ".csect[RO]\n");
}
void PlatformEmbeddedFileWriterAIX::DeclareUint32(const char* name,
uint32_t value) {
DeclareSymbolGlobal(name);
fprintf(fp_, ".align 2\n");
fprintf(fp_, "%s:\n", name);
IndentedDataDirective(kLong);
fprintf(fp_, "%d\n", value);
Newline();
}
void PlatformEmbeddedFileWriterAIX::DeclarePointerToSymbol(const char* name,
const char* target) {
AlignToCodeAlignment();
DeclareLabel(name);
fprintf(fp_, " %s %s\n", DirectiveAsString(PointerSizeDirective()), target);
Newline();
}
void PlatformEmbeddedFileWriterAIX::DeclareSymbolGlobal(const char* name) {
// These symbols are not visible outside of the final binary, this allows for
// reduced binary size, and less work for the dynamic linker.
fprintf(fp_, ".globl %s, hidden\n", name);
}
void PlatformEmbeddedFileWriterAIX::AlignToCodeAlignment() {
STATIC_ASSERT((1 << 5) >= kCodeAlignment);
fprintf(fp_, ".align 5\n");
}
void PlatformEmbeddedFileWriterAIX::AlignToDataAlignment() {
STATIC_ASSERT((1 << 3) >= Code::kMetadataAlignment);
fprintf(fp_, ".align 3\n");
}
void PlatformEmbeddedFileWriterAIX::Comment(const char* string) {
fprintf(fp_, "// %s\n", string);
}
void PlatformEmbeddedFileWriterAIX::DeclareLabel(const char* name) {
// .global is required on AIX, if the label is used/referenced in another file
// later to be linked.
fprintf(fp_, ".globl %s\n", name);
fprintf(fp_, "%s:\n", name);
}
void PlatformEmbeddedFileWriterAIX::SourceInfo(int fileid, const char* filename,
int line) {
fprintf(fp_, ".xline %d, \"%s\"\n", line, filename);
}
// TODO(mmarchini): investigate emitting size annotations for AIX
void PlatformEmbeddedFileWriterAIX::DeclareFunctionBegin(const char* name,
uint32_t size) {
Newline();
if (ENABLE_CONTROL_FLOW_INTEGRITY_BOOL) {
DeclareSymbolGlobal(name);
}
fprintf(fp_, ".csect %s[DS]\n", name); // function descriptor
fprintf(fp_, "%s:\n", name);
fprintf(fp_, ".llong .%s, 0, 0\n", name);
SectionText();
fprintf(fp_, ".%s:\n", name);
}
void PlatformEmbeddedFileWriterAIX::DeclareFunctionEnd(const char* name) {}
void PlatformEmbeddedFileWriterAIX::FilePrologue() {}
void PlatformEmbeddedFileWriterAIX::DeclareExternalFilename(
int fileid, const char* filename) {
// File name cannot be declared with an identifier on AIX.
// We use the SourceInfo method to emit debug info in
//.xline <line-number> <file-name> format.
}
void PlatformEmbeddedFileWriterAIX::FileEpilogue() {}
int PlatformEmbeddedFileWriterAIX::IndentedDataDirective(
DataDirective directive) {
return fprintf(fp_, " %s ", DirectiveAsString(directive));
}
DataDirective PlatformEmbeddedFileWriterAIX::ByteChunkDataDirective() const {
// PPC uses a fixed 4 byte instruction set, using .long
// to prevent any unnecessary padding.
return kLong;
}
#undef SYMBOL_PREFIX
} // namespace internal
} // namespace v8