clang: lib/Driver/ToolChains/ZOS.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

13#include "llvm/Option/ArgList.h"

14#include "llvm/Support/FileSystem.h"

15#include "llvm/Support/VirtualFileSystem.h"

16#include "llvm/Support/WithColor.h"

17

18using namespace clang;

22using namespace llvm;

24using namespace llvm::sys;

25

26ZOS::ZOS(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)

28

30

32 ArgStringList &CC1Args,

34

35

36 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,

37 options::OPT_fno_aligned_allocation))

38 CC1Args.push_back("-faligned-alloc-unavailable");

39

40 if (DriverArgs.hasFlag(options::OPT_fxl_pragma_pack,

41 options::OPT_fno_xl_pragma_pack, true))

42 CC1Args.push_back("-fxl-pragma-pack");

43

44

45

46 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,

47 options::OPT_fno_sized_deallocation))

48 CC1Args.push_back("-fno-sized-deallocation");

49}

50

54 const ArgList &Args,

55 const char *LinkingOutput) const {

56 ArgStringList CmdArgs;

57

58 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);

59

60

63 CmdArgs.push_back("-o");

65 }

66

67

68

69

70 if (Inputs.size() != 1)

71 llvm_unreachable("Invalid number of input files.");

76

77 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));

79 Exec, CmdArgs, Inputs));

80}

81

82static std::string getLEHLQ(const ArgList &Args) {

83 if (Args.hasArg(options::OPT_mzos_hlq_le_EQ)) {

84 Arg *LEHLQArg = Args.getLastArg(options::OPT_mzos_hlq_le_EQ);

85 StringRef HLQ = LEHLQArg->getValue();

86 if (!HLQ.empty())

87 return HLQ.str();

88 }

89 return "CEE";

90}

91

92static std::string getClangHLQ(const ArgList &Args) {

93 if (Args.hasArg(options::OPT_mzos_hlq_clang_EQ)) {

94 Arg *ClangHLQArg = Args.getLastArg(options::OPT_mzos_hlq_clang_EQ);

95 StringRef HLQ = ClangHLQArg->getValue();

96 if (!HLQ.empty())

97 return HLQ.str();

98 }

100}

101

102static std::string getCSSHLQ(const ArgList &Args) {

103 if (Args.hasArg(options::OPT_mzos_hlq_csslib_EQ)) {

104 Arg *CsslibHLQArg = Args.getLastArg(options::OPT_mzos_hlq_csslib_EQ);

105 StringRef HLQ = CsslibHLQArg->getValue();

106 if (!HLQ.empty())

107 return HLQ.str();

108 }

109 return "SYS1";

110}

111

114 const InputInfoList &Inputs, const ArgList &Args,

115 const char *LinkingOutput) const {

116 const ZOS &ToolChain = static_cast<const ZOS &>(getToolChain());

117 ArgStringList CmdArgs;

118

119 const bool IsSharedLib =

120 Args.hasFlag(options::OPT_shared, options::OPT_static, false);

121

122 assert((Output.isFilename() || Output.isNothing()) && "Invalid output.");

124 CmdArgs.push_back("-o");

126 }

127

129 LinkerOptions = "AMODE=";

130 LinkerOptions += "64";

131 LinkerOptions += ",LIST";

132 LinkerOptions += ",DYNAM=DLL";

133 LinkerOptions += ",MSGLEVEL=4";

134 LinkerOptions += ",CASE=MIXED";

135 LinkerOptions += ",REUS=RENT";

136

137 CmdArgs.push_back("-b");

138 CmdArgs.push_back(Args.MakeArgString(LinkerOptions));

139

140 if (!IsSharedLib) {

141 CmdArgs.push_back("-e");

142 CmdArgs.push_back("CELQSTRT");

143

144 CmdArgs.push_back("-O");

145 CmdArgs.push_back("CELQSTRT");

146

147 CmdArgs.push_back("-u");

148 CmdArgs.push_back("CELQMAIN");

149 }

150

151

152 if (IsSharedLib) {

153 StringRef OutputName = Output.getFilename();

154

155

156 size_t Suffix = OutputName.find_last_of('.');

157 const char *SideDeckName =

158 Args.MakeArgString(OutputName.substr(0, Suffix) + ".x");

159 CmdArgs.push_back("-x");

160 CmdArgs.push_back(SideDeckName);

161 } else {

162

163

164

165 CmdArgs.push_back("-x");

166 CmdArgs.push_back("/dev/null");

167 }

168

169

170 Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_u});

171

173

174

176

177

178

179

180

181 std::string LEHLQ = getLEHLQ(Args);

182 std::string CsslibHLQ = getCSSHLQ(Args);

183

184 StringRef ld_env_var = StringRef(getenv("_LD_SYSLIB")).trim();

