From 1954c643f076d0a0258df79b17ebf6140fe01641 Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Tue, 12 Mar 2024 12:23:21 -0600 Subject: [PATCH] Try to link system LLVM libraries --- bootstrap/Compilation.zig | 8 + build.zig | 509 ++++++++++++++++++++------------------ test/cc/c_first/main.c | 2 + 3 files changed, 272 insertions(+), 247 deletions(-) diff --git a/bootstrap/Compilation.zig b/bootstrap/Compilation.zig index 648272c..27c1202 100644 --- a/bootstrap/Compilation.zig +++ b/bootstrap/Compilation.zig @@ -252,6 +252,14 @@ pub fn compileCSourceFile(context: *const Context, arguments: [][*:0]u8) !void { var clang_args = UnpinnedArray([]const u8){}; try clang_args.append(context.my_allocator, context.executable_absolute_path); try clang_args.append(context.my_allocator, "clang"); + try clang_args.append(context.my_allocator, "-nostdinc"); + try clang_args.append_slice(context.my_allocator, &.{"-isystem", "/home/david/dev/zig/lib/include", "-isystem", "/home/david/dev/zig/lib/libc/include/x86_64-linux-gnu", "-isystem", "/home/david/dev/zig/lib/libc/include/generic-glibc", "-isystem", "/home/david/dev/zig/lib/libc/include/x86-linux-any", "-isystem", "/home/david/dev/zig/lib/libc/include/any-linux-any"}); + + + try clang_args.append(context.my_allocator, "-isystem"); + try clang_args.append(context.my_allocator, "/usr/include"); + try clang_args.append(context.my_allocator, "-isystem"); + try clang_args.append(context.my_allocator, "/usr/include/linux"); for (arguments) |arg| { try clang_args.append(context.my_allocator, span(arg)); } diff --git a/build.zig b/build.zig index ad9578a..c580b83 100644 --- a/build.zig +++ b/build.zig @@ -8,11 +8,12 @@ pub fn build(b: *std.Build) !void { const print_stack_trace = b.option(bool, "print_stack_trace", "This option enables printing stack traces inside the compiler") orelse is_ci or @import("builtin").os.tag == .macos; const native_target = b.resolveTargetQuery(.{}); const optimization = b.standardOptimizeOption(.{}); - var target_query = b.standardTargetOptionsQueryOnly(.{}); + const target_query = b.standardTargetOptionsQueryOnly(.{}); const os = target_query.os_tag orelse @import("builtin").os.tag; - if (os == .linux) { - target_query.abi = .musl; - } + _ = os; // autofix + // if (os == .linux) { + // target_query.abi = .musl; + // } const target = b.resolveTargetQuery(target_query); const compiler_options = b.addOptions(); compiler_options.addOption(bool, "print_stack_trace", print_stack_trace); @@ -31,7 +32,19 @@ pub fn build(b: *std.Build) !void { compiler.want_lto = false; compiler.linkLibC(); - compiler.linkSystemLibrary("c++"); + compiler.addObjectFile(.{ .cwd_relative = "/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/../../../../lib/libstdc++.so" }); + compiler.addIncludePath(.{ .cwd_relative = "/usr/include"}); + compiler.addIncludePath(.{ .cwd_relative = "/usr/include/c++/13.2.1"}); + compiler.addIncludePath(.{ .cwd_relative = "/usr/include/c++/13.2.1/x86_64-pc-linux-gnu"}); + compiler.addLibraryPath(.{ .cwd_relative = "/usr/lib"}); + compiler.linkSystemLibrary("LLVM"); + compiler.linkSystemLibrary("clang-cpp"); + compiler.linkSystemLibrary("lldCommon"); + compiler.linkSystemLibrary("lldCOFF"); + compiler.linkSystemLibrary("lldELF"); + compiler.linkSystemLibrary("lldMachO"); + compiler.linkSystemLibrary("lldWasm"); + compiler.linkSystemLibrary("unwind"); // TODO: // if (target.result.os.tag == .windows) { @@ -92,8 +105,10 @@ pub fn build(b: *std.Build) !void { }; const llvm_include_dir = try std.mem.concat(b.allocator, u8, &.{ llvm_path, "/include" }); + _ = llvm_include_dir; // autofix const llvm_lib_dir = try std.mem.concat(b.allocator, u8, &.{ llvm_path, "/lib" }); - compiler.addIncludePath(std.Build.LazyPath.relative(llvm_include_dir)); + _ = llvm_lib_dir; // autofix + // compiler.addIncludePath(std.Build.LazyPath.relative(llvm_include_dir)); const cpp_files = .{ "src/llvm/llvm.cpp", "src/llvm/lld.cpp", @@ -120,248 +135,248 @@ pub fn build(b: *std.Build) !void { }, }); - const zlib = if (target.result.os.tag == .windows) "zstd.lib" else "libzstd.a"; - const llvm_libraries = [_][]const u8{ - "libLLVMAArch64AsmParser.a", - "libLLVMAArch64CodeGen.a", - "libLLVMAArch64Desc.a", - "libLLVMAArch64Disassembler.a", - "libLLVMAArch64Info.a", - "libLLVMAArch64Utils.a", - "libLLVMAggressiveInstCombine.a", - "libLLVMAMDGPUAsmParser.a", - "libLLVMAMDGPUCodeGen.a", - "libLLVMAMDGPUDesc.a", - "libLLVMAMDGPUDisassembler.a", - "libLLVMAMDGPUInfo.a", - "libLLVMAMDGPUTargetMCA.a", - "libLLVMAMDGPUUtils.a", - "libLLVMAnalysis.a", - "libLLVMARMAsmParser.a", - "libLLVMARMCodeGen.a", - "libLLVMARMDesc.a", - "libLLVMARMDisassembler.a", - "libLLVMARMInfo.a", - "libLLVMARMUtils.a", - "libLLVMAsmParser.a", - "libLLVMAsmPrinter.a", - "libLLVMAVRAsmParser.a", - "libLLVMAVRCodeGen.a", - "libLLVMAVRDesc.a", - "libLLVMAVRDisassembler.a", - "libLLVMAVRInfo.a", - "libLLVMBinaryFormat.a", - "libLLVMBitReader.a", - "libLLVMBitstreamReader.a", - "libLLVMBitWriter.a", - "libLLVMBPFAsmParser.a", - "libLLVMBPFCodeGen.a", - "libLLVMBPFDesc.a", - "libLLVMBPFDisassembler.a", - "libLLVMBPFInfo.a", - "libLLVMCFGuard.a", - "libLLVMCFIVerify.a", - "libLLVMCodeGen.a", - "libLLVMCodeGenTypes.a", - "libLLVMCore.a", - "libLLVMCoroutines.a", - "libLLVMCoverage.a", - "libLLVMDebugInfoBTF.a", - "libLLVMDebugInfoCodeView.a", - "libLLVMDebuginfod.a", - "libLLVMDebugInfoDWARF.a", - "libLLVMDebugInfoGSYM.a", - "libLLVMDebugInfoLogicalView.a", - "libLLVMDebugInfoMSF.a", - "libLLVMDebugInfoPDB.a", - "libLLVMDemangle.a", - "libLLVMDiff.a", - "libLLVMDlltoolDriver.a", - "libLLVMDWARFLinker.a", - "libLLVMDWARFLinkerParallel.a", - "libLLVMDWP.a", - "libLLVMExecutionEngine.a", - "libLLVMExtensions.a", - "libLLVMFileCheck.a", - "libLLVMFrontendHLSL.a", - "libLLVMFrontendOpenACC.a", - "libLLVMFrontendOpenMP.a", - "libLLVMFuzzerCLI.a", - "libLLVMFuzzMutate.a", - "libLLVMGlobalISel.a", - "libLLVMHexagonAsmParser.a", - "libLLVMHexagonCodeGen.a", - "libLLVMHexagonDesc.a", - "libLLVMHexagonDisassembler.a", - "libLLVMHexagonInfo.a", - "libLLVMInstCombine.a", - "libLLVMInstrumentation.a", - "libLLVMInterfaceStub.a", - "libLLVMInterpreter.a", - "libLLVMipo.a", - "libLLVMIRPrinter.a", - "libLLVMIRReader.a", - "libLLVMJITLink.a", - "libLLVMLanaiAsmParser.a", - "libLLVMLanaiCodeGen.a", - "libLLVMLanaiDesc.a", - "libLLVMLanaiDisassembler.a", - "libLLVMLanaiInfo.a", - "libLLVMLibDriver.a", - "libLLVMLineEditor.a", - "libLLVMLinker.a", - "libLLVMLoongArchAsmParser.a", - "libLLVMLoongArchCodeGen.a", - "libLLVMLoongArchDesc.a", - "libLLVMLoongArchDisassembler.a", - "libLLVMLoongArchInfo.a", - "libLLVMLTO.a", - "libLLVMMC.a", - "libLLVMMCA.a", - "libLLVMMCDisassembler.a", - "libLLVMMCJIT.a", - "libLLVMMCParser.a", - "libLLVMMipsAsmParser.a", - "libLLVMMipsCodeGen.a", - "libLLVMMipsDesc.a", - "libLLVMMipsDisassembler.a", - "libLLVMMipsInfo.a", - "libLLVMMIRParser.a", - "libLLVMMSP430AsmParser.a", - "libLLVMMSP430CodeGen.a", - "libLLVMMSP430Desc.a", - "libLLVMMSP430Disassembler.a", - "libLLVMMSP430Info.a", - "libLLVMNVPTXCodeGen.a", - "libLLVMNVPTXDesc.a", - "libLLVMNVPTXInfo.a", - "libLLVMObjCARCOpts.a", - "libLLVMObjCopy.a", - "libLLVMObject.a", - "libLLVMObjectYAML.a", - "libLLVMOption.a", - "libLLVMOrcJIT.a", - "libLLVMOrcShared.a", - "libLLVMOrcTargetProcess.a", - "libLLVMPasses.a", - "libLLVMPowerPCAsmParser.a", - "libLLVMPowerPCCodeGen.a", - "libLLVMPowerPCDesc.a", - "libLLVMPowerPCDisassembler.a", - "libLLVMPowerPCInfo.a", - "libLLVMProfileData.a", - "libLLVMRemarks.a", - "libLLVMRISCVAsmParser.a", - "libLLVMRISCVCodeGen.a", - "libLLVMRISCVDesc.a", - "libLLVMRISCVDisassembler.a", - "libLLVMRISCVInfo.a", - "libLLVMRISCVTargetMCA.a", - "libLLVMRuntimeDyld.a", - "libLLVMScalarOpts.a", - "libLLVMSelectionDAG.a", - "libLLVMSparcAsmParser.a", - "libLLVMSparcCodeGen.a", - "libLLVMSparcDesc.a", - "libLLVMSparcDisassembler.a", - "libLLVMSparcInfo.a", - "libLLVMSupport.a", - "libLLVMSymbolize.a", - "libLLVMSystemZAsmParser.a", - "libLLVMSystemZCodeGen.a", - "libLLVMSystemZDesc.a", - "libLLVMSystemZDisassembler.a", - "libLLVMSystemZInfo.a", - "libLLVMTableGen.a", - "libLLVMTableGenCommon.a", - "libLLVMTableGenGlobalISel.a", - "libLLVMTarget.a", - "libLLVMTargetParser.a", - "libLLVMTextAPI.a", - "libLLVMTransformUtils.a", - "libLLVMVEAsmParser.a", - "libLLVMVECodeGen.a", - "libLLVMVectorize.a", - "libLLVMVEDesc.a", - "libLLVMVEDisassembler.a", - "libLLVMVEInfo.a", - "libLLVMWebAssemblyAsmParser.a", - "libLLVMWebAssemblyCodeGen.a", - "libLLVMWebAssemblyDesc.a", - "libLLVMWebAssemblyDisassembler.a", - "libLLVMWebAssemblyInfo.a", - "libLLVMWebAssemblyUtils.a", - "libLLVMWindowsDriver.a", - "libLLVMWindowsManifest.a", - "libLLVMX86AsmParser.a", - "libLLVMX86CodeGen.a", - "libLLVMX86Desc.a", - "libLLVMX86Disassembler.a", - "libLLVMX86Info.a", - "libLLVMX86TargetMCA.a", - "libLLVMXCoreCodeGen.a", - "libLLVMXCoreDesc.a", - "libLLVMXCoreDisassembler.a", - "libLLVMXCoreInfo.a", - "libLLVMXRay.a", - //LLD - "liblldCOFF.a", - "liblldCommon.a", - "liblldELF.a", - "liblldMachO.a", - "liblldMinGW.a", - "liblldWasm.a", - // Zlib - zlib, - "libz.a", - // Clang - "libclangAnalysis.a", - "libclangAnalysisFlowSensitive.a", - "libclangAnalysisFlowSensitiveModels.a", - "libclangAPINotes.a", - "libclangARCMigrate.a", - "libclangAST.a", - "libclangASTMatchers.a", - "libclangBasic.a", - "libclangCodeGen.a", - "libclangCrossTU.a", - "libclangDependencyScanning.a", - "libclangDirectoryWatcher.a", - "libclangDriver.a", - "libclangDynamicASTMatchers.a", - "libclangEdit.a", - "libclangExtractAPI.a", - "libclangFormat.a", - "libclangFrontend.a", - "libclangFrontendTool.a", - "libclangHandleCXX.a", - "libclangHandleLLVM.a", - "libclangIndex.a", - "libclangIndexSerialization.a", - "libclangInterpreter.a", - "libclangLex.a", - "libclangParse.a", - "libclangRewrite.a", - "libclangRewriteFrontend.a", - "libclangSema.a", - "libclangSerialization.a", - "libclangStaticAnalyzerCheckers.a", - "libclangStaticAnalyzerCore.a", - "libclangStaticAnalyzerFrontend.a", - "libclangSupport.a", - "libclangTooling.a", - "libclangToolingASTDiff.a", - "libclangToolingCore.a", - "libclangToolingInclusions.a", - "libclangToolingInclusionsStdlib.a", - "libclangToolingRefactoring.a", - "libclangToolingSyntax.a", - "libclangTransformer.a", - }; + // const zlib = if (target.result.os.tag == .windows) "zstd.lib" else "libzstd.a"; + // const llvm_libraries = [_][]const u8{ + // "libLLVMAArch64AsmParser.a", + // "libLLVMAArch64CodeGen.a", + // "libLLVMAArch64Desc.a", + // "libLLVMAArch64Disassembler.a", + // "libLLVMAArch64Info.a", + // "libLLVMAArch64Utils.a", + // "libLLVMAggressiveInstCombine.a", + // "libLLVMAMDGPUAsmParser.a", + // "libLLVMAMDGPUCodeGen.a", + // "libLLVMAMDGPUDesc.a", + // "libLLVMAMDGPUDisassembler.a", + // "libLLVMAMDGPUInfo.a", + // "libLLVMAMDGPUTargetMCA.a", + // "libLLVMAMDGPUUtils.a", + // "libLLVMAnalysis.a", + // "libLLVMARMAsmParser.a", + // "libLLVMARMCodeGen.a", + // "libLLVMARMDesc.a", + // "libLLVMARMDisassembler.a", + // "libLLVMARMInfo.a", + // "libLLVMARMUtils.a", + // "libLLVMAsmParser.a", + // "libLLVMAsmPrinter.a", + // "libLLVMAVRAsmParser.a", + // "libLLVMAVRCodeGen.a", + // "libLLVMAVRDesc.a", + // "libLLVMAVRDisassembler.a", + // "libLLVMAVRInfo.a", + // "libLLVMBinaryFormat.a", + // "libLLVMBitReader.a", + // "libLLVMBitstreamReader.a", + // "libLLVMBitWriter.a", + // "libLLVMBPFAsmParser.a", + // "libLLVMBPFCodeGen.a", + // "libLLVMBPFDesc.a", + // "libLLVMBPFDisassembler.a", + // "libLLVMBPFInfo.a", + // "libLLVMCFGuard.a", + // "libLLVMCFIVerify.a", + // "libLLVMCodeGen.a", + // "libLLVMCodeGenTypes.a", + // "libLLVMCore.a", + // "libLLVMCoroutines.a", + // "libLLVMCoverage.a", + // "libLLVMDebugInfoBTF.a", + // "libLLVMDebugInfoCodeView.a", + // "libLLVMDebuginfod.a", + // "libLLVMDebugInfoDWARF.a", + // "libLLVMDebugInfoGSYM.a", + // "libLLVMDebugInfoLogicalView.a", + // "libLLVMDebugInfoMSF.a", + // "libLLVMDebugInfoPDB.a", + // "libLLVMDemangle.a", + // "libLLVMDiff.a", + // "libLLVMDlltoolDriver.a", + // "libLLVMDWARFLinker.a", + // "libLLVMDWARFLinkerParallel.a", + // "libLLVMDWP.a", + // "libLLVMExecutionEngine.a", + // "libLLVMExtensions.a", + // "libLLVMFileCheck.a", + // "libLLVMFrontendHLSL.a", + // "libLLVMFrontendOpenACC.a", + // "libLLVMFrontendOpenMP.a", + // "libLLVMFuzzerCLI.a", + // "libLLVMFuzzMutate.a", + // "libLLVMGlobalISel.a", + // "libLLVMHexagonAsmParser.a", + // "libLLVMHexagonCodeGen.a", + // "libLLVMHexagonDesc.a", + // "libLLVMHexagonDisassembler.a", + // "libLLVMHexagonInfo.a", + // "libLLVMInstCombine.a", + // "libLLVMInstrumentation.a", + // "libLLVMInterfaceStub.a", + // "libLLVMInterpreter.a", + // "libLLVMipo.a", + // "libLLVMIRPrinter.a", + // "libLLVMIRReader.a", + // "libLLVMJITLink.a", + // "libLLVMLanaiAsmParser.a", + // "libLLVMLanaiCodeGen.a", + // "libLLVMLanaiDesc.a", + // "libLLVMLanaiDisassembler.a", + // "libLLVMLanaiInfo.a", + // "libLLVMLibDriver.a", + // "libLLVMLineEditor.a", + // "libLLVMLinker.a", + // "libLLVMLoongArchAsmParser.a", + // "libLLVMLoongArchCodeGen.a", + // "libLLVMLoongArchDesc.a", + // "libLLVMLoongArchDisassembler.a", + // "libLLVMLoongArchInfo.a", + // "libLLVMLTO.a", + // "libLLVMMC.a", + // "libLLVMMCA.a", + // "libLLVMMCDisassembler.a", + // "libLLVMMCJIT.a", + // "libLLVMMCParser.a", + // "libLLVMMipsAsmParser.a", + // "libLLVMMipsCodeGen.a", + // "libLLVMMipsDesc.a", + // "libLLVMMipsDisassembler.a", + // "libLLVMMipsInfo.a", + // "libLLVMMIRParser.a", + // "libLLVMMSP430AsmParser.a", + // "libLLVMMSP430CodeGen.a", + // "libLLVMMSP430Desc.a", + // "libLLVMMSP430Disassembler.a", + // "libLLVMMSP430Info.a", + // "libLLVMNVPTXCodeGen.a", + // "libLLVMNVPTXDesc.a", + // "libLLVMNVPTXInfo.a", + // "libLLVMObjCARCOpts.a", + // "libLLVMObjCopy.a", + // "libLLVMObject.a", + // "libLLVMObjectYAML.a", + // "libLLVMOption.a", + // "libLLVMOrcJIT.a", + // "libLLVMOrcShared.a", + // "libLLVMOrcTargetProcess.a", + // "libLLVMPasses.a", + // "libLLVMPowerPCAsmParser.a", + // "libLLVMPowerPCCodeGen.a", + // "libLLVMPowerPCDesc.a", + // "libLLVMPowerPCDisassembler.a", + // "libLLVMPowerPCInfo.a", + // "libLLVMProfileData.a", + // "libLLVMRemarks.a", + // "libLLVMRISCVAsmParser.a", + // "libLLVMRISCVCodeGen.a", + // "libLLVMRISCVDesc.a", + // "libLLVMRISCVDisassembler.a", + // "libLLVMRISCVInfo.a", + // "libLLVMRISCVTargetMCA.a", + // "libLLVMRuntimeDyld.a", + // "libLLVMScalarOpts.a", + // "libLLVMSelectionDAG.a", + // "libLLVMSparcAsmParser.a", + // "libLLVMSparcCodeGen.a", + // "libLLVMSparcDesc.a", + // "libLLVMSparcDisassembler.a", + // "libLLVMSparcInfo.a", + // "libLLVMSupport.a", + // "libLLVMSymbolize.a", + // "libLLVMSystemZAsmParser.a", + // "libLLVMSystemZCodeGen.a", + // "libLLVMSystemZDesc.a", + // "libLLVMSystemZDisassembler.a", + // "libLLVMSystemZInfo.a", + // "libLLVMTableGen.a", + // "libLLVMTableGenCommon.a", + // "libLLVMTableGenGlobalISel.a", + // "libLLVMTarget.a", + // "libLLVMTargetParser.a", + // "libLLVMTextAPI.a", + // "libLLVMTransformUtils.a", + // "libLLVMVEAsmParser.a", + // "libLLVMVECodeGen.a", + // "libLLVMVectorize.a", + // "libLLVMVEDesc.a", + // "libLLVMVEDisassembler.a", + // "libLLVMVEInfo.a", + // "libLLVMWebAssemblyAsmParser.a", + // "libLLVMWebAssemblyCodeGen.a", + // "libLLVMWebAssemblyDesc.a", + // "libLLVMWebAssemblyDisassembler.a", + // "libLLVMWebAssemblyInfo.a", + // "libLLVMWebAssemblyUtils.a", + // "libLLVMWindowsDriver.a", + // "libLLVMWindowsManifest.a", + // "libLLVMX86AsmParser.a", + // "libLLVMX86CodeGen.a", + // "libLLVMX86Desc.a", + // "libLLVMX86Disassembler.a", + // "libLLVMX86Info.a", + // "libLLVMX86TargetMCA.a", + // "libLLVMXCoreCodeGen.a", + // "libLLVMXCoreDesc.a", + // "libLLVMXCoreDisassembler.a", + // "libLLVMXCoreInfo.a", + // "libLLVMXRay.a", + // //LLD + // "liblldCOFF.a", + // "liblldCommon.a", + // "liblldELF.a", + // "liblldMachO.a", + // "liblldMinGW.a", + // "liblldWasm.a", + // // Zlib + // zlib, + // "libz.a", + // // Clang + // "libclangAnalysis.a", + // "libclangAnalysisFlowSensitive.a", + // "libclangAnalysisFlowSensitiveModels.a", + // "libclangAPINotes.a", + // "libclangARCMigrate.a", + // "libclangAST.a", + // "libclangASTMatchers.a", + // "libclangBasic.a", + // "libclangCodeGen.a", + // "libclangCrossTU.a", + // "libclangDependencyScanning.a", + // "libclangDirectoryWatcher.a", + // "libclangDriver.a", + // "libclangDynamicASTMatchers.a", + // "libclangEdit.a", + // "libclangExtractAPI.a", + // "libclangFormat.a", + // "libclangFrontend.a", + // "libclangFrontendTool.a", + // "libclangHandleCXX.a", + // "libclangHandleLLVM.a", + // "libclangIndex.a", + // "libclangIndexSerialization.a", + // "libclangInterpreter.a", + // "libclangLex.a", + // "libclangParse.a", + // "libclangRewrite.a", + // "libclangRewriteFrontend.a", + // "libclangSema.a", + // "libclangSerialization.a", + // "libclangStaticAnalyzerCheckers.a", + // "libclangStaticAnalyzerCore.a", + // "libclangStaticAnalyzerFrontend.a", + // "libclangSupport.a", + // "libclangTooling.a", + // "libclangToolingASTDiff.a", + // "libclangToolingCore.a", + // "libclangToolingInclusions.a", + // "libclangToolingInclusionsStdlib.a", + // "libclangToolingRefactoring.a", + // "libclangToolingSyntax.a", + // "libclangTransformer.a", + // }; - for (llvm_libraries) |llvm_library| { - compiler.addObjectFile(std.Build.LazyPath.relative(try std.mem.concat(b.allocator, u8, &.{ llvm_lib_dir, "/", llvm_library }))); - } + // for (llvm_libraries) |llvm_library| { + // compiler.addObjectFile(std.Build.LazyPath.relative(try std.mem.concat(b.allocator, u8, &.{ llvm_lib_dir, "/", llvm_library }))); + // } const install_exe = b.addInstallArtifact(compiler, .{}); b.getInstallStep().dependOn(&install_exe.step); diff --git a/test/cc/c_first/main.c b/test/cc/c_first/main.c index 905869d..f2c7519 100644 --- a/test/cc/c_first/main.c +++ b/test/cc/c_first/main.c @@ -1,4 +1,6 @@ +#include int main() { + printf("Hello world\n"); return 0; }