public static void packCompositeIfPossible(Composite original, DataTypeManager dtm) {
		if (original.isZeroLength() || original.getNumComponents() == 0) {
			// don't try to pack empty structs, this would throw off conflicthandler logic.
			// also don't pack sized structs with no fields because when packed down to 0 bytes they
			// cause errors when used as a param type
			return;
		}

		Composite copy = (Composite) original.copy(dtm);
		copy.setToDefaultPacking();
		if (copy.getLength() != original.getLength()) {
			// so far, typically because trailing zero-len flex array caused toolchain to
			// bump struct size to next alignment value in a way that doesn't mesh with ghidra's
			// logic
			return;  // fail
		}

		DataTypeComponent[] preComps = original.getDefinedComponents();
		DataTypeComponent[] postComps = copy.getDefinedComponents();
		if (preComps.length != postComps.length) {
			return; // fail
		}
		for (int index = 0; index < preComps.length; index++) {
			DataTypeComponent preDTC = preComps[index];
			DataTypeComponent postDTC = postComps[index];
			if (preDTC.getOffset() != postDTC.getOffset() ||
				preDTC.getLength() != postDTC.getLength() ||
				preDTC.isBitFieldComponent() != postDTC.isBitFieldComponent()) {
				return;  // fail
			}
			if (preDTC.isBitFieldComponent()) {
				BitFieldDataType preBFDT = (BitFieldDataType) preDTC.getDataType();
				BitFieldDataType postBFDT = (BitFieldDataType) postDTC.getDataType();
				if (preBFDT.getBitOffset() != postBFDT.getBitOffset() ||
					preBFDT.getBitSize() != postBFDT.getBitSize()) {
					return;  // fail
				}
			}
		}

		original.setToDefaultPacking();
	}
Returns a value specified in a {@link Language} definition via a
<pre>&lt;external_name tool="<b>name</b>" name="<b>value</b>"/&gt;</pre>
entry.

@param lang {@link Language} to query
@param name name of the value
@return String value
@throws IOException
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/DWARFUtil.java