v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
platform-embedded-file-writer-zos.cc
Go to the documentation of this file.
1// Copyright 2024 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
7#include <stdarg.h>
8
9#include <string>
10
11namespace v8 {
12namespace internal {
13
14// https://www.ibm.com/docs/en/zos/2.1.0?topic=conventions-continuation-lines
15// for length of HLASM statements and continuation.
16static constexpr int kAsmMaxLineLen = 71;
17static constexpr int kAsmContIndentLen = 15;
19
20namespace {
21int hlasmPrintLine(FILE* fp, const char* fmt, ...) {
22 int ret;
23 char buffer[4096];
24 int offset = 0;
25 static char indent[kAsmContIndentLen] = "";
26 va_list ap;
27 va_start(ap, fmt);
28 ret = vsnprintf(buffer, sizeof(buffer), fmt, ap);
29 va_end(ap);
30 if (!*indent) memset(indent, ' ', sizeof(indent));
31 if (ret > kAsmMaxLineLen && buffer[kAsmMaxLineLen] != '\n') {
32 offset += fwrite(buffer + offset, 1, kAsmMaxLineLen, fp);
33 // Write continuation mark
34 fwrite("-\n", 1, 2, fp);
35 ret -= kAsmMaxLineLen;
36 while (ret > kAsmContMaxLen) {
37 // indent by kAsmContIndentLen
38 fwrite(indent, 1, kAsmContIndentLen, fp);
39 offset += fwrite(buffer + offset, 1, kAsmContMaxLen, fp);
40 // write continuation mark
41 fwrite("-\n", 1, 2, fp);
42 ret -= kAsmContMaxLen;
43 }
44 if (ret > 0) {
45 // indent kAsmContIndentLen blanks
46 fwrite(indent, 1, kAsmContIndentLen, fp);
47 offset += fwrite(buffer + offset, 1, ret, fp);
48 }
49 } else {
50 offset += fwrite(buffer + offset, 1, ret, fp);
51 }
52 return ret;
53}
54} // namespace
55
57 fprintf(fp_,
58 "&suffix SETA &suffix+1\n"
59 "CEECWSA LOCTR\n"
60 "AL&suffix ALIAS C'%s'\n"
61 "C_WSA64 CATTR DEFLOAD,RMODE(64),PART(AL&suffix)\n"
62 "AL&suffix XATTR REF(DATA),LINKAGE(XPLINK),SCOPE(EXPORT)\n",
63 name);
64}
65
67 fprintf(fp_,
68 "C_WSA64 CATTR PART(PART1)\n"
69 "LBL&suffix DC AD(AL&suffix)\n");
70}
71
73 uint32_t value) {
75 fprintf(fp_,
76 "&suffix SETA &suffix+1\n"
77 "CEECWSA LOCTR\n"
78 "AL&suffix ALIAS C'%s'\n"
79 "C_WSA64 CATTR DEFLOAD,RMODE(64),PART(AL&suffix)\n"
80 "AL&suffix XATTR REF(DATA),LINKAGE(XPLINK),SCOPE(EXPORT)\n"
81 " DC F'%d'\n"
82 "C_WSA64 CATTR PART(PART1)\n"
83 "LBL&suffix DC AD(AL&suffix)\n",
84 name, value);
85}
86
88 hlasmPrintLine(fp_, "* Global Symbol %s\n", name);
89}
90
92 // No code alignment required.
93}
94
96 // No data alignment required.
97}
98
100 hlasmPrintLine(fp_, "* %s\n", string);
101}
102
104 hlasmPrintLine(fp_, "*--------------------------------------------\n");
105 hlasmPrintLine(fp_, "* Label %s\n", name);
106 hlasmPrintLine(fp_, "*--------------------------------------------\n");
107 hlasmPrintLine(fp_, "%s DS 0H\n", name);
108}
109
111 int line) {
112 hlasmPrintLine(fp_, "* line %d \"%s\"\n", line, filename);
113}
114
116 uint32_t size) {
117 hlasmPrintLine(fp_, "*--------------------------------------------\n");
118 hlasmPrintLine(fp_, "* Builtin %s\n", name);
119 hlasmPrintLine(fp_, "*--------------------------------------------\n");
120 hlasmPrintLine(fp_, "%s DS 0H\n", name);
121}
122
124 // Not used.
125}
126
128 // The cast is because some platforms define uint64_t as unsigned long long,
129 // while others (e.g. z/OS) define it as unsigned long.
130 return fprintf(fp_, "%.16lx", static_cast<unsigned long>(value));
131}
132
134 fprintf(fp_,
135 "&C SETC 'embed'\n"
136 " SYSSTATE AMODE64=YES\n"
137 "&C csect\n"
138 "&C amode 64\n"
139 "&C rmode 64\n");
140}
141
143 int fileid, const char* filename) {
144 // Not used.
145}
146
148
150 DataDirective directive) {
151 // Not used.
152 return 0;
153}
154
158
161 const uint64_t* quad_ptr = reinterpret_cast<const uint64_t*>(data);
162 return HexLiteral(*quad_ptr);
163}
164
166 // Not used.
167}
168
170 // Not used.
171}
172
173} // namespace internal
174} // namespace v8
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
void DeclareUint32(const char *name, uint32_t value) override
void SourceInfo(int fileid, const char *filename, int line) override
void DeclareFunctionBegin(const char *name, uint32_t size) override
void DeclareExternalFilename(int fileid, const char *filename) override
std::string filename
int32_t offset
static constexpr int kAsmMaxLineLen
static constexpr int kAsmContIndentLen
static constexpr int kAsmContMaxLen
#define DCHECK_EQ(v1, v2)
Definition logging.h:485