185 if (ld_env_var.empty()) {

186 CmdArgs.push_back("-S");

187 CmdArgs.push_back(Args.MakeArgString("//'" + LEHLQ + ".SCEEBND2'"));

188 CmdArgs.push_back("-S");

189 CmdArgs.push_back(Args.MakeArgString("//'" + CsslibHLQ + ".CSSLIB'"));

190 }

191

192 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {

193 ld_env_var = StringRef(getenv("_LD_SIDE_DECKS")).trim();

194 if (ld_env_var.empty()) {

195 CmdArgs.push_back(

196 Args.MakeArgString("//'" + LEHLQ + ".SCEELIB(CELQS001)'"));

197 CmdArgs.push_back(

198 Args.MakeArgString("//'" + LEHLQ + ".SCEELIB(CELQS003)'"));

199 } else {

201 ld_env_var.split(ld_side_deck, ":");

202 for (StringRef ld_loc : ld_side_deck) {

203 CmdArgs.push_back((ld_loc.str()).c_str());

204 }

205 }

206 }

207

210 }

211

212

213 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))

215

218 Exec, CmdArgs, Inputs));

219}

220

223}

224

227}

228

230 llvm::opt::ArgStringList &CmdArgs) const {

233 llvm::report_fatal_error("linking libstdc++ is unimplemented on z/OS");

234 break;

236 std::string ClangHLQ = getClangHLQ(Args);

237 CmdArgs.push_back(

238 Args.MakeArgString("//'" + ClangHLQ + ".SCEELIB(CRTDQCXE)'"));

239 CmdArgs.push_back(

240 Args.MakeArgString("//'" + ClangHLQ + ".SCEELIB(CRTDQCXS)'"));

241 CmdArgs.push_back(

242 Args.MakeArgString("//'" + ClangHLQ + ".SCEELIB(CRTDQCXP)'"));

243 CmdArgs.push_back(

244 Args.MakeArgString("//'" + ClangHLQ + ".SCEELIB(CRTDQCXA)'"));

245 CmdArgs.push_back(

246 Args.MakeArgString("//'" + ClangHLQ + ".SCEELIB(CRTDQXLA)'"));

247 CmdArgs.push_back(

248 Args.MakeArgString("//'" + ClangHLQ + ".SCEELIB(CRTDQUNW)'"));

249 } break;

250 }

251}

252

254

256

258 ArgStringList &CC1Args) const {

259 if (DriverArgs.hasArg(options::OPT_nostdinc))

260 return;

261

263

264

265 std::string ResourceDir(D.ResourceDir);

266

267

268

269

270 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {

272 path::append(P, "include", "zos_wrappers");

274

275

277 path::append(P2, "include");

279 }

280

281

282 if (Arg *SysIncludeArg =

283 DriverArgs.getLastArg(options::OPT_mzos_sys_include_EQ)) {

284 StringRef SysInclude = SysIncludeArg->getValue();

285

286

287 if (!SysInclude.empty()) {

288

289

290

291 StringRef PathLE(SysInclude);

292 size_t Colon = PathLE.find(':');

293 if (Colon == StringRef::npos) {

295 return;

296 }

297

298 while (Colon != StringRef::npos) {

301 PathLE = PathLE.substr(Colon + 1);

302 Colon = PathLE.find(':');

303 }

304 if (PathLE.size())

306

307 return;

308 }

309 }

310

312}

313

315 const llvm::opt::ArgList &DriverArgs,

316 llvm::opt::ArgStringList &CC1Args) const {

318 if (DriverArgs.hasArg(options::OPT_v))

319 WithColor::warning(errs(), "Clang")

320 << "ignoring nonexistent directory \"" << Path << "\"\n";

321 if (!DriverArgs.hasArg(options::OPT__HASH_HASH_HASH))

322 return;

323 }

325}

326

328 const llvm::opt::ArgList &DriverArgs,

329 llvm::opt::ArgStringList &CC1Args) const {

330 if (DriverArgs.hasArg(options::OPT_nostdinc) ||

331 DriverArgs.hasArg(options::OPT_nostdincxx) ||

332 DriverArgs.hasArg(options::OPT_nostdlibinc))

333 return;

334

337

339 llvm::sys::path::append(InstallBin, "..", "include", "c++", "v1");

341 break;

342 }

344 llvm::report_fatal_error(

345 "picking up libstdc++ headers is unimplemented on z/OS");

346 break;

347 }

348}

static std::string getClangHLQ(const ArgList &Args)

static std::string getLEHLQ(const ArgList &Args)

static std::string getCSSHLQ(const ArgList &Args)

Compilation - A set of tasks to perform for a single driver invocation.

Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...

InputInfo - Wrapper for information about an input source.

const char * getFilename() const

The JSON file list parser is used to communicate input to InstallAPI.

Diagnostic wrappers for TextAPI types for error reporting.

static constexpr ResponseFileSupport None()

Returns a ResponseFileSupport indicating that response files are not supported.