From 233c6d8696eddb78c2104a91473e933a0c1a88b4 Mon Sep 17 00:00:00 2001 From: John Dallaway Date: Sun, 14 Jan 2024 10:11:43 +0000 Subject: [PATCH 1/8] Invoke "gcc" to build assembler files Enables pre-processing of *.S and *.sx source files. --- .../META-INF/MANIFEST.MF | 2 +- .../test1DepCalc2/Benchmarks/sources.mk | 1 + .../test1DepCalc3/Benchmarks/sources.mk | 1 + .../Benchmarks/sources.mk | 1 + .../test30_2/Benchmarks/sources.mk | 1 + .../Benchmarks/sources.mk | 1 + .../Test 4.0 ConfigName.Dbg/sources.mk | 1 + .../test_40/Benchmarks/dbg 2/sources.mk | 1 + .../META-INF/MANIFEST.MF | 2 +- .../FileMacroExplicitSubstitutor.java | 7 +- .../META-INF/MANIFEST.MF | 2 +- .../plugin.xml | 6 +- .../gnu/ui/GnuAsmFlagsCommandGenerator.java | 97 +++++++++++++++++++ core/org.eclipse.cdt.core/plugin.xml | 2 +- 14 files changed, 118 insertions(+), 7 deletions(-) create mode 100644 build/org.eclipse.cdt.managedbuilder.gnu.ui/src/org/eclipse/cdt/managedbuilder/gnu/ui/GnuAsmFlagsCommandGenerator.java diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/META-INF/MANIFEST.MF b/build/org.eclipse.cdt.managedbuilder.core.tests/META-INF/MANIFEST.MF index cf5434aa22f..05ababd9fa4 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/META-INF/MANIFEST.MF +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.managedbuilder.core.tests; singleton:=true -Bundle-Version: 8.2.300.qualifier +Bundle-Version: 8.2.400.qualifier Bundle-Activator: org.eclipse.cdt.managedbuilder.testplugin.CTestPlugin Bundle-Vendor: %providerName Bundle-Localization: plugin diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depCalcProjects/test1DepCalc2/Benchmarks/sources.mk b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depCalcProjects/test1DepCalc2/Benchmarks/sources.mk index 673630dd080..c09ad6b5fe9 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depCalcProjects/test1DepCalc2/Benchmarks/sources.mk +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depCalcProjects/test1DepCalc2/Benchmarks/sources.mk @@ -6,6 +6,7 @@ ASM_SRCS := C_SRCS := OBJ_SRCS := O_SRCS := +SX_SRCS := S_UPPER_SRCS := C_DEPS := EXECUTABLES := diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depCalcProjects/test1DepCalc3/Benchmarks/sources.mk b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depCalcProjects/test1DepCalc3/Benchmarks/sources.mk index 673630dd080..c09ad6b5fe9 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depCalcProjects/test1DepCalc3/Benchmarks/sources.mk +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depCalcProjects/test1DepCalc3/Benchmarks/sources.mk @@ -6,6 +6,7 @@ ASM_SRCS := C_SRCS := OBJ_SRCS := O_SRCS := +SX_SRCS := S_UPPER_SRCS := C_DEPS := EXECUTABLES := diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depCalcProjects/test1DepCalcPreBuild/Benchmarks/sources.mk b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depCalcProjects/test1DepCalcPreBuild/Benchmarks/sources.mk index 673630dd080..c09ad6b5fe9 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depCalcProjects/test1DepCalcPreBuild/Benchmarks/sources.mk +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/depCalcProjects/test1DepCalcPreBuild/Benchmarks/sources.mk @@ -6,6 +6,7 @@ ASM_SRCS := C_SRCS := OBJ_SRCS := O_SRCS := +SX_SRCS := S_UPPER_SRCS := C_DEPS := EXECUTABLES := diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test30Projects/test30_2/Benchmarks/sources.mk b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test30Projects/test30_2/Benchmarks/sources.mk index af1ca6bbb9f..b970622e5b6 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test30Projects/test30_2/Benchmarks/sources.mk +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test30Projects/test30_2/Benchmarks/sources.mk @@ -12,6 +12,7 @@ CXXM_SRCS := CXX_SRCS := C_UPPER_SRCS := LOG_SRCS := +SX_SRCS := S_UPPER_SRCS := TAR_SRCS := LOGFILE := diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test30Projects/testFileWithNoExtension/Benchmarks/sources.mk b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test30Projects/testFileWithNoExtension/Benchmarks/sources.mk index 407d90a33a6..f0941d6b561 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test30Projects/testFileWithNoExtension/Benchmarks/sources.mk +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test30Projects/testFileWithNoExtension/Benchmarks/sources.mk @@ -6,6 +6,7 @@ ASM_SRCS := C_SRCS := OBJ_SRCS := O_SRCS := +SX_SRCS := S_UPPER_SRCS := C_DEPS := EXECUTABLES := diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test40Projects/test_40/Benchmarks/Test 4.0 ConfigName.Dbg/sources.mk b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test40Projects/test_40/Benchmarks/Test 4.0 ConfigName.Dbg/sources.mk index 88fed6c1180..3441f930421 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test40Projects/test_40/Benchmarks/Test 4.0 ConfigName.Dbg/sources.mk +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test40Projects/test_40/Benchmarks/Test 4.0 ConfigName.Dbg/sources.mk @@ -14,6 +14,7 @@ C_SRCS := C_UPPER_SRCS := OBJ_SRCS := O_SRCS := +SX_SRCS := S_UPPER_SRCS := C++M_DEPS := C++_DEPS := diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test40Projects/test_40/Benchmarks/dbg 2/sources.mk b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test40Projects/test_40/Benchmarks/dbg 2/sources.mk index 88fed6c1180..3441f930421 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test40Projects/test_40/Benchmarks/dbg 2/sources.mk +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test40Projects/test_40/Benchmarks/dbg 2/sources.mk @@ -14,6 +14,7 @@ C_SRCS := C_UPPER_SRCS := OBJ_SRCS := O_SRCS := +SX_SRCS := S_UPPER_SRCS := C++M_DEPS := C++_DEPS := diff --git a/build/org.eclipse.cdt.managedbuilder.core/META-INF/MANIFEST.MF b/build/org.eclipse.cdt.managedbuilder.core/META-INF/MANIFEST.MF index 30de811a100..413d69ae823 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/META-INF/MANIFEST.MF +++ b/build/org.eclipse.cdt.managedbuilder.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.managedbuilder.core; singleton:=true -Bundle-Version: 9.6.200.qualifier +Bundle-Version: 9.6.300.qualifier Bundle-Activator: org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin Bundle-Vendor: %providerName Bundle-Localization: plugin diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/FileMacroExplicitSubstitutor.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/FileMacroExplicitSubstitutor.java index c5e05e17c68..549c9f89b5a 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/FileMacroExplicitSubstitutor.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/FileMacroExplicitSubstitutor.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2010 Intel Corporation and others. + * Copyright (c) 2006, 2024 Intel Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -10,6 +10,7 @@ * * Contributors: * Intel Corporation - Initial API and implementation + * John Dallaway - Provide getter for IConfiguration (#666) *******************************************************************************/ package org.eclipse.cdt.managedbuilder.internal.buildmodel; @@ -36,6 +37,10 @@ public FileMacroExplicitSubstitutor(IMacroContextInfo contextInfo, IConfiguratio fBuilder = builder; } + public IConfiguration getConfiguration() { + return fCfg; + } + /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.internal.macros.DefaultMacroSubstitutor#resolveMacro(org.eclipse.cdt.managedbuilder.macros.IBuildMacro) */ diff --git a/build/org.eclipse.cdt.managedbuilder.gnu.ui/META-INF/MANIFEST.MF b/build/org.eclipse.cdt.managedbuilder.gnu.ui/META-INF/MANIFEST.MF index 58aee845d73..20b5c7faba7 100644 --- a/build/org.eclipse.cdt.managedbuilder.gnu.ui/META-INF/MANIFEST.MF +++ b/build/org.eclipse.cdt.managedbuilder.gnu.ui/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.managedbuilder.gnu.ui; singleton:=true -Bundle-Version: 8.6.100.qualifier +Bundle-Version: 8.7.0.qualifier Bundle-Activator: org.eclipse.cdt.managedbuilder.gnu.ui.GnuUIPlugin Bundle-Vendor: %providerName Bundle-Localization: plugin diff --git a/build/org.eclipse.cdt.managedbuilder.gnu.ui/plugin.xml b/build/org.eclipse.cdt.managedbuilder.gnu.ui/plugin.xml index 29596312772..370c137b232 100644 --- a/build/org.eclipse.cdt.managedbuilder.gnu.ui/plugin.xml +++ b/build/org.eclipse.cdt.managedbuilder.gnu.ui/plugin.xml @@ -565,7 +565,7 @@ id="gnu.windres.option.preprocessor.undefined.symbols"/> @@ -607,7 +609,7 @@ id="cdt.managedbuild.tool.gnu.assembler.input" languageId="org.eclipse.cdt.core.assembly" sourceContentType="org.eclipse.cdt.core.asmSource" - sources="s,S"> + sources="s,sx,S"> From dd543580a53c10383f734c2ec50c3031b2a6ab44 Mon Sep 17 00:00:00 2001 From: John Dallaway Date: Fri, 26 Jan 2024 17:16:19 +0000 Subject: [PATCH 2/8] Enhance legacy GNU assembler flag detection --- NewAndNoteworthy/CDT-11.5.md | 9 +++++++++ .../images/CDT-11.5-gnu-as-command.png | Bin 0 -> 63835 bytes .../gnu/ui/GnuAsmFlagsCommandGenerator.java | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 NewAndNoteworthy/images/CDT-11.5-gnu-as-command.png diff --git a/NewAndNoteworthy/CDT-11.5.md b/NewAndNoteworthy/CDT-11.5.md index 97649b4ed86..de301af88f8 100644 --- a/NewAndNoteworthy/CDT-11.5.md +++ b/NewAndNoteworthy/CDT-11.5.md @@ -6,6 +6,15 @@ This is the New & Noteworthy page for CDT 11.5 which is part of Eclipse 2024-03 # Release Notes +# Build + +## Preprocessor activation for GNU assembly language files + +The managed build system now invokes `gcc -c` to build GNU assembly language source files rather than invoking `as` directly. The revised behaviour ensures that the GNU preprocessor is active when building `*.S` and `*.sx` files to match user expectations. In the case of existing managed build projects, a new GNU assembler tool command generator applies the `-Wa,` prefix to user-specified assembler flags where appropriate. Users may revert to the previous behaviour by overriding the assembler command within the project properties dialog: + +

+ +The new behaviour applies to managed build configurations using a _Cross GCC_, _Cygwin GCC_, _Linux GCC_ or _MinGW GCC_ toolchain. # API Changes, current and planned diff --git a/NewAndNoteworthy/images/CDT-11.5-gnu-as-command.png b/NewAndNoteworthy/images/CDT-11.5-gnu-as-command.png new file mode 100644 index 0000000000000000000000000000000000000000..3b6f6c48befd198d714b5419469c257ff20e160d GIT binary patch literal 63835 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\)lwKhA|#foXo-%^Z#<39fT_z6IsTy!h=i(FKN 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 WBApd--fKr7G%j7gn1A8^)Bg*aaA~Rl literal 0 HcmV?d00001 diff --git a/build/org.eclipse.cdt.managedbuilder.gnu.ui/src/org/eclipse/cdt/managedbuilder/gnu/ui/GnuAsmFlagsCommandGenerator.java b/build/org.eclipse.cdt.managedbuilder.gnu.ui/src/org/eclipse/cdt/managedbuilder/gnu/ui/GnuAsmFlagsCommandGenerator.java index 9f9dca78290..2c5d8c236ca 100644 --- a/build/org.eclipse.cdt.managedbuilder.gnu.ui/src/org/eclipse/cdt/managedbuilder/gnu/ui/GnuAsmFlagsCommandGenerator.java +++ b/build/org.eclipse.cdt.managedbuilder.gnu.ui/src/org/eclipse/cdt/managedbuilder/gnu/ui/GnuAsmFlagsCommandGenerator.java @@ -41,7 +41,7 @@ public class GnuAsmFlagsCommandGenerator implements IOptionCommandGenerator { private static final String DO_NOT_LINK_FLAG = "-c"; //$NON-NLS-1$ private static final Pattern DO_NOT_LINK_PATTERN = Pattern.compile("(^|\\s)-c($|\\s)"); //$NON-NLS-1$ - private static final Pattern ASM_FLAG_PATTERN = Pattern.compile("-[aDKLR]\\S*"); //$NON-NLS-1$ + private static final Pattern ASM_FLAG_PATTERN = Pattern.compile("(?<=^|\\s)-[aDKLR]\\S*"); //$NON-NLS-1$ @Override public String generateCommand(IOption option, IVariableSubstitutor macroSubstitutor) { From e53d4141e696944b15894c9c530d52f3f2e49fb7 Mon Sep 17 00:00:00 2001 From: Jonah Graham Date: Mon, 29 Jan 2024 18:49:31 -0500 Subject: [PATCH 3/8] Workaround #684 by disabling dsf-gdb tests (#685) This only disables running the tests on Jenkins as the GitHub actions these tests work fine for now. See https://github.com/eclipse-cdt/cdt/issues/684 --- Jenkinsfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index cc8c6ee7294..878e1f2121b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -36,8 +36,10 @@ pipeline { timeout(activity: true, time: 20) { withEnv(['MAVEN_OPTS=-XX:MaxRAMPercentage=50.0 -XX:+PrintFlagsFinal']) { withCredentials([string(credentialsId: 'gpg-passphrase', variable: 'KEYRING_PASSPHRASE')]) { + // XXX: Issue 684 means that dsf-gdb tests are skipped sh '''/jipp/tools/apache-maven/latest/bin/mvn \ clean verify -B -V \ + -Ddsf-gdb.skip.tests=true \ -Dgpg.passphrase="${KEYRING_PASSPHRASE}" \ -Dmaven.test.failure.ignore=true \ -DexcludedGroups=flakyTest,slowTest \ From f3c2d91dfa90b9641ba348bc7a640e80446e497a Mon Sep 17 00:00:00 2001 From: John Dallaway Date: Tue, 30 Jan 2024 15:36:13 +0000 Subject: [PATCH 4/8] Add COFF binary object presentation improvements to N&N --- NewAndNoteworthy/CDT-11.5.md | 8 ++++++++ .../images/CDT-11.5-coff-object.png | Bin 0 -> 24172 bytes 2 files changed, 8 insertions(+) create mode 100644 NewAndNoteworthy/images/CDT-11.5-coff-object.png diff --git a/NewAndNoteworthy/CDT-11.5.md b/NewAndNoteworthy/CDT-11.5.md index de301af88f8..9239724ab8a 100644 --- a/NewAndNoteworthy/CDT-11.5.md +++ b/NewAndNoteworthy/CDT-11.5.md @@ -16,6 +16,14 @@ The managed build system now invokes `gcc -c` to build GNU assembly language sou The new behaviour applies to managed build configurations using a _Cross GCC_, _Cygwin GCC_, _Linux GCC_ or _MinGW GCC_ toolchain. +## COFF symbol presentation + +A complete set of external symbols is now presented under COFF binary object files within the _Project Explorer_ view: + +

+ +The revised presentation matches that observed for ELF binary object files. + # API Changes, current and planned ## Breaking API changes diff --git a/NewAndNoteworthy/images/CDT-11.5-coff-object.png b/NewAndNoteworthy/images/CDT-11.5-coff-object.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba052372d1904cd6193b891fcdc4c9d3cec65d7 GIT binary patch literal 24172 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 M%TTlA@}0;30W>eVO#lD@ literal 0 HcmV?d00001 From e838a231d97dff7ab17fa7e35ceb3db4854020a9 Mon Sep 17 00:00:00 2001 From: Marc-Andre Laperle Date: Fri, 2 Feb 2024 11:39:16 -0500 Subject: [PATCH 5/8] Partial fix for bug 574196/530103, error involving sizeof...() (#667) Also discovered that non-type param is not handled at all. This case is not covered in this commit but there is a commented-out failing test for it. --- .../parser/tests/ast2/AST2TemplateTests.java | 133 ++++++++++++++++++ .../dom/parser/cpp/semantics/EvalUnary.java | 5 + .../parser/cpp/semantics/EvalUnaryTypeID.java | 36 ++++- 3 files changed, 170 insertions(+), 4 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 2886f6a8ce3..4d11ad942bd 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -9285,6 +9285,139 @@ public void testSizeofParameterPack_527697() throws Exception { assertSameType(CommonCPPTypes.int_, waldo); } + // template struct foo; + // template <> struct foo<2> { typedef int type; }; + // + // template + // using alias = typename foo::type; + // + // template + // struct caller { + // typedef alias type; + // }; + // + // template::type = 0> + // void function() { + // } + // + // int main() { + // function<0>(); + // } + public void testSizeofParameterPack_574196() throws Exception { + parseAndCheckBindings(); + } + + // template struct foo; + // template <> struct foo<3> { typedef int type; }; + // + // template + // using alias = typename foo::type; + // + // template + // struct caller { + // typedef alias type; + // }; + // + // template::type = 0> + // void function() { + // } + // + // int main() { + // function<0>(); + // } + public void testSizeofParameterPack_574196_2() throws Exception { + parseAndCheckBindings(); + } + + // template struct foo; + // template <> struct foo<3> { typedef int type; }; + // + // template + // using alias = typename foo::type; + // + // template + // struct caller { + // typedef alias type; + // }; + // + // template::type = 0> + // void function() { + // } + // + // int main() { + // function<0>(); + // } + public void testSizeofParameterPack_574196_3() throws Exception { + parseAndCheckBindings(); + } + + // template struct foo; + // template <> struct foo<2> { typedef int type; }; + // + // template + // using alias = typename foo::type; + // + // template + // struct caller { + // typedef alias type; + // }; + // + // template::type = 0> + // void function() { + // } + // + // int main() { + // function<0>(); + // } + public void testSizeofParameterPack_574196_4() throws Exception { + parseAndCheckBindings(); + } + + // template struct foo; + // template <> struct foo<2> { typedef int type; }; + // + // template + // using myalias = typename foo::type; + // + // template + // struct caller { + // typedef myalias type; + // }; + // + // template::type = 4321> + // void function() { + // } + // + // int main() { + // function<1234>(); + // } + //TODO: Handle non-type parameter pack + // public void testSizeofParameterPack_574196_5() throws Exception { + // parseAndCheckBindings(); + // } + + // template struct foo; + // template <> struct foo<0> { typedef int type; }; + // + // template + // using myalias = typename foo::type; + // + // template + // struct caller { + // typedef myalias type; + // }; + // + // template::type = 4321> + // void function() { + // } + // + // int main() { + // function<1234>(); + // } + public void testSizeofParameterPack_574196_6() throws Exception { + parseAndCheckBindings(); + } + // template // struct A {}; // diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnary.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnary.java index 35d386adf7c..554a30c7b5b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnary.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnary.java @@ -399,6 +399,11 @@ public static ICPPEvaluation unmarshal(short firstBytes, ITypeMarshalBuffer buff @Override public ICPPEvaluation instantiate(InstantiationContext context, int maxDepth) { + // if (fOperator == IASTUnaryExpression.op_sizeofParameterPack) { + // //TODO: Something like EvalUnaryTypeID ? + // return instantiateSizeofParameterPack(context); + // } + if (fOperator == op_integerPack && context.getPackOffset() != -1) { return new EvalFixed(getType(), ValueCategory.PRVALUE, IntegralValue.create(context.getPackOffset())); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnaryTypeID.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnaryTypeID.java index 1d0783883a2..96e43a3c4bf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnaryTypeID.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnaryTypeID.java @@ -44,11 +44,13 @@ import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_typeid; import static org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression.op_typeof; +import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IValue; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameterPackType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; @@ -271,15 +273,15 @@ private ICPPEvaluation instantiateSizeofParameterPack(InstantiationContext conte return this; } int concreteArgCount = 0; - boolean havePackExpansion = false; + int packExpansionCount = 0; for (ICPPTemplateArgument arg : args) { if (arg.isPackExpansion()) { - havePackExpansion = true; + packExpansionCount++; } else { concreteArgCount++; } } - if (havePackExpansion) { + if (packExpansionCount > 0) { // TODO(bug 530103): // This will only handle correctly the case where there is a single argument // which is a pack expansion, and no concrete arguments. @@ -291,7 +293,33 @@ private ICPPEvaluation instantiateSizeofParameterPack(InstantiationContext conte // sizeof...(P). // - Construct an EvalBinary tree representing the sum of |concreteArgCount| // and the EvalUnaryTypeIds from the previous step. - return instantiateBySubstitution(context); + + //malaperle: I implemented something that kind-of does what the comment + //above suggest but am not confident enough that it covers all cases (hence the several instanceof checks). + ICPPEvaluation packEval = null; + for (ICPPTemplateArgument arg : args) { + if (arg.isPackExpansion()) { + if (arg.getTypeValue() instanceof ICPPParameterPackType) { + ICPPParameterPackType parameterPackType = (ICPPParameterPackType) arg.getTypeValue(); + IType type = parameterPackType.getType(); + if (type instanceof ICPPTemplateParameter) + packEval = new EvalUnaryTypeID(fOperator, type, getTemplateDefinition()); + + } + } + } + + // Can we really get here? + if (packEval == null) + return instantiateBySubstitution(context); + + // For sizeof(...(T)), T={U..., U...} + ICPPEvaluation multiPackCountEval = new EvalBinary(IASTBinaryExpression.op_multiply, packEval, + new EvalFixed(getType(), getValueCategory(), IntegralValue.create(packExpansionCount)), + pack); + + return new EvalBinary(IASTBinaryExpression.op_plus, multiPackCountEval, + new EvalFixed(getType(), getValueCategory(), IntegralValue.create(concreteArgCount)), pack); } else { return new EvalFixed(getType(), getValueCategory(), IntegralValue.create(concreteArgCount)); } From d5ec9d7c683913c06a4e65fcebfe57edfa3b1354 Mon Sep 17 00:00:00 2001 From: Marc-Andre Laperle Date: Fri, 2 Feb 2024 11:40:47 -0500 Subject: [PATCH 6/8] Improve ProblemBinding checker message for failed function instantiation (#668) Display the new more accurate error when all candidates were failed instantiations. Otherwise, if there is a mix of failed instantiation and wrong number of arguments, display the old message. This could really be improved even more... template void function() {} Before: function(); // Invalid arguments 'Candidates are: After: function(); // Cannot instantiate template function 'Candidates are: --- .../META-INF/MANIFEST.MF | 2 +- .../OSGI-INF/l10n/bundle.properties | 3 +++ codan/org.eclipse.cdt.codan.checkers/plugin.xml | 10 ++++++++++ .../internal/checkers/ProblemBindingChecker.java | 9 +++++++++ .../cdt/core/parser/tests/ast2/AST2TemplateTests.java | 4 ++-- .../org/eclipse/cdt/core/dom/ast/IProblemBinding.java | 2 ++ .../eclipse/cdt/core/dom/ast/ISemanticProblem.java | 2 ++ .../core/dom/parser/cpp/semantics/CPPSemantics.java | 11 +++++++++-- 8 files changed, 38 insertions(+), 5 deletions(-) diff --git a/codan/org.eclipse.cdt.codan.checkers/META-INF/MANIFEST.MF b/codan/org.eclipse.cdt.codan.checkers/META-INF/MANIFEST.MF index f2ace874a42..e7817f88e0a 100644 --- a/codan/org.eclipse.cdt.codan.checkers/META-INF/MANIFEST.MF +++ b/codan/org.eclipse.cdt.codan.checkers/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.eclipse.cdt.codan.checkers;singleton:=true -Bundle-Version: 3.5.400.qualifier +Bundle-Version: 3.5.500.qualifier Bundle-Activator: org.eclipse.cdt.codan.checkers.CodanCheckersActivator Require-Bundle: org.eclipse.core.runtime, org.eclipse.core.resources, diff --git a/codan/org.eclipse.cdt.codan.checkers/OSGI-INF/l10n/bundle.properties b/codan/org.eclipse.cdt.codan.checkers/OSGI-INF/l10n/bundle.properties index 15bbc5c8fe0..77ebbe6e435 100644 --- a/codan/org.eclipse.cdt.codan.checkers/OSGI-INF/l10n/bundle.properties +++ b/codan/org.eclipse.cdt.codan.checkers/OSGI-INF/l10n/bundle.properties @@ -116,6 +116,9 @@ problem.name.12 = Field cannot be resolved problem.description.13 = Name resolution problem found by the indexer problem.messagePattern.13 = Structured binding initializer expression refers to introduced name ''{0}'' problem.name.13 = Invalid structured binding declaration +problem.description.14 = Name resolution problem found by the indexer +problem.messagePattern.14 = Cannot instantiate template function ''{0}'' +problem.name.14 = Function cannot be instantiated checker.name.AbstractClassCreation = Abstract class cannot be instantiated problem.name.AbstractClassCreation = Abstract class cannot be instantiated problem.messagePattern.AbstractClassCreation = The type ''{0}'' must implement the inherited pure virtual method ''{1}''\u0020 diff --git a/codan/org.eclipse.cdt.codan.checkers/plugin.xml b/codan/org.eclipse.cdt.codan.checkers/plugin.xml index 7a4d11c604f..9e63033f8ab 100644 --- a/codan/org.eclipse.cdt.codan.checkers/plugin.xml +++ b/codan/org.eclipse.cdt.codan.checkers/plugin.xml @@ -253,6 +253,16 @@ messagePattern="%problem.messagePattern.10" name="%problem.name.10"> + + class U, T *pT > class A { @@ -7487,7 +7487,7 @@ public void testTemplatedAliasRedefinitionOfSameFunction() throws Exception { public void testTemplatedAliasDeduction() throws Exception { BindingAssertionHelper bh = getAssertionHelper(); bh.assertNonProblem("g(v)", "g", ICPPFunction.class); - bh.assertProblem("f(v)", "f", ISemanticProblem.BINDING_NOT_FOUND); + bh.assertProblem("f(v)", "f", ISemanticProblem.BINDING_INVALID_TEMPLATE_INSTANTIATION); } // using function = void (&)(int); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IProblemBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IProblemBinding.java index 7ec31006142..2cce48437f9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IProblemBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IProblemBinding.java @@ -67,6 +67,8 @@ public interface IProblemBinding extends IBinding, IScope, IType, ISemanticProbl public static final int SEMANTIC_INVALID_TEMPLATE_ARGUMENTS = BINDING_INVALID_TEMPLATE_ARGUMENTS; /** @since 8.1 */ public static final int SEMANTIC_INVALID_STRUCTURED_BINDING_INITIALIZER = BINDING_INVALID_STRUCTURED_BINDING_INITIALIZER; + /** @since 8.4 */ + public static final int SEMANTIC_INVALID_TEMPLATE_INSTANTIATION = BINDING_INVALID_TEMPLATE_INSTANTIATION; /** * @deprecated There may be additional problems. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ISemanticProblem.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ISemanticProblem.java index 5c23def3eb8..94171e75a1c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ISemanticProblem.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ISemanticProblem.java @@ -39,6 +39,8 @@ public interface ISemanticProblem { int BINDING_NO_CLASS = 16; /** @since 8.1 */ int BINDING_INVALID_STRUCTURED_BINDING_INITIALIZER = 17; + /** @since 8.4 */ + int BINDING_INVALID_TEMPLATE_INSTANTIATION = 18; int TYPE_NO_NAME = 10000; int TYPE_UNRESOLVED_NAME = 10001; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index b6d65d2112d..5a136b53329 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -3103,10 +3103,17 @@ public static IBinding resolveFunction(LookupData data, ICPPFunction[] fns, bool ICPPFunction[] tmp = selectByArgumentCount(data, fns); if (tmp.length == 0 || tmp[0] == null) return new ProblemBinding(lookupName, lookupPoint, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, fns); + int nbBeforeInstantiate = tmp.length; tmp = CPPTemplates.instantiateForFunctionCall(tmp, data.getTemplateArguments(), Arrays.asList(argTypes), Arrays.asList(data.getFunctionArgumentValueCategories()), data.argsContainImpliedObject); - if (tmp.length == 0 || tmp[0] == null) - return new ProblemBinding(lookupName, lookupPoint, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, fns); + if (tmp.length == 0 || tmp[0] == null) { + // All candidates were failed template instantiations + if (nbBeforeInstantiate == fns.length) + return new ProblemBinding(lookupName, lookupPoint, + IProblemBinding.SEMANTIC_INVALID_TEMPLATE_INSTANTIATION, fns); + else + return new ProblemBinding(lookupName, lookupPoint, IProblemBinding.SEMANTIC_NAME_NOT_FOUND, fns); + } int viableCount = 0; for (IFunction f : tmp) { From a1a9d93c7e21f8610be4bd213729bdb91addffa1 Mon Sep 17 00:00:00 2001 From: John Dallaway Date: Thu, 1 Feb 2024 08:48:22 +0000 Subject: [PATCH 7/8] Accommodate external binary object files - Adorn external binary object icons - Present symbols under external binary object resources - Label external binary objects with filename only - Present absent external binary objects with grey label - Sort external binary objects by filename only --- .../org/eclipse/cdt/core/model/IBinary.java | 12 ++- .../cdt/internal/core/model/Archive.java | 11 +-- .../cdt/internal/core/model/Binary.java | 75 ++++++++++++++++++- core/org.eclipse.cdt.ui/plugin.properties | 4 +- core/org.eclipse.cdt.ui/plugin.xml | 11 +++ .../internal/ui/CElementAdapterFactory.java | 11 ++- .../ui/navigator/OpenCElementAction.java | 27 +++++-- .../ui/viewsupport/BinaryFileDecorator.java | 44 +++++++++++ .../ui/viewsupport/CElementImageProvider.java | 7 +- .../ui/viewsupport/CElementLabelComposer.java | 22 +++++- .../org/eclipse/cdt/ui/CElementSorter.java | 12 ++- 11 files changed, 213 insertions(+), 23 deletions(-) create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/BinaryFileDecorator.java diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IBinary.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IBinary.java index feb502bb3b0..907a2d1b3d7 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IBinary.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IBinary.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2009 QNX Software Systems and others. + * Copyright (c) 2000, 2024 QNX Software Systems and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -11,9 +11,12 @@ * Contributors: * QNX Software Systems - Initial API and implementation * Markus Schorn (Wind River Systems) + * John Dallaway - Support external binary files (#630) *******************************************************************************/ package org.eclipse.cdt.core.model; +import org.eclipse.core.runtime.IPath; + /** * Represents a Binary file, for example an ELF executable. * An ELF parser will inspect the binary. @@ -57,4 +60,11 @@ public interface IBinary extends ICElement, IParent, IOpenable { public boolean showInBinaryContainer(); //public IAddressFactory getAddressFactory(); + /** + * Returns the absolute path of the location of this binary. May be {@code null}, + * in case the location does not exist. + * @return an absolute path to the location, or {@code null} + * @since 8.4 + */ + public IPath getLocation(); } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Archive.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Archive.java index e47f3c52d5c..b50054750f3 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Archive.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Archive.java @@ -28,6 +28,7 @@ import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.internal.core.util.MementoTokenizer; +import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; @@ -94,12 +95,12 @@ public boolean computeChildren(OpenableInfo info, IResource res) { } IFile file = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(objPath); if (file == null) { // if object path is external to the workspace - // fallback to legacy behaviour - // TODO: support external paths in Binary class as we do in TranslationUnit - objPath = ar.getPath().append(objPath.lastSegment()); + Binary binary = new Binary(this, URIUtil.toURI(objPath), obj); + info.addChild(binary); + } else { + Binary binary = new Binary(this, objPath, obj); + info.addChild(binary); } - Binary binary = new Binary(this, objPath, obj); - info.addChild(binary); } return true; } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Binary.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Binary.java index 934357178e4..4512034abd6 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Binary.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Binary.java @@ -14,6 +14,7 @@ * Anton Leherbauer (Wind River Systems) * John Dallaway - Adapt for IBinaryFile (#413) * John Dallaway - Support source file lookup from relative path (#652) + * John Dallaway - Add initial support for external paths (#630) *******************************************************************************/ package org.eclipse.cdt.internal.core.model; @@ -21,6 +22,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStreamReader; +import java.net.URI; import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -43,10 +45,15 @@ import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.internal.core.resources.ResourceLookup; import org.eclipse.cdt.internal.core.util.MementoTokenizer; +import org.eclipse.cdt.utils.UNCPathConverter; +import org.eclipse.core.filesystem.EFS; +import org.eclipse.core.filesystem.IFileInfo; +import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; @@ -66,6 +73,7 @@ public class Binary extends Openable implements IBinary { private long fLastModification; + private URI location; private IBinaryObject binaryObject; private boolean showInBinaryContainer; @@ -75,6 +83,13 @@ public Binary(ICElement parent, IFile file, IBinaryObject bin) { showInBinaryContainer = determineShowInBinaryContainer(bin); } + public Binary(ICElement parent, URI uri, IBinaryObject bin) { + super(parent, (IResource) null, uri.toString(), ICElement.C_BINARY); + location = uri; + binaryObject = bin; + showInBinaryContainer = determineShowInBinaryContainer(bin); + } + private boolean determineShowInBinaryContainer(IBinaryObject bin) { BinaryFilePresentation presentation = bin.getAdapter(BinaryFilePresentation.class); if (presentation != null) { @@ -284,7 +299,7 @@ boolean computeChildren(OpenableInfo info, IResource res) throws CModelException // information. If not, fall back on information from the binary parser. boolean showSourceFiles = Platform.getPreferencesService().getBoolean(CCorePlugin.PLUGIN_ID, CCorePreferenceConstants.SHOW_SOURCE_FILES_IN_BINARIES, false, null); - if (!showSourceFiles || !addSourceFiles(info, res, obj, hash)) { + if (!showSourceFiles || (res == null) || !addSourceFiles(info, res, obj, hash)) { ISymbol[] symbols = obj.getSymbols(); for (ISymbol symbol : symbols) { switch (symbol.getType()) { @@ -528,7 +543,63 @@ public boolean exists() { IResource res = getResource(); if (res != null) return res.exists(); - return super.exists(); + if (location != null) { + try { + IFileStore fileStore = EFS.getStore(location); + IFileInfo info = fileStore.fetchInfo(); + return info.exists(); + } catch (CoreException e) { + CCorePlugin.log(e); + } + + } + return false; + } + + @Override + public IPath getLocation() { + if (location == null) { + IFile file = getFile(); + if (file != null) { + return file.getLocation(); + } else { + return null; + } + } + return UNCPathConverter.toPath(location); + } + + @Override + public URI getLocationURI() { + if (location == null) { + IFile file = getFile(); + if (file != null) { + location = file.getLocationURI(); + } else { + return null; + } + } + return location; + } + + @Override + public IPath getPath() { + if (getFile() != null) { + return super.getPath(); + } + IPath path = getLocation(); + if (path != null) { + return path; + } + return super.getPath(); + } + + public IFile getFile() { + IResource res = super.getResource(); + if (res instanceof IFile) { + return (IFile) res; + } + return null; } @Override diff --git a/core/org.eclipse.cdt.ui/plugin.properties b/core/org.eclipse.cdt.ui/plugin.properties index 2e208202e37..0bec04bd47e 100644 --- a/core/org.eclipse.cdt.ui/plugin.properties +++ b/core/org.eclipse.cdt.ui/plugin.properties @@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2003, 2023 IBM Corporation, QNX Software Systems, and others. +# Copyright (c) 2003, 2024 IBM Corporation, QNX Software Systems, and others. # # This program and the accompanying materials # are made available under the terms of the Eclipse Public License 2.0 @@ -656,6 +656,8 @@ ShiftRightAction.label= &Shift Right ShiftLeftAction.label= S&hift Left # Decorators +binaryFileDecorator.label = C/C++ Binary Files +binaryFileDecorator.description = Decorates C/C++ executable, object, core and shared library files. indexedFilesDecorator.label = C/C++ Indexed Files indexedFilesDecorator.description = Decorates files indexed by C/C++ Indexer. translationUnitDecorator.label = C/C++ Translation Units diff --git a/core/org.eclipse.cdt.ui/plugin.xml b/core/org.eclipse.cdt.ui/plugin.xml index dbd37475e31..383e2203cc0 100644 --- a/core/org.eclipse.cdt.ui/plugin.xml +++ b/core/org.eclipse.cdt.ui/plugin.xml @@ -4445,6 +4445,17 @@ + + %binaryFileDecorator.description + + + + Date: Sun, 4 Feb 2024 17:02:53 +0000 Subject: [PATCH 8/8] Add GNU archive content presentation improvements to N&N --- NewAndNoteworthy/CDT-11.5.md | 8 ++++++++ .../images/CDT-11.5-archive-content.png | Bin 0 -> 13533 bytes 2 files changed, 8 insertions(+) create mode 100644 NewAndNoteworthy/images/CDT-11.5-archive-content.png diff --git a/NewAndNoteworthy/CDT-11.5.md b/NewAndNoteworthy/CDT-11.5.md index 9239724ab8a..9efcb0e721c 100644 --- a/NewAndNoteworthy/CDT-11.5.md +++ b/NewAndNoteworthy/CDT-11.5.md @@ -24,6 +24,14 @@ A complete set of external symbols is now presented under COFF binary object fil The revised presentation matches that observed for ELF binary object files. +## GNU archive content presentation + +The original locations of object files within a GNU archive are now calculated using path information where available. This enables presentation of source file names and symbols under archive files within the _Project Explorer_ view: + +

+ +Managed build _Static Library_ projects using a _Cross GCC_, _Cygwin GCC_, _Linux GCC_ or _MinGW GCC_ toolchain now use the `-P` archiver flag by default to generate the necessary path information. + # API Changes, current and planned ## Breaking API changes diff --git a/NewAndNoteworthy/images/CDT-11.5-archive-content.png b/NewAndNoteworthy/images/CDT-11.5-archive-content.png new file mode 100644 index 0000000000000000000000000000000000000000..16c600cbfc3ee026faeb1b20479e89d8c60087d3 GIT binary patch literal 13533 zcmaib2UJtrx^-yMlrD($CL%(lNRg`2k&Yr=K?J45P(uk|P!Va;TL3A7C`F1uD8VR5 z4@mDsTId8q=;dwBJ>$J|-~9_?WTfo1zP;97d(Usq`7I)h4Ye=OU8VzpKo@j%G)zGt zG8ph;r8x)uqFl@3rbC}&)=28kzOIo2m(P*2xyLBH2&QhFRTJl2PT;JRr@^Jg^UeiER zzxgQfekj!XZOha0@^Y^8Ka%E?FU*qp`O&@_z5Rl9{JPwwu&fi2KOj7-F12b{Ml_knP@BS5Fi7AKE$gNKpLSATh^d}_3tpBi45&DFhK3IQEy7B%4V3Z&> zxDZUn)9>T@8%iUovvK2`r>H^>V?!i!H>QMx1&On+5GJ+btd2htvonjyI^5&ZR|;y5 z9(K8*EV-vEOp%|ag=0MSa$xv<*OqnBGB(KZ0^R1p*nGS1+1dBf{4l3`=}8W&O7aoq zt|5s!ml4#U&@JHSvP6VvJJ)T#iOpK3@T?_;Qk@1NgNuvKt8%+@AoF+r z97hHg(_QgRo7XNv2}_Dph-?ZVa#De_yk(P5dy{8#y-}CMWsB`AT)Vt~K#c!7hT!9D zOcG+ysqYfGOoOHXmg1U$7J-$O)q%7;7*KTSvo=ZT4-tQY5ZY0(F;qVUW^SGyh11s7 zZkcI`Z25fui+2Q{l@aMvuxQYZ_$ih-a9vzf#5m;#JwhOvSCmH6W>}n7qFEr8dBx=W z3ZiZ718?Nj^BRxF@<@*pJrcfZbi#F(sW0qzRNwgm8HgFbr#C{nYCEmM{-boGciRR8 zI>?H`6&4gU$BXFGi9qHI&(4H|V=1*)(c(#ESs{VLo=X?~RvMjkDJ3-7Tgu-G3Dv5P zU}NrzG$gWpyl2_*Qo>g3NpfDIx9~^Fap6&M%Uhmuxfh;g51o*9Op3?wkzq%Q=e?Cm z)7E_Fd_SY%adGiO_tUsBH35Q7$a+v9 z(6$Up-Vz=U)?aTHZF(W9?balb0O#^xwO80xQ}BbNGw-5&LQl!*sv8>DD}jm>nraY9YFvR_%(KsC%0AwD4qaDM6J8JS2{4RrGV3_bMxXH4_-)Rk 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