Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
doc:vrac [02/11/2013 17:22]
scorpio810 [Pourquoi -fno-ipa-sra ?]
doc:vrac [20/11/2014 13:02] (Version actuelle)
Ligne 1: Ligne 1:
 +~~NOCACHE~~
  
 +====== Documentation diverse et en vrac ======
 +===== Hiérarchie des classes de l'API des ElementsCollectionItem =====
 +Pour information,​ cette hiérarchie de classe permet d'​accéder et de manipuler de manière abstraite des collections,​ catégories et éléments, que ceux-ci soient stockés sur un système de fichiers (classes d'​implémentation File*) ou dans un projet (classes d'​implémentation Xml*)
 +
 +  * ElementsCollectionItem [pure virtual]
 +    * ElementsCollection [pure virtual]
 +      * FileElementsCollection
 +      * XmlElementsCollection
 +    * ElementsCategory [pure virtual]
 +      * FileElementsCategory
 +      * XmlElementsCategory
 +    * ElementDefinition [pure virtual]
 +      * FileElementDefinition
 +      * XmlElementDefinition
 +===== Contrôles effectués lors des déplacements / copies dans l'API des ElementsCollectionItem =====
 +
 +^Contrôle ​                                   ^ ElementsCollection ​ ^^   ​ElementsCategory ​ ^^ ElementDefinition ​  ^^
 +^                                            ^ copy    ^ move      ^ copy    ^ move       ^ copy    ^ move       ^
 +|Handler provided ?                          | [ok]    | [ok]      | [ok]    | [ok]       | [ok]    | [ok]       |
 +|Dst != src ?                                | [ok]    | [no]      | [ok]    | [ok]       | [no]    | [no]       |
 +|Src is writable ?                           | [no]    | [no]      | [no]    | [ok]       | [no]    | [ok]       |
 +|Dst is readable ?                           | [ok]    | [no]      | [ok]    | [ok]       | [ok]    | [ok]       |
 +|Dst is writeable ?                          | [ok]    | [no]      | [ok]    | [ok]       | [ok]    | [ok]       |
 +|Dst already exists ?                        | [ok]    | [no]      | [ok]    | [ok]       | [ok]    | [ok]       |
 +|Already existing dst is writable ?          | [ok]    | [no]      | [ok]    | [ok]       | [ok]    | [ok]       |
 +|Creation/​deletion error ?                   | [ok]    | [no]      | [ok]    | [ok]       | [ok]    | [ok]       |
 +
 +Légende
 +>> [ok] Vérification effectuée
 +>> [no] Vérification non effectuée car non pertinente
 +
 +Exemple : on n'a pas besoin de pouvoir modifier l'item source lors d'une copie.
 +
 +
 +À noter que certains de ces contrôles sont redondés dans l'​interface utilisateur,​ plus exactement dans le panel d'​éléments. Celui-ci n'​autorise que les drag'n drop à priori possibles au regard des permissions sur les items et de leur type. Ces contrôles peuvent être désactivés via les variables ''​ENABLE_PANEL_WIDGET_DND_CHECKS''​ (elementspanelwidget.cpp:​37) et ''​ENABLE_PANEL_DND_CHECKS''​ (elementspanel.cpp:​35).
 +===== Embarquement des éléments dans les projets =====
 +
 +Lorsqu'​un élément (ou une catégorie) est ajouté à la collection embarquée d'un projet, il ne peut être référencé que par rapport à un projet donné, en tant qu'​élément embarqué ; on a alors le couple de données suivant :
 +  * un chemin en %%embed://​category1/​category2/​category3/​element.elmt%%
 +  * un pointeur QETProject * pour savoir à quel projet se rapporte %%embed://​%%
 +
 +Ces données sont ce que retient un objet ElementsLocation pour désigner un élément sans ambiguïté.
 +Les projets ouverts dans l'​application étant numérotés et accessibles par leur numéro (on parle de "​project id"), un élément peut également être désigné par une simple chaîne de caractères de la forme %%project<​id>​+embed://​category1/​category2/​category3/​element.elmt%%
 +
 +
 +Passage de %%projectx+embed://​%% à %%embed://​%% :
 +  * effectué via la méthode ElementsLocation::​fromString() : elementslocation.cpp,​ ligne 160
 +
 +Passages de %%embed://​%% à %%projectx+embed://​%% :
 +  * lors de l'​enregistrement d'un fichier (méthode Diagram::​fromXml) : diagram.cpp,​ ligne 440
 +<code c++>
 +QString type_id = e.attribute("​type"​);​
 +ElementsLocation element_location = ElementsLocation(type_id);​
 +if (type_id.startsWith("​embed://"​)) element_location.setProject(project_);​
 +</​code>​
 +Lorsque le schéma est lu, si un élément se déclare de type %%embed://​%%,​ alors l'​ElementsLocation construit pour localiser l'​élément en question se voit lié au projet auquel appartient ce schéma.
 +
 +  * lors de l'​appel à la méthode toString() d'un ElementsLocation : elementslocation.cpp,​ ligne 143
 +<code c++>
 +/**
 + @return Une chaine de caracteres representant l'​emplacement
 +*/
 +QString ElementsLocation::​toString() const {
 + QString result;
 + if (project_) {
 + int project_id = QETApp::​projectId(project_);​
 + if (project_id != -1) {
 + result += "​project"​ + QString().setNum(project_id) + "​+";​
 + }
 + }
 + result += path_;
 + return(result);​
 +}
 +</​code>​
 +
 +===== Codes d'​erreur lors du chargement d'un élément =====
 +
 +Le chargement de l'​élément ... a échoué avec le code d'​erreur....
 +  * 1 : Le fichier n'​existe pas
 +  * 2 : Le fichier n'a pu être ouvert
 +  * 3 : Le fichier n'est pas un document XML
 +  * 4 : Le document XML n'a pas une "​définition"​ comme racine
 +  * 5 : Les attributs de la définition ne sont pas présents et / ou valides
 +  * 6 : La définition est vide
 +  * 7 : L'​analyse d'un élément XML décrivant une partie du dessin de l'​élément a échoue
 +  * 8 : Aucune partie du dessin n'a pu être chargée
 +
 +===== Pourquoi -fno-ipa-sra ? =====
 +
 +L'​option ''​-fno-ip-sra''​ a été ajoutée dans le qelectrotech.pro suite à la découverte de l'​erreur de compilation suivante avec ''​g++''​ 4.6.2 sur plateforme x86_64:
 +  * En ''​-O2''​ et ''​-03''​ : <​code>​
 +release/​elementspanel.o:​ In function `ElementsPanel::​slot_doubleClick(QTreeWidgetItem*,​ int)':
 +elementspanel.cpp:​(.text+0x144b):​ undefined reference to `TitleBlockTemplateLocation GenericPanel::​valueForItem<​TitleBlockTemplateLocation>​(QTreeWidgetItem*) const'
 +collect2: ld returned 1 exit status
 +</​code>​
 +  * En ''​-Os''​ : <​code>​
 +release/​elementspanel.o:​ In function `ElementsPanel::​slot_doubleClick(QTreeWidgetItem*,​ int)':
 +elementspanel.cpp:​(.text+0xf43):​ undefined reference to `QETProject* GenericPanel::​valueForItem<​QETProject*>​(QTreeWidgetItem*) const'
 +elementspanel.cpp:​(.text+0xf5d):​ undefined reference to `Diagram* GenericPanel::​valueForItem<​Diagram*>​(QTreeWidgetItem*) const'
 +elementspanel.cpp:​(.text+0xfd5):​ undefined reference to `TitleBlockTemplateLocation GenericPanel::​valueForItem<​TitleBlockTemplateLocation>​(QTreeWidgetItem*) const'
 +collect2: ld returned 1 exit status
 +</​code>​
 +  * En ''​-O0''​ et ''​-O1''​ : pas d'​erreur
 +
 +Pour rappel, la compilation en mode "​Release"​ utilise ''​-O2''​ tandis que celle en mode "​Debug"​ n'​incorpore pas d'​optimisations spécifiques.
 +
 +L'​erreur elle-même se traduit ainsi : au moment de générer le binaire final, l'​éditeur de liens ld constate que elementspanel.o référence une fonction / un symbole qu'il n'a pas pu retrouvé ailleurs, à savoir ''​T GenericPanel::​valueForItem<​T>​(QTreeWidgetItem *)''​.
 +Une rapide analyse des objets générés confirme cette version des faits :
 +
 +  * ''​.o''​ fonctionnels compilés avec ''​-O1''​ : <​code>​
 + $ objdump ​ -x  release/​elementspanel.o | nl -b a | egrep -i '​valueforitem.*titleblocktemplatelocation'​
 +   ​330 ​ 0000000000000000 ​        ​*UND* ​ 0000000000000000 _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem
 +   ​674 ​ 0000000000000e82 R_X86_64_PC32 ​    ​_ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc
 + $ objdump ​ -x  release/​genericpanel.o | nl -b a | egrep -i '​valueforitem.*titleblocktemplatelocation'​
 +   ​254 ​ 122 .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem 000001ae ​ 0000000000000000 ​ 0000000000000000 ​ 00006b60 ​ 2**4
 +   ​434 ​ 0000000000000000 l    d  .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem ​     0000000000000000 .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem
 +   ​727 ​ 0000000000000000 ​ w    F .text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem ​     00000000000001ae _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem
 +  1004  0000000000000e7a R_X86_64_PC32 ​    ​_ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc
 +  1489  00000000000039df R_X86_64_PC32 ​    ​_ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc
 +  1932  RELOCATION RECORDS FOR [.text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem]:​
 +  2360  00000000000000cf R_X86_64_PC32 ​    ​_ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc
 +  2504  00000000000006dc R_X86_64_PC32 ​    ​.text._ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem
 +</​code>​
 +  * ''​.o''​ compilé avec ''​-O2''​ : on constate que ''​genericpanel.o''​ ne contient plus qu'un laconique symbole suffixé "''​.isra.41''"<​code>​
 +$ objdump ​ -x  release/​elementspanel.o | nl -b a | egrep -i '​valueforitem.*titleblocktemplatelocation'​
 +   ​303 ​ 0000000000000000 ​        ​*UND* ​ 0000000000000000 _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem
 +   ​676 ​ 000000000000144b R_X86_64_PC32 ​    ​_ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem+0xfffffffffffffffc
 +$ objdump ​ -x  release/​genericpanel.o | nl -b a | egrep -i '​valueforitem.*titleblocktemplatelocation'​
 +   ​317 ​ 00000000000000f0 l     F .text  00000000000001cc _ZNK12GenericPanel12valueForItemI26TitleBlockTemplateLocationEET_P15QTreeWidgetItem.isra.41
 +</​code>​
 +Une rapide recherche sur les [[http://​gcc.gnu.org/​onlinedocs/​gcc/​Optimize-Options.html|optimisations activées avec ''​-O2''​ mais pas ''​-O1''​]] nous conduit à l'​option ''​-fipa-sra''​ (d'où ''​-fno-ipa-sra''​) : <​code>​
 +-fipa-sra
 +    Perform interprocedural scalar replacement of aggregates, removal of unused parameters and replacement of parameters passed by reference by parameters passed by value.
 +
 +    Enabled at levels -O2, -O3 and -Os. </​code>​
 +Sans doute le compilateur a-t-il décidé que ''​QTreeWidgetItem *''​ (pointeur standard, 64 bits) pouvait être directement remplacé par un QTreeWidgetItem,​ mais ça ne semble pas avoir fait beaucoup de biens à la liste des symboles générés... Toute explication plus détaillée sera la bienvenue
 +
 +[[http://​gcc.gnu.org/​bugzilla/​show_bug.cgi?​id=41750]]
 +
 +==== note ====
 + 
 +
 +problème de compilation seulement sur backport wheezy arch amd64 4:4.7.2, build ok en sid 4:4.8.1
 +avec dans le debian/​rules
 +<​code>​
 +CFLAGS+=-O2
 +CXXFLAGS=-O3''​
 +</​code>​
 +<​code>​
 +recentfiles.o release/​moc_titleblockpropertieswidget.o release/​moc_titleblocktemplate.o release/​moc_titleblocktemplaterenderer.o release/​moc_xmlelementdefinition.o release/​moc_xmlelementscategory.o release/​moc_xmlelementscollection.o release/​moc_diagramselection.o release/​moc_dialogautonum.o release/​moc_dialogwaiting.o release/​moc_numparteditorw.o release/​moc_selectautonumw.o release/​moc_arceditor.o release/​moc_elementitemeditor.o release/​moc_elementprimitivedecorator.o release/​moc_elementscene.o release/​moc_elementview.o release/​moc_ellipseeditor.o release/​moc_lineeditor.o release/​moc_parttext.o release/​moc_parttextfield.o release/​moc_polygoneditor.o release/​moc_qetelementeditor.o release/​moc_rectangleeditor.o release/​moc_styleeditor.o release/​moc_terminaleditor.o release/​moc_texteditor.o release/​moc_textfieldeditor.o release/​moc_dimensionwidget.o release/​moc_helpercell.o release/​moc_integrationmovetemplateshandler.o release/​moc_movetemplateshandler.o release/​moc_qettemplateeditor.o release/​moc_
 +splittedhelpercell.o release/​moc_templatecellwidget.o release/​moc_templatedeleter.o release/​moc_templatelocationchooser.o release/​moc_templatelocationsaver.o release/​moc_templatelogomanager.o release/​moc_templatescollection.o release/​moc_templateview.o release/​moc_richtexteditor_p.o release/​qrc_qelectrotech.o ​   -L/​usr/​lib/​x86_64-linux-gnu -lQtSvg -lQtSql -lQtXml -lQtGui -lQtNetwork -lQtCore ​
 +release/​elementspanel.o:​ In function `ElementsPanel::​slot_doubleClick(QTreeWidgetItem*,​ int)':
 +elementspanel.cpp:​(.text+0x201c):​ undefined reference to `TitleBlockTemplateLocation GenericPanel::​valueForItem<​TitleBlockTemplateLocation>​(QTreeWidgetItem*) const'
 +collect2: error: ld returned 1 exit status
 +make[2]: *** [qelectrotech] Error 1
 +</​code>​
Imprimer/exporter
Langages